Skip to content

Instantly share code, notes, and snippets.

@dualcnhq
Last active August 17, 2017 01:17
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dualcnhq/8e7bb6623fc6eefeda8ccd78b19653bf to your computer and use it in GitHub Desktop.
Save dualcnhq/8e7bb6623fc6eefeda8ccd78b19653bf to your computer and use it in GitHub Desktop.
Sample API gist using Serverless framework

User Class

'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

Sample test case

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();
  });
});

handler function

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;
  }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment