index.js

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp({
  credential: admin.credential.applicationDefault(),
  databaseURL: "https://good-cash-8824a.firebaseio.com",
});

const userAuth = require('./method');

/**
 * User’s user meta
 *
 * @typedef {Object} userMeta
 *
 * @property {number} borrowerID - Loandisk borrower ID
 * @property {number} branchID - Loandisk branch ID
 * @property {string} country - Country of employment, e.g. HK.
 * @property {string} idNumber - ID number at country of employment, e.g. WX555555(6).
 * @property {string} passwordHash - Hashed password.
 *
 * @example
 * {
 *   "borrowerID": 847714,
 *   "branchID": 8895,
 *   "country": "HK",
 *   "idNumber": "WX555555(6)",
 *   "passwordHash": "GoodCashIsTheBest",
 * }
 */

/**
 * Create a new user on Firebase with borrower creation on Loandisk
 *
 * @function
 *
 * @requires module:method/create
 *
 * @param  {object} user - User object
 * @param  {string} user.uid - Firebase User ID, e.g. hk_wx5555556.
 * @param  {number} user.branchID - Branch ID of target branch where the user belongs to.
 * @param  {string} user.country - Country of employment, e.g. HK.
 * @param  {string} user.idNumber - ID number at country of employment, e.g. WX555555(6).
 * @param  {string} user.passwordHash - Hashed password.
 *
 * @return {userMeta} User’s user meta.
 *
 * @example
 * createUser({
 *   uid: "hk_wx5555556",
 *   branchID: 8895,
 *   country: "HK",
 *   idNumber: "WX555555(6)",
 *   passwordHash: "47fcd521684caf1ffb506e7097747b76e086a30f6f4c1968845fea8cc01ea375",
 * });
 */
exports.createUser = functions.region('asia-east2').https
    .onCall(userAuth.create);

/**
 * Get a user’s user meta from Firebase
 *
 * @function
 *
 * @requires method/get
 *
 * @param  {object} user - User object
 * @param  {string} user.uid - Firebase User ID, e.g. hk_wx5555556.
 *
 * @return {userMeta} User’s user meta.
 *
 * @example
 * getUser({
 *   uid: "hk_wx5555556",
 * });
 */
exports.getUser = functions.region('asia-east2').https
    .onCall(userAuth.get);

/**
 * Update a user’s user meta on Firebase
 *
 * @function
 *
 * @requires method/update
 *
 * @param  {object} user - User object
 * @param  {string} user.uid - Firebase User ID, e.g. hk_wx5555556.
 * @param  {string} user.passwordHash - Hashed password.
 *
 * @return {userMeta} User’s user meta.
 *
 * @example
 * updateUser({
 *   uid: "hk_wx5555556",
 *   passwordHash: "47fcd521684caf1ffb506e7097747b76e086a30f6f4c1968845fea8cc01ea375",
 * });
 */
exports.updateUser = functions.region('asia-east2').https
    .onCall((user) => {
      return userAuth.update(user, false);
    });

/**
 * Validate a user’s log in credentials
 *
 * @function
 *
 * @requires method/validate
 *
 * @param  {object} user - User object
 * @param  {string} user.uid - Firebase User ID, e.g. hk_wx5555556.
 * @param  {string} user.passwordHash - Hashed password.
 *
 * @return {(string|boolean)} User’s Firebase UID if successfully validated, otherwise returns false.
 *
 * @example
 * validateUser({
 *   uid: "hk_wx5555556",
 *   passwordHash: "47fcd521684caf1ffb506e7097747b76e086a30f6f4c1968845fea8cc01ea375"
 * });
 */
exports.validateUser = functions.region('asia-east2').https
    .onCall(userAuth.validate);

/**
 * Generate Firebase user token of a user
 *
 * @function
 *
 * @requires method/generateToken
 *
 * @param  {object} user - User object
 * @param  {string} user.uid - Firebase User ID, e.g. hk_wx5555556.
 *
 * @return {string} User’s JSON web token.
 *
 * @example
 * generateUserToken({
 *   uid: "hk_wx5555556",
 * });
 */
exports.generateUserToken = functions.region('asia-east2').https
    .onCall(userAuth.generateToken);

/**
 * Get minimum application version code from Firebase
 *
 * @function
 *
 * @requires method/getVersionCode
 *
 * @return {number} App version code.
 *
 * @example
 * getVersionCode({})
 */
exports.getVersionCode = functions.region('asia-east2').https
    .onCall(userAuth.getVersionCode);

/**
 * Check if a Firebase ID has been assigned before
 *
 * @function
 *
 * @requires method/isUser
 *
 * @param  {object} user - User object
 * @param  {string} user.uid - Firebase User ID, e.g. hk_wx5555556.
 *
 * @return {(string|boolean)} Returns boolean, otherwise returns 'legacy' if user is a legacy user
 *
 * @example
 * isUser({
 *   uid: "hk_wx5555556",
 * });
 */
exports.isUser = functions.region('asia-east2').https
    .onCall(userAuth.isUser);

/**
 * Log in a user
 *
 * @function
 *
 * @requires method/validate
 * @requires method/generateToken
 *
 * @param  {object} user - User object
 * @param  {string} user.uid - Firebase User ID, e.g. hk_wx5555556.
 * @param  {string} user.passwordHash - Hashed password.
 *
 * @return {(string|boolean)} User’s JSON web token if successfully validated, otherwise returns false.
 *
 * @example
 * logInUser({
 *   uid: "hk_wx5555556",
 *   passwordHash: "47fcd521684caf1ffb506e7097747b76e086a30f6f4c1968845fea8cc01ea375",
 * });
 */
exports.logInUser = functions.region('asia-east2').https
    .onCall((user) => {
      return userAuth.validate(user).then((userObject) => {
        if (userObject) {
          return userAuth.generateToken(userObject);
        } else {
          throw new Error('Incorrect log in credentials.')
        }
      }).catch((error) => {
        console.error('[Failure] Could not log user in:', error);
        return false;
      });
    });

/**
 * Reset a user’s fail count
 *
 * @function
 *
 * @requires method/setFailCount
 *
 * @param  {object} user - User object
 * @param  {string} user.uid - Firebase User ID, e.g. hk_wx5555556.
 *
 * @return {boolean} Returns true on success.
 *
 * @example
 * // Reset fail count
 * resetFailCount({
 *   uid: "hk_wx5555556",
 * });
 */
exports.resetFailCount = functions.region('asia-east2').https
    .onCall((user) => {
      return userAuth.setFailCount(user, false).then(() => {
        return true;
      });
    });

/**
 * Check if password is resettable
 *
 * @function
 *
 * @requires method/get
 *
 * @param  {object} user - User object
 * @param  {string} user.uid - Firebase User ID, e.g. hk_wx5555556.
 *
 * @return {boolean} Whether is password is now resettable.
 * True if Good Financial team has set passwordResettable to true,
 * False if passwordResettable has remain untouched or the field doesn’t exists.
 *
 * @example
 * isPasswordResettable({
 *   uid: "hk_wx5555556",
 * });
 */
exports.isPasswordResettable = functions.region('asia-east2').https
    .onCall((user) => {
      return userAuth.get(user).then((userMeta) => {
        console.log(userMeta['passwordResettable']);
        return !userMeta['passwordResettable']
          ? false
          : userMeta['passwordResettable'];
      });
    });

/**
 * Reset all test accounts
 *
 * @function
 *
 * @requires method/testControl
 *
 * @param  {object} data - The data object attached to the request
 * @param  {string} data.command - The command to execute
 * @param  {object} data.params - Object with named parameters for the command
 *
 * @return {boolean} Returns true.
 *
 * @example
 * testControl({
 *   command: "resetData"
 * });
 *
 * @example
 * testControl({
 *   command: "unlockReloanAppointment",
 *   params: {
 *     uid: "hk_wx1111114",
 *     appointmentType: "phone"
 *   }
 * });
 */
exports.testControl = functions.region('asia-east2').https
    .onCall(userAuth.testControl);