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