diff --git a/api/models/db.js b/api/models/db.js new file mode 100644 index 0000000..a2ab596 --- /dev/null +++ b/api/models/db.js @@ -0,0 +1,55 @@ +const AWS = require(`aws-sdk`); +const shortid = require(`shortid`); + +const dynamodb = new AWS.DynamoDB.DocumentClient({ + region: process.env.AWS_REGION +}); + +const defaultParams = { + TableName: process.env.db, +}; + +const put = async (kind, item) => { + const params = { + ...defaultParams, + Item: { + ...item, + sk: kind, + sk2: shortid.generate(), + createdAt: Date.now(), + updatedAt: Date.now(), + } + }; + + await dynamodb.put(params).promise(); +}; + +const getByKey = async (key) => { + const params = { + ...defaultParams, + KeyConditionExpression: `hk = :hk`, + ExpressionAttributeValues: { ':hk': key } + }; + + return await dynamodb.query(params).promise(); +}; + +const getById = async (type, id) => { + const params = { + ...defaultParams, + IndexName: process.env.dbIndex1, + KeyConditionExpression: `sk2 = :sk2 and sk = :sk`, + ExpressionAttributeValues: { + ':sk2': id, + ':sk': type, + } + }; + + return await dynamodb.query(params).promise(); +}; + +module.exports = { + put, + getByKey, + getById, +}; diff --git a/api/models/users.js b/api/models/users.js index ac6f930..a3d83b6 100644 --- a/api/models/users.js +++ b/api/models/users.js @@ -3,13 +3,8 @@ * Model: Users */ -const AWS = require(`aws-sdk`); -const shortid = require(`shortid`); const utils = require(`../utils`); - -const dynamodb = new AWS.DynamoDB.DocumentClient({ - region: process.env.AWS_REGION -}); +const db = require(`./db`); /** * Register user @@ -17,8 +12,6 @@ const dynamodb = new AWS.DynamoDB.DocumentClient({ * @param {string} user.password User password */ const register = async (user = {}) => { - - // Validate if (!user.email) { throw new Error(`"email" is required`); } @@ -37,20 +30,12 @@ const register = async (user = {}) => { user.password = utils.hashPassword(user.password); - // Save - const params = { - TableName: process.env.db, - Item: { + await db.put( + `user`, + { hk: user.email, - sk: `user`, - sk2: shortid.generate(), - createdAt: Date.now(), - updatedAt: Date.now(), password: user.password, - } - }; - - await dynamodb.put(params).promise(); + }).promise(); }; /** @@ -59,8 +44,6 @@ const register = async (user = {}) => { */ const getByEmail = async (email) => { - - // Validate if (!email) { throw new Error(`"email" is required`); } @@ -68,19 +51,11 @@ const getByEmail = async (email) => { throw new Error(`"${email}" is not a valid email address`); } - // Query - const params = { - TableName: process.env.db, - KeyConditionExpression: `hk = :hk`, - ExpressionAttributeValues: { ':hk': email } - }; - - let user = await dynamodb.query(params).promise(); + let user = await db.getByKey(email).promise(); user = user.Items && user.Items[0] ? user.Items[0] : null; if (user) { - user.id = user.sk2; - user.email = user.hk; + user = convertToPublicFormat(user); } return user; }; @@ -91,26 +66,15 @@ const getByEmail = async (email) => { */ const getById = async (id) => { - - // Validate if (!id) { throw new Error(`"id" is required`); } - // Query - const params = { - TableName: process.env.db, - IndexName: process.env.dbIndex1, - KeyConditionExpression: `sk2 = :sk2 and sk = :sk`, - ExpressionAttributeValues: { ':sk2': id, - ':sk': `user` } - }; - let user = await dynamodb.query(params).promise(); + let user = await db.getById(`user`, id).promise(); user = user.Items && user.Items[0] ? user.Items[0] : null; if (user) { - user.id = user.sk2; - user.email = user.hk; + user = convertToPublicFormat(user); } return user; }; diff --git a/api/utils/db.js b/api/utils/db.js deleted file mode 100644 index e69de29..0000000