Use AJV, refactor a lot
This commit is contained in:
88
api/models/users/index.js
Normal file
88
api/models/users/index.js
Normal file
@@ -0,0 +1,88 @@
|
||||
"use strict";
|
||||
/**
|
||||
* Model: Users
|
||||
*/
|
||||
const utils = require(`../../utils`);
|
||||
const db = require(`../db`);
|
||||
const schemas = require(`./schemas`);
|
||||
const sharedSchemas = require(`../schemas`);
|
||||
const validation = require(`../validation`);
|
||||
|
||||
/**
|
||||
* Create a new user
|
||||
* @param {string} user.email User email
|
||||
* @param {string} user.password User password
|
||||
*/
|
||||
const create = async (user = {}) => {
|
||||
validation.validateOrThrow(schemas.create, user);
|
||||
|
||||
const existingUser = await getByEmail(user.email);
|
||||
if (existingUser) {
|
||||
throw utils.customError(
|
||||
`A user with email "${user.email}" is already registered`
|
||||
);
|
||||
}
|
||||
|
||||
user.password = utils.hashPassword(user.password);
|
||||
|
||||
await db.put(`user`, {
|
||||
hk: user.email,
|
||||
password: user.password,
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* Get user by email address
|
||||
* @param {string} email Email address of user to retrieve
|
||||
*/
|
||||
const getByEmail = async (email) => {
|
||||
validation.validateOrThrow(sharedSchemas.email, email);
|
||||
|
||||
let user = await db.getByKey(email);
|
||||
|
||||
user = user.Items && user.Items[0] ? user.Items[0] : null;
|
||||
return user;
|
||||
};
|
||||
|
||||
/**
|
||||
* Get user by id
|
||||
* @param {string} id
|
||||
*/
|
||||
const getById = async (id) => {
|
||||
validation.validateOrThrow(sharedSchemas.id, id);
|
||||
|
||||
let user = await db.getById(`user`, id);
|
||||
|
||||
user = user.Items && user.Items[0] ? user.Items[0] : null;
|
||||
return user;
|
||||
};
|
||||
|
||||
/**
|
||||
* Convert user record to public format
|
||||
* This hides the keys used for the dynamodb's single table design and returns human-readable properties.
|
||||
* @param {*} user
|
||||
*/
|
||||
const convertToPublicFormat = (user = {}) => {
|
||||
user.email = user.hk || null;
|
||||
user.id = user.sk2 || null;
|
||||
if (user.hk) {
|
||||
delete user.hk;
|
||||
}
|
||||
if (user.sk) {
|
||||
delete user.sk;
|
||||
}
|
||||
if (user.sk2) {
|
||||
delete user.sk2;
|
||||
}
|
||||
if (user.password) {
|
||||
delete user.password;
|
||||
}
|
||||
return user;
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
create,
|
||||
getByEmail,
|
||||
getById,
|
||||
convertToPublicFormat,
|
||||
};
|
||||
19
api/models/users/schemas.js
Normal file
19
api/models/users/schemas.js
Normal file
@@ -0,0 +1,19 @@
|
||||
const sharedSchemas = require(`../schemas`);
|
||||
|
||||
module.exports = {
|
||||
"create": {
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"title": "Create User",
|
||||
"description": "An object to create a new user",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"email": sharedSchemas.email,
|
||||
"password": {
|
||||
"type": "string",
|
||||
"minLength": 10,
|
||||
"maxLength": 50
|
||||
}
|
||||
},
|
||||
"required": ["email", "password"]
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user