UNPKG

e-commercee

Version:

This package contains a backend of what would be the logic of a e-commercee software, the architecture used is made in 3 layers

318 lines (281 loc) 10.4 kB
import { FactoryData } from "../../data/FactoryData"; import { Administrator } from "../../shared/entity/Administrator"; import { Client } from "../../shared/entity/Client"; import { User } from "../../shared/entity/User"; import { LogicException } from "../../shared/exceptions/logicexception"; import { ILUser } from "../interfaces/ILUser"; import {randomBytes,pbkdf2Sync } from "crypto"; export class LUser implements ILUser { private static instancia: LUser; private constructor() { } public static getInstance(): LUser { if (!LUser.instancia) { LUser.instancia = new LUser(); } return LUser.instancia; } //Validations************************************ private validateIdCard(idcard: string) { var numbers = /^[0-9]+$/; if (!idcard.trim().match(numbers)) { throw new LogicException("The identity card must have only numbers"); } if (idcard.trim() === "") { throw new LogicException("The identity card cannot be empty"); } } private validateLogin(username: string,password:string) { this.validateUserName(username); if (password.trim() === "") { throw new LogicException("The password cannot be empty"); } } private validateUserName(username: string) { if (username.trim() === "") { throw new LogicException("The username cannot be empty"); } } private async validateAddUser(dtuser:User) { if (dtuser == null) { throw new LogicException("The User is empty "); } if (dtuser.completename.trim() === "") { throw new LogicException("The complete name cannot be empty"); } var passw = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{11,30}$/; if (!dtuser.password.match(passw)) { throw new LogicException("The password must be between 11 to 30 characters which contain at least one numeric digit, one uppercase and one lowercase letter"); } if (dtuser.password.trim() === "") { throw new LogicException("The password cannot be empty"); } if (dtuser instanceof Client) { let client = dtuser as Client; var numbers = /^[0-9]+$/; if (!client.creditcardnumber.trim().match(numbers)) { throw new LogicException("The credit card number must have only numbers"); } if (client.creditcardnumber.trim() === "") { throw new LogicException("The credit card number cannot be empty"); } if (client.shippingaddress.trim() === "") { throw new LogicException("The shipping address cannot be empty"); } } if (dtuser instanceof Administrator) { let admin = dtuser as Administrator; if (admin.position.trim() === "") { throw new LogicException("The position cannot be empty"); } } this.validateIdCard(dtuser.identitycard); this.validateUserName(dtuser.username); let idcardsearch = await this.getUser(dtuser.identitycard); if (idcardsearch != null) { throw new LogicException("That User already exists in the system"); } let usernamesearch = await this.getUserByusername(dtuser.username); if (usernamesearch != null) { throw new LogicException("That User Name already exists in the system"); } } private async validateUpdateUser(dtuser:User) { if (dtuser == null) { throw new LogicException("The User is empty "); } if (dtuser.completename.trim() === "") { throw new LogicException("The complete name cannot be empty"); } var passw = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{11,30}$/; if (!dtuser.password.match(passw)) { throw new LogicException("The password must be between 11 to 30 characters which contain at least one numeric digit, one uppercase and one lowercase letter"); } if (dtuser.password.trim() === "") { throw new LogicException("The password cannot be empty"); } if (dtuser instanceof Client) { let client = dtuser as Client; var numbers = /^[0-9]+$/; if (!client.creditcardnumber.trim().match(numbers)) { throw new LogicException("The credit card number must have only numbers"); } if (client.creditcardnumber.trim() === "") { throw new LogicException("The credit card number cannot be empty"); } if (client.shippingaddress.trim() === "") { throw new LogicException("The shipping address cannot be empty"); } } if (dtuser instanceof Administrator) { let admin = dtuser as Administrator; if (admin.position.trim() === "") { throw new LogicException("The position cannot be empty"); } } this.validateIdCard(dtuser.identitycard); let idcardsearch = await this.getUser(dtuser.identitycard); if (idcardsearch == null) { throw new LogicException("That User does not exists in the system"); } } private async validateDeleteUser(dtuser:User) { if (dtuser == null) { throw new LogicException("The User is empty "); } this.validateIdCard(dtuser.identitycard); let sobjcli = await this.getUser(dtuser.identitycard); if (sobjcli == null) { throw new LogicException("That User does not exists in the system"); } } //********************************************** */ //USER public async getUser(idcard: string) { this.validateIdCard(idcard); var suser: User; suser = await FactoryData.getDClient().getClient(idcard); if (suser == null) { suser = await FactoryData.getDAdmin().getAdmin(idcard); } return suser } public async getUserByusername(username: string) { this.validateUserName(username); var suser: User; suser = await FactoryData.getDClient().getClientbyusername(username); if (suser == null) { suser = await FactoryData.getDAdmin().getAdminbyusername(username); } return suser; } public async addUser(dtuser: User) { await this.validateAddUser(dtuser); const passh=await this.hashPassword(dtuser.password); dtuser.password=passh.hash; dtuser.salt=passh.salt; if (dtuser instanceof Client) { FactoryData.getDClient().addClient(dtuser); } if (dtuser instanceof Administrator) { FactoryData.getDAdmin().addAdmin(dtuser); } } public async updateUser(dtuser: User) { await this.validateUpdateUser(dtuser); const passh=await this.hashPassword(dtuser.password); dtuser.password=passh.hash; dtuser.salt=passh.salt; if (dtuser instanceof Client) { FactoryData.getDClient().updateClient(dtuser); } if (dtuser instanceof Administrator) { FactoryData.getDAdmin().updateAdmin(dtuser); } } public async deleteUser(dtuser: User) { await this.validateDeleteUser(dtuser); if (dtuser instanceof Client) { FactoryData.getDClient().deleteClient(dtuser); } if (dtuser instanceof Administrator) { FactoryData.getDAdmin().deleteAdmin(dtuser); } } public async getClients() { var list = await FactoryData.getDClient().getClients(); return list; } public async getAdmins() { var list = await FactoryData.getDAdmin().getAdmins(); return list; } //************************************************ */ public hashPassword(password) { let salt = randomBytes(16).toString('hex'); let hash = pbkdf2Sync(password, salt, 1000, 64, `sha512`).toString(`hex`); return {hash,salt} } public verifyPassword(password,hashPassword,salt) { var hash = pbkdf2Sync(password,salt, 1000, 64, `sha512`).toString(`hex`); return hashPassword === hash; } //*************************************** */ //AUTH private _loginuserobj = null; get loginuserobj() { return this._loginuserobj } set loginuserobj(value) { this._loginuserobj=value; } public async loginUser(username:string,password:string) { this.validateLogin(username,password); const getuseruname=await this.getUserByusername(username); if(getuseruname==null) { throw new LogicException("That User does not exists in the system"); } const verifyp=await this.verifyPassword(password,getuseruname.password,getuseruname.salt); if(verifyp===false) { throw new LogicException("Wrong password"); } this.loginuserobj=getuseruname; return getuseruname; } public getLoginUser() { let lguser=this.loginuserobj; if(lguser==null) { return null; } else { return lguser; } } public logout() { let lguser=this.loginuserobj; if(lguser!=null) { this.loginuserobj=null; return true; } else { return false; } } }