Files
ETAApi/v1/src/lib/Handlers/Account/index.js

131 lines
3.8 KiB
JavaScript

'user strict';
const { ROOT_PATH, API_CONFIG, MODELS_PATH, LIB_PATH } = process.env;
const { getModel } = require( `${ROOT_PATH}/${MODELS_PATH}` );
const apiConfig = require( `${ROOT_PATH}/${API_CONFIG}` );
const { toSha256 } = require( `${ROOT_PATH}/${LIB_PATH}/Misc.js` );
const UserModel = getModel('users');
const companiesModels = getModel('companies');
const pwd_secret = apiConfig.authentication.pwdSecret;
async function create_account( email, password ){
let safe_password = toSha256( password + pwd_secret );
const user = new UserModel({
email,
password : safe_password,
job_role : 'owner',//Always a new user created from signup is owner
isVerified : true,
has_password : true
});
await user.save();
// Create user code
const id = "" + user._id;
const employee_id = "E-" + id.substring( 0 , 6 );
await UserModel.findByIdAndUpdate( id , {
employee_id
});
}
async function reset_password( email, password ){
let safe_password = toSha256( password + pwd_secret );
const user = await UserModel.findOne({ email });
user.password = safe_password;
user.isVerified = true;
user.has_password = true;
await user.save();
return user;
}
async function already_exists( email ){
const user = await UserModel.findOne( { email } );
if( !user ){
return false;
}else{
return true;
}
}
async function verify_driver_account( email ){
const user = await UserModel.findOne( { email } );
const retVal = {
has_account:false,
isVerified:false,
has_password:false
};
if( !user ){
retVal.has_account = false;
retVal.isVerified = false;
retVal.has_password = false;
}else{
retVal.has_account = true;
retVal.isVerified = user.isVerified;
retVal.has_password = ( !user.password )? false : true;
}
return retVal;
}
async function login( email , password ){
let safe_password = toSha256( password + pwd_secret );
const user = await UserModel.findOne({
email , password : safe_password
},{ password : 0 , session_token : 0 , session_token_exp : 0 }).populate(['company','vehicle']);
return user;
}
async function login_with_session_token( session_token ){
const user = await UserModel.findOne({
session_token,
session_token_exp : { $gte: new Date() }
},{ password : 0 , session_token : 0 , session_token_exp : 0 }).populate(['company','vehicle']);
return user;
}
async function complete_register( userId , data ){
let {
company_type
} = data;
let permissions;
if( company_type.toLowerCase() === "shipper" ){
company_type = "Shipper";
permissions = "role_shipper";
}else if( company_type.toLowerCase() === "carrier" ){
company_type = "Carrier";
permissions = "role_carrier";
}else{
throw "Invalid company type";
}
data.company_type = company_type;
const user = await UserModel.findById( userId , { password : 0 , session_token : 0 , session_token_exp : 0 } );
if( user.company ){
throw "User already register";
}
const company = new companiesModels( data );
/// Generate company.id
await company.save();
/// Use company.id to create company_code
const company_id = "" + company._id;
const company_code = "C-" + company_id.substring( 0 , 6 );
await companiesModels.findByIdAndUpdate( company._id , {
company_code
});
user.company = company;
user.job_role = "owner";
user.permissions = permissions;
user.isVerified = true;
await user.save();
return company;
}
module.exports = { create_account, already_exists, verify_driver_account, login, login_with_session_token, reset_password, complete_register };