"use strict"; /** * Model: Users */ const utils = require(`../utils`); const db = require(`./db`); /** * Register user * @param {string} user.email User email * @param {string} user.password User password */ const register = async (user = {}) => { if (!user.email) { throw new Error(`"email" is required`); } if (!user.password) { throw new Error(`"password" is required`); } if (!utils.validateEmailAddress(user.email)) { throw new Error(`"${user.email}" is not a valid email address`); } // Check if user is already registered const existingUser = await getByEmail(user.email); if (existingUser) { throw new Error(`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 */ const getByEmail = async (email) => { if (!email) { throw new Error(`"email" is required`); } if (!utils.validateEmailAddress(email)) { throw new Error(`"${email}" is not a valid email address`); } 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) => { if (!id) { throw new Error(`"id" is required`); } 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 = { register, getByEmail, getById, convertToPublicFormat, };