method/update.js

/**
 * @module method/update
 */

const admin = require('firebase-admin');
const FieldValue = admin.firestore.FieldValue;

const {has, pick} = require('lodash');
const errorMessages = require('../error/error.json');

const db = admin.firestore();

/**
 * Update a user’s user meta on Firebase
 *
 * @param  {object} user - User object
 * @param  {string} user.uid - Firebase User ID, e.g. hk_wx5555556.
 * @param  {string} user.passwordHash - Hashed password.
 * @param  {boolean} forceSet - True if user should be set instead of updated.
 *
 * @return {userMeta} User’s user meta.
 */
const update = (user, forceSet) => {
  if (forceSet === undefined) {
    forceSet = false;
  }

  const userMeta = pick(user, [
    'borrowerID',
    'branchID',
    'country',
    'failCount',
    'idNumber',
    'passwordHash',
    'hasReloanPhoneNumber',
    'reloanStartTime',
    'appointmentType',
  ]);

  return admin.auth().getUser(user.uid).then((authUser) => {
    if (forceSet) {
      return db.collection('appUserMeta').doc(authUser.uid).set(userMeta)
    }

    return db.collection('appUserMeta').doc(authUser.uid).update(userMeta)
  }).then((result) => {
    console.info('[Success] Updated user meta to database');

    return result;
  }).catch((error) => {
    let response = {
      "code": "unknown",
      "message": "Sorry, there are some issues on our side",
      "details": "Please try again in a few minutes. If it’s still not working, call us at +852 9847 4943."
    };

    if (has(error, 'errorInfo.code')) {
      if (has(errorMessages, error.errorInfo.code)) {
        response = errorMessages[error.errorInfo.code];
      }
    }

    console.error('[Failure] Error updating user meta:', error);

    throw new functions.https.HttpsError(
        response.code,
        response.message,
        response.details
    );
  });
};

module.exports = update;