From bc4d1253fb28e05eb6a703e60a3f20956db9811d Mon Sep 17 00:00:00 2001 From: Narul Hidayah Date: Mon, 5 Jan 2026 16:46:08 +0700 Subject: [PATCH 1/3] shitf auth --- src/controllers/auth.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controllers/auth.ts b/src/controllers/auth.ts index d9afedb..a90182e 100644 --- a/src/controllers/auth.ts +++ b/src/controllers/auth.ts @@ -47,7 +47,7 @@ export class AuthController { const userRefreshTokenRepository = OrmHelper.DB.getRepository(UserRefreshToken) const user = await userRepository.findOne({ - relations: ["roles", "roles.application", "employee", "employee.department", "employee.position","employee.airport"], + relations: ["roles", "roles.application", "employee", "employee.department", "employee.position","employee.airport","employee.shift"], select: ["id", "email", "name", "password", "username", "roles"], where: { username: param.username }, }) From da91ba1376d4acfa3de282d2066832a7f2b30f50 Mon Sep 17 00:00:00 2001 From: Narul Hidayah Date: Mon, 5 Jan 2026 20:01:34 +0700 Subject: [PATCH 2/3] update --- src/controllers/user.ts | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/src/controllers/user.ts b/src/controllers/user.ts index 6b5902c..f0bdfe6 100644 --- a/src/controllers/user.ts +++ b/src/controllers/user.ts @@ -687,26 +687,25 @@ export class UserController { const userRepository = OrmHelper.DB.getRepository(User) const detail = await userRepository.findOne({ - relations: ["roles", "roles.application"], + relations: [ + "roles", + "roles.application", + "employee", + "employee.department", + "employee.position", + "employee.airport", + "employee.shift", + "employee.nationality", + "employee.aldeia", + "employee.suco", + "employee.administrativu", + "employee.munisipo" + ], where: { id: param.id }, }) - var hrms = { - uuid: null, - idx: null, - nik: null, - name: null, - title: null, - department_id: null, - departement_uuid: null, - department_name: null, - level_id: null, - level_name: null, - } - const data = { ...detail, - hrms, } if (data != null) { From ceedd96efcde676e2b99c9cf250137d0b0b4bf36 Mon Sep 17 00:00:00 2001 From: "fazri.is" Date: Tue, 6 Jan 2026 02:15:01 +0700 Subject: [PATCH 3/3] update --- src/controllers/user.ts | 1187 +++++++++++++++++++++++++-------------- 1 file changed, 750 insertions(+), 437 deletions(-) diff --git a/src/controllers/user.ts b/src/controllers/user.ts index f0bdfe6..2470a27 100644 --- a/src/controllers/user.ts +++ b/src/controllers/user.ts @@ -1,21 +1,28 @@ -import axios from "axios" -import config from "config" -import { HrmsEmployee, Paging, User, UserRefreshToken, UserRole } from "entity" -import exceljs from "exceljs" -import { NextFunction, Response } from "express" -import { Request } from "express-jwt" -import Joi from "joi" -import { ILogObj, Logger } from "tslog" -import CommonHelper from "../helpers/common" -import { ReturnHelper } from "../helpers/express/return" -import { OrmHelper } from "../helpers/orm" -import { Language } from "../langs/lang" +import axios from "axios"; +import config from "config"; +import { HrmsEmployee, Paging, User, UserRefreshToken, UserRole } from "entity"; +import exceljs from "exceljs"; +import { NextFunction, Response } from "express"; +import { Request } from "express-jwt"; +import Joi from "joi"; +import { ILogObj, Logger } from "tslog"; +import CommonHelper from "../helpers/common"; +import { ReturnHelper } from "../helpers/express/return"; +import { OrmHelper } from "../helpers/orm"; +import { Language } from "../langs/lang"; -const log: Logger = new Logger({ name: "[UserController]", type: "pretty" }) +const log: Logger = new Logger({ + name: "[UserController]", + type: "pretty", +}); export class UserController { - static async list(req: Request, res: Response, next: NextFunction): Promise { - /* + static async list( + req: Request, + res: Response, + next: NextFunction + ): Promise { + /* #swagger.tags = ['User'] #swagger.parameters['filter'] = { description: 'Filter with 2 format :
  • Simple format use text plaint will filter eq:email or like %name% or like %username%
  • Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}
', @@ -51,90 +58,113 @@ export class UserController { } */ - try { - const schema = Joi.object().keys({ - filter: Joi.any().allow("").optional().label("Filter"), - page: Joi.number().required().min(1).label("Page"), - limit: Joi.number().required().min(1).label("Limit"), - with_deleted: Joi.bool().required().label("With Deleted"), - order_field: Joi.string().required().label("Order Field"), - order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"), - }) + try { + const schema = Joi.object().keys({ + filter: Joi.any().allow("").optional().label("Filter"), + page: Joi.number().required().min(1).label("Page"), + limit: Joi.number().required().min(1).label("Limit"), + with_deleted: Joi.bool().required().label("With Deleted"), + order_field: Joi.string().required().label("Order Field"), + order_direction: Joi.string() + .allow("asc", "desc") + .required() + .label("Order Direction"), + }); - const param: Paging = await schema.validateAsync(req.query) + const param: Paging = await schema.validateAsync(req.query); - const userRepository = OrmHelper.DB.getRepository(User) + const userRepository = OrmHelper.DB.getRepository(User); - const offset = (param.page - 1) * param.limit + const offset = (param.page - 1) * param.limit; - const { whereAttr, whereVal } = CommonHelper.handleFilter({ - filter: param.filter, - col_any_eq: ["email"], - col_any_like: ["User.name", "User.username"], - }) + const { whereAttr, whereVal } = CommonHelper.handleFilter({ + filter: param.filter, + col_any_eq: ["email"], + col_any_like: ["User.name", "User.username"], + }); - const res_count = userRepository.createQueryBuilder().where(whereAttr, whereVal) + const res_count = userRepository + .createQueryBuilder() + .where(whereAttr, whereVal); - const subquery = userRepository - .createQueryBuilder("User") - .select("User.id", "id") - .where(whereAttr, whereVal) - .orderBy("User." + param.order_field, param.order_direction) - .offset(offset) - .limit(param.limit) + const subquery = userRepository + .createQueryBuilder("User") + .select("User.id", "id") + .where(whereAttr, whereVal) + .orderBy("User." + param.order_field, param.order_direction) + .offset(offset) + .limit(param.limit); - const res_list = userRepository - .createQueryBuilder("User") - .innerJoin("(" + subquery.getQuery() + ")", "sub", "User.id = sub.id") - .setParameters(subquery.getParameters()) - .leftJoinAndSelect("User.roles", "roles") - .leftJoinAndSelect("roles.application", "application") - .orderBy("User." + param.order_field, param.order_direction) + const res_list = userRepository + .createQueryBuilder("User") + .innerJoin("(" + subquery.getQuery() + ")", "sub", "User.id = sub.id") + .setParameters(subquery.getParameters()) + .leftJoinAndSelect("User.roles", "roles") + .leftJoinAndSelect("roles.application", "application") + .orderBy("User." + param.order_field, param.order_direction); - // const subquery = userRepository - // .createQueryBuilder() - // .select("User.id") - // .where(whereAttr, whereVal) - // .orderBy("User." + param.order_field, param.order_direction) - // .offset(offset) - // .limit(param.limit); + // const subquery = userRepository + // .createQueryBuilder() + // .select("User.id") + // .where(whereAttr, whereVal) + // .orderBy("User." + param.order_field, param.order_direction) + // .offset(offset) + // .limit(param.limit); - // const res_list = userRepository - // .createQueryBuilder() - // .where(`User.id IN (${subquery.getQuery()})`) - // .setParameters(subquery.getParameters()) - // .leftJoinAndSelect("User.roles", "roles") - // .leftJoinAndSelect("roles.application", "application"); + // const res_list = userRepository + // .createQueryBuilder() + // .where(`User.id IN (${subquery.getQuery()})`) + // .setParameters(subquery.getParameters()) + // .leftJoinAndSelect("User.roles", "roles") + // .leftJoinAndSelect("roles.application", "application"); - // const res_list = userRepository.createQueryBuilder() - // .where(whereAttr, whereVal) - // .leftJoinAndSelect("User.roles", "roles") - // .leftJoinAndSelect("roles.application", "application") - // .orderBy(param.order_field, param.order_direction) - // .offset(offset) - // .limit(param.limit); + // const res_list = userRepository.createQueryBuilder() + // .where(whereAttr, whereVal) + // .leftJoinAndSelect("User.roles", "roles") + // .leftJoinAndSelect("roles.application", "application") + // .orderBy(param.order_field, param.order_direction) + // .offset(offset) + // .limit(param.limit); - if (param.with_deleted) { - res_count.withDeleted() - res_list.withDeleted() - } + if (param.with_deleted) { + res_count.withDeleted(); + res_list.withDeleted(); + } - const current_page = param.page - const total_count_data = await res_count.getCount() - const list_data = await res_list.getMany() - const count_data = CommonHelper.countObject(list_data) + const current_page = param.page; + const total_count_data = await res_count.getCount(); + const list_data = await res_list.getMany(); + const count_data = CommonHelper.countObject(list_data); - return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data) - } catch (e: unknown) { - log.error(e) - const err = e as Error + return ReturnHelper.successResponselist( + res, + 200, + Language.lang.success_view, + count_data, + current_page, + total_count_data, + list_data + ); + } catch (e: unknown) { + log.error(e); + const err = e as Error; - return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message) - } - } + return ReturnHelper.errorResponse( + res, + 400, + 401, + Language.lang.failed_view, + err.message + ); + } + } - static async export(req: Request, res: Response, next: NextFunction): Promise { - /* + static async export( + req: Request, + res: Response, + next: NextFunction + ): Promise { + /* #swagger.tags = ['User'] #swagger.parameters['filter'] = { description: 'Filter with 2 format :
  • Simple format use text plaint will filter eq:email or like %name% or like %username%
  • Advance format using field existing {status:\'Y\', any:\'SAME AS PLAINT LOGIC\', etc...}
', @@ -159,70 +189,104 @@ export class UserController { } */ - try { - const schema = Joi.object().keys({ - filter: Joi.array().allow("").optional().label("Filter"), - order_field: Joi.string().required().label("Order Field"), - order_direction: Joi.string().allow("asc", "desc").required().label("Order Direction"), - }) + try { + const schema = Joi.object().keys({ + filter: Joi.array().allow("").optional().label("Filter"), + order_field: Joi.string().required().label("Order Field"), + order_direction: Joi.string() + .allow("asc", "desc") + .required() + .label("Order Direction"), + }); - const param: Paging = await schema.validateAsync(req.query) + const param: Paging = await schema.validateAsync(req.query); - const userRepository = OrmHelper.DB.getRepository(User) + const userRepository = OrmHelper.DB.getRepository(User); - const { whereAttr, whereVal } = CommonHelper.handleFilter({ - filter: param.filter, - col_any_eq: ["email"], - col_any_like: ["name", "username"], - }) + const { whereAttr, whereVal } = CommonHelper.handleFilter({ + filter: param.filter, + col_any_eq: ["email"], + col_any_like: ["name", "username"], + }); - const filename = "user.xlsx" + const filename = "user.xlsx"; - res.setHeader("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") - res.setHeader("Content-Disposition", "attachment; filename=" + filename) + res.setHeader( + "Content-Type", + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" + ); + res.setHeader("Content-Disposition", "attachment; filename=" + filename); - const workbook = new exceljs.stream.xlsx.WorkbookWriter({ stream: res }) - const sheet = workbook.addWorksheet("Data") + const workbook = new exceljs.stream.xlsx.WorkbookWriter({ stream: res }); + const sheet = workbook.addWorksheet("Data"); - sheet.columns = [ - { header: "ID", key: "id", width: 10 }, - { header: "Name", key: "name", width: 20 }, - { header: "Email", key: "email", width: 20 }, - { header: "Username", key: "username", width: 20 }, - { header: "Status", key: "status", width: 10 }, - { header: "Created At", key: "created_at", width: 15 }, - { header: "Roles", key: "role_name", width: 15 }, - { header: "Application", key: "application", width: 15 }, - ] + sheet.columns = [ + { header: "ID", key: "id", width: 10 }, + { header: "Name", key: "name", width: 20 }, + { header: "Email", key: "email", width: 20 }, + { header: "Username", key: "username", width: 20 }, + { header: "Status", key: "status", width: 10 }, + { header: "Created At", key: "created_at", width: 15 }, + { header: "Roles", key: "role_name", width: 15 }, + { header: "Application", key: "application", width: 15 }, + ]; - const limit = 50 + const limit = 50; - const fetchAndWrite = async (page: any) => { - const offset = (page - 1) * limit + const fetchAndWrite = async (page: any) => { + const offset = (page - 1) * limit; - const data = await userRepository.createQueryBuilder().where(whereAttr, whereVal).select(["User.id as id", "User.name as name", "User.email as email", "User.username as username", "User.status as status", "User.created_at as created_at", "roles.name as role_name", "application.id as application"]).leftJoin("User.roles", "roles").leftJoin("roles.application", "application").orderBy(param.order_field, param.order_direction).offset(offset).limit(limit).getRawMany() + const data = await userRepository + .createQueryBuilder() + .where(whereAttr, whereVal) + .select([ + "User.id as id", + "User.name as name", + "User.email as email", + "User.username as username", + "User.status as status", + "User.created_at as created_at", + "roles.name as role_name", + "application.id as application", + ]) + .leftJoin("User.roles", "roles") + .leftJoin("roles.application", "application") + .orderBy(param.order_field, param.order_direction) + .offset(offset) + .limit(limit) + .getRawMany(); - data.forEach((item: any) => sheet.addRow(item).commit()) + data.forEach((item: any) => sheet.addRow(item).commit()); - if (CommonHelper.countObject(data) == limit) { - fetchAndWrite(page + 1) - } else { - sheet.commit() - workbook.commit() - } - } + if (CommonHelper.countObject(data) == limit) { + fetchAndWrite(page + 1); + } else { + sheet.commit(); + workbook.commit(); + } + }; - fetchAndWrite(1) - } catch (e: unknown) { - log.error(e) - const err = e as Error + fetchAndWrite(1); + } catch (e: unknown) { + log.error(e); + const err = e as Error; - return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_view, err.message) - } - } + return ReturnHelper.errorResponse( + res, + 400, + 401, + Language.lang.failed_view, + err.message + ); + } + } - static async create(req: Request, res: Response, next: NextFunction): Promise { - /* + static async create( + req: Request, + res: Response, + next: NextFunction + ): Promise { + /* #swagger.tags = ['User'] #swagger.security = [{ "bearerAuth": [] @@ -240,48 +304,78 @@ export class UserController { } */ - try { - const schema = Joi.object().keys({ - email: Joi.string().email().max(64).required().label("Email"), - username: Joi.string().max(64).required().label("Username"), - password: Joi.string().pattern(new RegExp("^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$")).min(8).required().label("Password"), - retype_password: Joi.ref("password"), - name: Joi.string().max(64).required().label("Name"), - employee_id: Joi.string().uuid().optional().allow("").label("Employee ID"), - status: Joi.string().required().label("Status"), - }) + try { + const schema = Joi.object().keys({ + email: Joi.string().email().max(64).required().label("Email"), + username: Joi.string().max(64).required().label("Username"), + password: Joi.string() + .pattern( + new RegExp( + "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$" + ) + ) + .min(8) + .required() + .label("Password"), + retype_password: Joi.ref("password"), + name: Joi.string().max(64).required().label("Name"), + employee_id: Joi.string() + .uuid() + .optional() + .allow("") + .label("Employee ID"), + status: Joi.string().required().label("Status"), + }); - const param: any = await schema.validateAsync(req.body) + const param: any = await schema.validateAsync(req.body); - const data = new User() - data.name = param.name - data.username = param.username - data.password = param.password - data.email = param.email - data.status = param.status + const data = new User(); + data.name = param.name; + data.username = param.username; + data.password = param.password; + data.email = param.email; + data.status = param.status; + data.created_by = req.auth.data.name; - if (param.employee_id && param.employee_id != "") { - const employee = await OrmHelper.DB.manager.getRepository(HrmsEmployee).findOneByOrFail({ id: param.employee_id }) - data.employee = employee - } else { - data.employee = null - } + if (param.employee_id && param.employee_id != "") { + const employee = await OrmHelper.DB.manager + .getRepository(HrmsEmployee) + .findOneByOrFail({ id: param.employee_id }); + data.employee = employee; + } else { + data.employee = null; + } - data.hashPassword() + data.hashPassword(); - await OrmHelper.DB.manager.save(data) + await OrmHelper.DB.manager.save(data); - return ReturnHelper.successResponseAny(res, 200, Language.lang.success_insert, data) - } catch (e: unknown) { - log.error(e) - const err = e as Error + return ReturnHelper.successResponseAny( + res, + 200, + Language.lang.success_insert, + data + ); + } catch (e: unknown) { + log.error(e); + const err = e as Error; - return ReturnHelper.errorResponse(res, 500, 401, Language.lang.failed_insert, err.message) - } - } + return ReturnHelper.errorResponse( + res, + 500, + 401, + Language.lang.failed_insert, + err.message + ); + } + } - static async addRole(req: Request, res: Response, next: NextFunction): Promise { - /* + static async addRole( + req: Request, + res: Response, + next: NextFunction + ): Promise { + /* #swagger.tags = ['User'] #swagger.security = [{ "bearerAuth": [] @@ -302,66 +396,102 @@ export class UserController { } */ - try { - const schema = Joi.object().keys({ - id: Joi.string().uuid().required().label("ID"), - id_role: Joi.string().uuid().required().label("ID"), - }) + try { + const schema = Joi.object().keys({ + id: Joi.string().uuid().required().label("ID"), + id_role: Joi.string().uuid().required().label("ID"), + }); - const param: { id: string; id_role: string } = await schema.validateAsync(req.params) + const param: { id: string; id_role: string } = await schema.validateAsync( + req.params + ); - const userRepository = OrmHelper.DB.getRepository(User) - const repo_role = OrmHelper.DB.getRepository(UserRole) + const userRepository = OrmHelper.DB.getRepository(User); + const repo_role = OrmHelper.DB.getRepository(UserRole); - const data = await userRepository.findOne({ - relations: ["roles", "roles.application"], - where: { id: param.id }, - }) + const data = await userRepository.findOne({ + relations: ["roles", "roles.application"], + where: { id: param.id }, + }); - if (data != null) { - // const new_role = await repo_role.findOneBy({ id: param.id_role }); - const new_role = await repo_role.findOne({ - relations: { - application: true, - }, - where: { id: param.id_role }, - }) + if (data != null) { + // const new_role = await repo_role.findOneBy({ id: param.id_role }); + const new_role = await repo_role.findOne({ + relations: { + application: true, + }, + where: { id: param.id_role }, + }); - if (data.roles) { - for (let r of data.roles) { - if (r.id == param.id_role) { - //already added - return ReturnHelper.errorResponse(res, 409, 401, Language.lang.failed_insert + ", roles already exists ", "") - } + if (data.roles) { + for (let r of data.roles) { + if (r.id == param.id_role) { + //already added + return ReturnHelper.errorResponse( + res, + 409, + 401, + Language.lang.failed_insert + ", roles already exists ", + "" + ); + } - if (r.application.id == new_role.application.id) { - return ReturnHelper.errorResponse(res, 409, 402, Language.lang.failed_insert + ", roles in this application already exists ", "") - } - } - } + if (r.application.id == new_role.application.id) { + return ReturnHelper.errorResponse( + res, + 409, + 402, + Language.lang.failed_insert + + ", roles in this application already exists ", + "" + ); + } + } + } - if (!data.roles) { - data.roles = [] - } + if (!data.roles) { + data.roles = []; + } - data.roles.push(new_role) + data.roles.push(new_role); - await userRepository.save(data) + await userRepository.save(data); - return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data) - } else { - return ReturnHelper.errorResponse(res, 404, 403, Language.lang.failed_not_found, "") - } - } catch (e: unknown) { - log.error(e) - const err = e as Error + return ReturnHelper.successResponseAny( + res, + 200, + Language.lang.success_update, + data + ); + } else { + return ReturnHelper.errorResponse( + res, + 404, + 403, + Language.lang.failed_not_found, + "" + ); + } + } catch (e: unknown) { + log.error(e); + const err = e as Error; - return ReturnHelper.errorResponse(res, 500, 404, Language.lang.failed_update, err.message) - } - } + return ReturnHelper.errorResponse( + res, + 500, + 404, + Language.lang.failed_update, + err.message + ); + } + } - static async deleteRole(req: Request, res: Response, next: NextFunction): Promise { - /* + static async deleteRole( + req: Request, + res: Response, + next: NextFunction + ): Promise { + /* #swagger.tags = ['User'] #swagger.security = [{ "bearerAuth": [] @@ -382,57 +512,86 @@ export class UserController { } */ - try { - const schema = Joi.object().keys({ - id: Joi.string().uuid().required().label("ID"), - id_role: Joi.string().uuid().required().label("ID"), - }) + try { + const schema = Joi.object().keys({ + id: Joi.string().uuid().required().label("ID"), + id_role: Joi.string().uuid().required().label("ID"), + }); - const param: { id: string; id_role: string } = await schema.validateAsync(req.params) + const param: { id: string; id_role: string } = await schema.validateAsync( + req.params + ); - const userRepository = OrmHelper.DB.getRepository(User) + const userRepository = OrmHelper.DB.getRepository(User); - const data = await userRepository.findOne({ - relations: { - roles: true, - }, - where: { id: param.id }, - }) + const data = await userRepository.findOne({ + relations: { + roles: true, + }, + where: { id: param.id }, + }); - if (data != null && data.roles) { - let found = false - let new_roles: UserRole[] = [] + if (data != null && data.roles) { + let found = false; + let new_roles: UserRole[] = []; - for (let r of data.roles) { - if (r.id != param.id_role) { - new_roles.push(r) - } else if (r.id == param.id_role) { - found = true - } - } + for (let r of data.roles) { + if (r.id != param.id_role) { + new_roles.push(r); + } else if (r.id == param.id_role) { + found = true; + } + } - data.roles = new_roles + data.roles = new_roles; - if (found) { - await userRepository.save(data) + if (found) { + await userRepository.save(data); - return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, data) - } else { - return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found + ", role not found", "") - } - } else { - return ReturnHelper.errorResponse(res, 404, 402, Language.lang.failed_not_found, "") - } - } catch (e: unknown) { - log.error(e) - const err = e as Error + return ReturnHelper.successResponseAny( + res, + 200, + Language.lang.success_delete, + data + ); + } else { + return ReturnHelper.errorResponse( + res, + 404, + 401, + Language.lang.failed_not_found + ", role not found", + "" + ); + } + } else { + return ReturnHelper.errorResponse( + res, + 404, + 402, + Language.lang.failed_not_found, + "" + ); + } + } catch (e: unknown) { + log.error(e); + const err = e as Error; - return ReturnHelper.errorResponse(res, 500, 403, Language.lang.failed_delete, err.message) - } - } + return ReturnHelper.errorResponse( + res, + 500, + 403, + Language.lang.failed_delete, + err.message + ); + } + } - static async updateProfile(req: Request, res: Response, next: NextFunction): Promise { - /* + static async updateProfile( + req: Request, + res: Response, + next: NextFunction + ): Promise { + /* #swagger.tags = ['User'] #swagger.security = [{ "bearerAuth": [] @@ -451,43 +610,65 @@ export class UserController { } */ - try { - const schema = Joi.object().keys({ - id: Joi.string().uuid().required().label("ID"), - email: Joi.string().email().max(64).required().label("Email"), - username: Joi.string().max(64).required().label("Username"), - name: Joi.string().max(64).required().label("Name"), - }) + try { + const schema = Joi.object().keys({ + id: Joi.string().uuid().required().label("ID"), + email: Joi.string().email().max(64).required().label("Email"), + username: Joi.string().max(64).required().label("Username"), + name: Joi.string().max(64).required().label("Name"), + }); - req.body.id = req.auth.data.id + req.body.id = req.auth.data.id; - const param: User = await schema.validateAsync(req.body) + const param: User = await schema.validateAsync(req.body); - const userRepository = OrmHelper.DB.getRepository(User) + const userRepository = OrmHelper.DB.getRepository(User); - const data = await userRepository.findOneBy({ id: param.id }) + const data = await userRepository.findOneBy({ id: param.id }); - if (data != null) { - data.name = param.name - data.username = param.username - data.email = param.email + if (data != null) { + data.name = param.name; + data.username = param.username; + data.email = param.email; + data.updated_by = req.auth.data.name; - await userRepository.save(data) + await userRepository.save(data); - return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data) - } else { - return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "") - } - } catch (e: unknown) { - log.error(e) - const err = e as Error + return ReturnHelper.successResponseAny( + res, + 200, + Language.lang.success_update, + data + ); + } else { + return ReturnHelper.errorResponse( + res, + 404, + 401, + Language.lang.failed_not_found, + "" + ); + } + } catch (e: unknown) { + log.error(e); + const err = e as Error; - return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message) - } - } + return ReturnHelper.errorResponse( + res, + 500, + 402, + Language.lang.failed_update, + err.message + ); + } + } - static async updatePassword(req: Request, res: Response, next: NextFunction): Promise { - /* + static async updatePassword( + req: Request, + res: Response, + next: NextFunction + ): Promise { + /* #swagger.tags = ['User'] #swagger.security = [{ "bearerAuth": [] @@ -506,43 +687,72 @@ export class UserController { } */ - try { - const schema = Joi.object().keys({ - id: Joi.string().uuid().required().label("ID"), - password: Joi.string().pattern(new RegExp("^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$")).min(8).required().label("Password"), - retype_password: Joi.ref("password"), - }) + try { + const schema = Joi.object().keys({ + id: Joi.string().uuid().required().label("ID"), + password: Joi.string() + .pattern( + new RegExp( + "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,}$" + ) + ) + .min(8) + .required() + .label("Password"), + retype_password: Joi.ref("password"), + }); - req.body.id = req.auth.data.id + req.body.id = req.auth.data.id; - const param: User = await schema.validateAsync(req.body) + const param: User = await schema.validateAsync(req.body); - const userRepository = OrmHelper.DB.getRepository(User) + const userRepository = OrmHelper.DB.getRepository(User); - const data = await userRepository.findOneBy({ id: param.id }) + const data = await userRepository.findOneBy({ id: param.id }); - if (data != null) { - if (param.password) { - data.password = param.password - data.hashPassword() - } + if (data != null) { + if (param.password) { + data.password = param.password; + data.hashPassword(); + } - await userRepository.save(data) + await userRepository.save(data); - return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data) - } else { - return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "") - } - } catch (e: unknown) { - log.error(e) - const err = e as Error + return ReturnHelper.successResponseAny( + res, + 200, + Language.lang.success_update, + data + ); + } else { + return ReturnHelper.errorResponse( + res, + 404, + 401, + Language.lang.failed_not_found, + "" + ); + } + } catch (e: unknown) { + log.error(e); + const err = e as Error; - return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message) - } - } + return ReturnHelper.errorResponse( + res, + 500, + 402, + Language.lang.failed_update, + err.message + ); + } + } - static async update(req: Request, res: Response, next: NextFunction): Promise { - /* + static async update( + req: Request, + res: Response, + next: NextFunction + ): Promise { + /* #swagger.tags = ['User'] #swagger.security = [{ "bearerAuth": [] @@ -566,60 +776,88 @@ export class UserController { } */ - try { - const schema = Joi.object().keys({ - id: Joi.string().uuid().required().label("ID"), - email: Joi.string().email().max(64).required().label("Email"), - username: Joi.string().max(64).required().label("Username"), - password: Joi.string().allow("").optional().label("Password"), - retype_password: Joi.ref("password"), - name: Joi.string().max(64).required().label("Name"), - employee_id: Joi.string().uuid().optional().allow("").label("Employee ID"), - status: Joi.string().required().label("Status"), - }) + try { + const schema = Joi.object().keys({ + id: Joi.string().uuid().required().label("ID"), + email: Joi.string().email().max(64).required().label("Email"), + username: Joi.string().max(64).required().label("Username"), + password: Joi.string().allow("").optional().label("Password"), + retype_password: Joi.ref("password"), + name: Joi.string().max(64).required().label("Name"), + employee_id: Joi.string() + .uuid() + .optional() + .allow("") + .label("Employee ID"), + status: Joi.string().required().label("Status"), + }); - req.body.id = req.params["id"] + req.body.id = req.params["id"]; - const param: any = await schema.validateAsync(req.body) + const param: any = await schema.validateAsync(req.body); - const userRepository = OrmHelper.DB.getRepository(User) + const userRepository = OrmHelper.DB.getRepository(User); - const data = await userRepository.findOneBy({ id: param.id }) + const data = await userRepository.findOneBy({ id: param.id }); - if (data != null) { - data.name = param.name - data.username = param.username - data.email = param.email - data.status = param.status + if (data != null) { + data.name = param.name; + data.username = param.username; + data.email = param.email; + data.status = param.status; + data.updated_by = req.auth.data.name; - if (param.employee_id && param.employee_id != "") { - const employee = await OrmHelper.DB.manager.getRepository(HrmsEmployee).findOneByOrFail({ id: param.employee_id }) - data.employee = employee - } else { - data.employee = null - } + if (param.employee_id && param.employee_id != "") { + const employee = await OrmHelper.DB.manager + .getRepository(HrmsEmployee) + .findOneByOrFail({ id: param.employee_id }); + data.employee = employee; + } else { + data.employee = null; + } - if (param.password) { - data.password = param.password - data.hashPassword() - } + if (param.password) { + data.password = param.password; + data.hashPassword(); + } - await userRepository.save(data) + await userRepository.save(data); - return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data) - } else { - return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "") - } - } catch (e: unknown) { - log.error(e) - const err = e as Error + return ReturnHelper.successResponseAny( + res, + 200, + Language.lang.success_update, + data + ); + } else { + return ReturnHelper.errorResponse( + res, + 404, + 401, + Language.lang.failed_not_found, + "" + ); + } + } catch (e: unknown) { + log.error(e); + const err = e as Error; - return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message) - } - } + return ReturnHelper.errorResponse( + res, + 500, + 402, + Language.lang.failed_update, + err.message + ); + } + } - static async delete(req: Request, res: Response, next: NextFunction): Promise { - /* + static async delete( + req: Request, + res: Response, + next: NextFunction + ): Promise { + /* #swagger.tags = ['User'] #swagger.security = [{ "bearerAuth": [] @@ -637,35 +875,66 @@ export class UserController { type: 'boolean' } */ - try { - const schema = Joi.object().keys({ - id: Joi.string().uuid().required().label("ID"), - hard: Joi.bool().optional().allow("").label("Is hard delete?"), - }) + try { + const schema = Joi.object().keys({ + id: Joi.string().uuid().required().label("ID"), + hard: Joi.bool().optional().allow("").label("Is hard delete?"), + }); - const param: { id: string; hard: boolean } = await schema.validateAsync(req.params) + const param: { id: string; hard: boolean } = await schema.validateAsync( + req.params + ); - const userRepository = OrmHelper.DB.getRepository(User) - const userRTRepository = OrmHelper.DB.getRepository(UserRefreshToken) + const userRepository = OrmHelper.DB.getRepository(User); + const userRTRepository = OrmHelper.DB.getRepository(UserRefreshToken); - const affected = (!param.hard ? await userRepository.softDelete({ id: param.id }) : await userRepository.delete({ id: param.id })).affected - const affected_rt = (!param.hard ? await userRTRepository.softDelete({ id_user: param.id }) : await userRTRepository.delete({ id_user: param.id })).affected + const affected = ( + !param.hard + ? await userRepository.softDelete({ id: param.id }) + : await userRepository.delete({ id: param.id }) + ).affected; + const affected_rt = ( + !param.hard + ? await userRTRepository.softDelete({ id_user: param.id }) + : await userRTRepository.delete({ id_user: param.id }) + ).affected; - if (affected > 0) { - return ReturnHelper.successResponseAny(res, 200, Language.lang.success_delete, {}) - } else { - return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "") - } - } catch (e: unknown) { - log.error(e) - const err = e as Error + if (affected > 0) { + return ReturnHelper.successResponseAny( + res, + 200, + Language.lang.success_delete, + {} + ); + } else { + return ReturnHelper.errorResponse( + res, + 404, + 401, + Language.lang.failed_not_found, + "" + ); + } + } catch (e: unknown) { + log.error(e); + const err = e as Error; - return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_delete, err.message) - } - } + return ReturnHelper.errorResponse( + res, + 500, + 402, + Language.lang.failed_delete, + err.message + ); + } + } - static async detail(req: Request, res: Response, next: NextFunction): Promise { - /* + static async detail( + req: Request, + res: Response, + next: NextFunction + ): Promise { + /* #swagger.tags = ['User'] #swagger.security = [{ "bearerAuth": [] @@ -677,52 +946,73 @@ export class UserController { type: 'string' } */ - try { - const schema = Joi.object().keys({ - id: Joi.string().uuid().required().label("ID"), - }) + try { + const schema = Joi.object().keys({ + id: Joi.string().uuid().required().label("ID"), + }); - const param: User = await schema.validateAsync(req.params) + const param: User = await schema.validateAsync(req.params); - const userRepository = OrmHelper.DB.getRepository(User) + const userRepository = OrmHelper.DB.getRepository(User); - const detail = await userRepository.findOne({ - relations: [ - "roles", - "roles.application", - "employee", - "employee.department", - "employee.position", - "employee.airport", - "employee.shift", - "employee.nationality", - "employee.aldeia", - "employee.suco", - "employee.administrativu", - "employee.munisipo" - ], - where: { id: param.id }, - }) + const detail = await userRepository.findOne({ + relations: [ + "roles", + "roles.application", + "employee", + "employee.department", + "employee.position", + "employee.airport", + "employee.shift", + "employee.nationality", + "employee.aldeia", + "employee.suco", + "employee.administrativu", + "employee.munisipo", + ], + where: { id: param.id }, + }); - const data = { - ...detail, - } + const data = { + ...detail, + }; - if (data != null) { - return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, data) - } else { - return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "") - } - } catch (e: unknown) { - log.error(e) - const err = e as Error + if (data != null) { + return ReturnHelper.successResponseAny( + res, + 200, + Language.lang.success_view, + data + ); + } else { + return ReturnHelper.errorResponse( + res, + 404, + 401, + Language.lang.failed_not_found, + "" + ); + } + } catch (e: unknown) { + log.error(e); + const err = e as Error; - return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_view, err.message) - } - } + return ReturnHelper.errorResponse( + res, + 500, + 402, + Language.lang.failed_view, + err.message + ); + } + } - static async restore(req: Request, res: Response, next: NextFunction): Promise { - /* + static async restore( + req: Request, + res: Response, + next: NextFunction + ): Promise { + /* #swagger.tags = ['User'] #swagger.security = [{ "bearerAuth": [] @@ -735,29 +1025,52 @@ export class UserController { type: 'string' } */ - try { - const schema = Joi.object().keys({ - id: Joi.string().uuid().required().label("ID"), - }) + try { + const schema = Joi.object().keys({ + id: Joi.string().uuid().required().label("ID"), + }); - const param: User = await schema.validateAsync(req.params) + const param: User = await schema.validateAsync(req.params); - const userRepository = OrmHelper.DB.getRepository(User) - const userRTRepository = OrmHelper.DB.getRepository(UserRefreshToken) + const userRepository = OrmHelper.DB.getRepository(User); + const userRTRepository = OrmHelper.DB.getRepository(UserRefreshToken); - const affected = (await userRepository.restore({ id: param.id })).affected - const affected_rt = (await userRTRepository.restore({ id_user: param.id })).affected + const affected = (await userRepository.restore({ id: param.id })) + .affected; + const affected_rt = ( + await userRTRepository.restore({ id_user: param.id }) + ).affected; - if (affected > 0) { - return ReturnHelper.successResponseAny(res, 200, Language.lang.success_restore, {}) - } else { - return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, "") - } - } catch (e: unknown) { - log.error(e) - const err = e as Error + if (affected > 0) { + return ReturnHelper.successResponseAny( + res, + 200, + Language.lang.success_restore, + {} + ); + } else { + return ReturnHelper.errorResponse( + res, + 404, + 401, + Language.lang.failed_not_found, + "" + ); + } + } catch (e: unknown) { + log.error(e); + const err = e as Error; - return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message) - } - } + return ReturnHelper.errorResponse( + res, + 500, + 402, + Language.lang.failed_restore, + err.message + ); + } + } +} +function moment() { + throw new Error("Function not implemented."); }