Files
forgetmenot-django/api/models/users/index.js
2020-11-18 21:02:16 -06:00

89 lines
1.8 KiB
JavaScript

"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,
};