'use strict'
const axios = require('axios')
const uuid = require('uuid')
const moment = require('moment')
const dyno = require('dyno')
const pass = require('bcryptjs')
class User {
constructor (db) {
this.db = db
}
// CRUD
insert (params) {
const db_params = {
Item: {
id: uuid.v1(),
first_name: params.first_name,
last_name: params.last_name,
email: params.email,
address: {
street: params.address.street,
city: params.address.city
},
campaign_id: process.env.campaign_id,
gender: params.gender,
birthday: params.birthday,
mobile_number: params.mobile_number,
card_numbers: dyno.createSet(params.card_numbers),
captcha_response: params.captcha_response,
date_created: moment().format('MM/DD/YYYY hh:mma'),
date_updated: 0,
last_login: 0
}
}
return new Promise((resolve, reject) => {
return this.hashPassword(params.password).then((hash) => {
db_params.Item.password = hash
this.db.putItem(db_params, (err, data) => {
if (err) reject(err)
else resolve(db_params.Item)
})
})
})
}
create (params) {
return new Promise((resolve, reject) => {
return this.checkEmail(params.email, null).then((data) => {
return this.verifyCaptcha(params.captcha_response).then((response) => {
if (response.data.success) {
return this.insert(params);
} else reject(response.data['error-codes'])
}).catch((err) => { reject(err) })
}).catch((err) => { reject(err) })
})
}
get (id) {
const db_params = {
Key: { id: id }
};
return new Promise((resolve, reject) => {
this.db.getItem(db_params, (err, data) => {
if (err) reject(err)
else resolve(data.Item)
})
})
}
update (id, params) {
const db_params = {
Item: {
id: id,
first_name: params.first_name,
last_name: params.last_name,
email: params.email,
password: params.password,
address: {
street: params.address.street,
city: params.address.city
},
gender: params.gender,
birthday: params.birthday,
mobile_number: params.mobile_number,
campaign_id: params.campaign_id,
card_numbers: dyno.createSet(params.card_numbers),
date_created: params.date_created,
date_updated: moment().format('MM/DD/YYYY hh:mma'),
last_login: params.last_login
}
};
return new Promise((resolve, reject) => {
this.get(id).then((data) => {
if (data === undefined) return reject('No user_id exists')
if (data.id === id) {
this.checkEmail(params.email, id).then((data) => {
this.hashPassword(params.password).then((hash) => {
db_params.Item.password = hash;
this.db.putItem(db_params, (err, data) => {
if (err) reject(err)
else resolve(db_params.Item)
})
})
})
}
}).catch((err) => { reject(err) })
})
}
delete (id) {
const db_params = {
Key: { id: id }
}
return new Promise((resolve, reject) => {
this.get(id).then((data) => {
if (data === undefined) return reject('No user_id exists')
if (data.id === id) {
this.db.deleteItem(db_params, (err) => {
if (err) reject(err)
else resolve('User deleted')
});
}
}).catch((err) => { reject(err) })
})
}
}
module.exports = User
test('[users] create new user ', function(assert) {
const db_params = {
first_name: "John",
last_name: "Doe",
email: "johndoe@gmail.com",
password: "johndoe",
address: {
street: "123 Garfield St.",
city: "Manila"
},
gender: "Male",
birthday: "11/01/1990",
mobile_number: "09171234567",
card_numbers: "[000000-123454512]",
captcha_response: "12dsauhsdffa8shfausdf"
};
user.insert(db_params).then((data) => {
user_id = data.id;
assert.equal(db_params.first_name, data.first_name, 'saved user first_name')
assert.equal(db_params.last_name, data.last_name, 'saved user last_name')
assert.equal(db_params.email, data.email, 'saved user email')
assert.equal(db_params.address.street, data.address.street, 'saved user address street')
assert.equal(db_params.address.city, data.address.city, 'saved user address city')
assert.equal(db_params.birthday, data.birthday, 'saved user birthday')
assert.equal(data.campaign_id, data.campaign_id, 'saved user campaign_id')
assert.equal(db_params.gender, data.gender, 'saved user gender')
assert.equal(db_params.birthday, data.birthday, 'saved user birthday')
assert.equal(db_params.mobile_number, data.mobile_number, 'saved user mobile_number')
assert.deepEqual(Dyno.createSet(db_params.card_numbers), data.card_numbers, 'saved user card_numbers')
pass.compare(db_params.password, data.password, (err, valid) => {
if (err || !valid) assert.throws(() => { throw new Error(err) });
else {
assert.ok('password hashed', 'Return password hashed')
assert.ok('Return db_params.Item', 'User created');
assert.end();
}
});
}).catch((err) => {
assert.throws(() => { throw new Error(err) });
assert.end();
});
});
const User = require('./user_class');
const user = new User(dynamodb);
module.exports.handler = (event, context, cb) => {
let user_params, id;
switch(event.method) {
case "POST":
user_params = event.body;
user.create(user_params).then((data) => {
return cb(null, data);
}).catch((err) => {
return cb(new Error('[400] ' + err));
});
break;
}
}