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