89 lines
1.8 KiB
JavaScript
89 lines
1.8 KiB
JavaScript
/**
|
|
* Model: Users
|
|
*/
|
|
const utils = require(`../../utils`);
|
|
const db = require(`../db`);
|
|
const schemas = require(`./schemas`);
|
|
const commonSchemas = require(`../../validation/commonSchemas`);
|
|
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`,
|
|
400
|
|
);
|
|
}
|
|
|
|
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(commonSchemas.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(commonSchemas.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,
|
|
};
|