diff --git a/config/default.json b/config/default.json index 518ec60..1f5e104 100644 --- a/config/default.json +++ b/config/default.json @@ -35,6 +35,6 @@ }, "service": { "notification": "http://127.0.0.1:4008/", - "hrms": "https://brilianapps.shiblysolution.id/hrms/" + "hrms": "https://brilianapps.britimorleste.tl/hrms/" } } diff --git a/config/stag.json b/config/stag.json index 03ab424..ccd54d0 100644 --- a/config/stag.json +++ b/config/stag.json @@ -35,6 +35,6 @@ }, "service": { "notification": "http://127.0.0.1:4008/", - "hrms": "http://127.0.0.1:80/" + "hrms": "https://brilianapps.britimorleste.tl/hrms/" } } diff --git a/src/controllers/auth.ts b/src/controllers/auth.ts index b395cfb..a2b01c4 100644 --- a/src/controllers/auth.ts +++ b/src/controllers/auth.ts @@ -86,7 +86,13 @@ export class AuthController { } else { // const userRole = await userRoleRepository.findOneBy({ id: role_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, @@ -97,7 +103,13 @@ export class AuthController { const { data: dataHrms } = await axios.get(url) if (dataHrms && dataHrms.status && dataHrms.data.count == 1) { hrms = { + uuid: dataHrms.data.list[0].uuid, + idx: dataHrms.data.list[0]._idx, + nik: dataHrms.data.list[0].nik, + name: dataHrms.data.list[0].employeename, + title: dataHrms.data.list[0].title, department_id: dataHrms.data.list[0].idxdept, + departement_uuid: dataHrms.data.list[0].deptuuid, department_name: dataHrms.data.list[0].departement, level_id: dataHrms.data.list[0].idxlevel, level_name: dataHrms.data.list[0].level, diff --git a/src/controllers/user.ts b/src/controllers/user.ts index 0635534..16ff2b0 100644 --- a/src/controllers/user.ts +++ b/src/controllers/user.ts @@ -1,22 +1,21 @@ -import { Response, NextFunction, Application } from "express"; -import { Request } from "express-jwt"; -import { ReturnHelper } from "../helpers/express/return"; -import { OrmHelper } from "../helpers/orm"; -import { User, UserRefreshToken, UserRole } from "entity"; -import Joi from "joi"; -import { ILogObj, Logger } from "tslog"; -import { Language } from "../langs/lang"; -import { Paging } from "entity"; -import CommonHelper from "../helpers/common"; -import * as fastcsv from 'fast-csv'; -import dayjs from "dayjs"; -import exceljs from "exceljs"; +import axios from "axios" +import config from "config" +import { 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...}
', @@ -57,98 +56,91 @@ 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'), - token: Joi.string().required().label('Token'), - }); + 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"), + token: Joi.string().required().label("Token"), + }) - 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() + } + 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) - if (param.with_deleted) { - res_count.withDeleted(); - res_list.withDeleted(); - } + 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 - 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.errorResponse(res, 400, 401, Language.lang.failed_view, err.message) + } + } - 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); - } - } - - 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...}
', @@ -178,86 +170,71 @@ 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'), - token: Joi.string().required().label('Token'), - }); + 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"), + token: Joi.string().required().label("Token"), + }) - 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": [] @@ -275,45 +252,45 @@ 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'), - nik: Joi.string().max(64).optional().allow('').label('NIK'), - 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"), + nik: Joi.string().max(64).optional().allow("").label("NIK"), + status: Joi.string().required().label("Status"), + }) - const param: User = await schema.validateAsync(req.body); + const param: User = 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 - if (param.nik && param.nik! + "") { - data.nik = param.nik - } + if (param.nik && param.nik! + "") { + data.nik = param.nik + } - 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": [] @@ -334,66 +311,66 @@ 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": [] @@ -414,57 +391,57 @@ 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": [] @@ -483,43 +460,43 @@ 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 - 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": [] @@ -538,43 +515,43 @@ 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": [] @@ -598,58 +575,58 @@ 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'), - nik: Joi.string().max(64).optional().allow('').label('NIK'), - 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"), + nik: Joi.string().max(64).optional().allow("").label("NIK"), + status: Joi.string().required().label("Status"), + }) - req.body.id = req.params['id']; + req.body.id = req.params["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.nik = param.nik - data.username = param.username - data.email = param.email - data.status = param.status + if (data != null) { + data.name = param.name + data.nik = param.nik + data.username = param.username + data.email = param.email + data.status = param.status - if (param.nik && param.nik != "") { - data.nik = param.nik - } + if (param.nik && param.nik != "") { + data.nik = param.nik + } - 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": [] @@ -667,35 +644,35 @@ 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": [] @@ -712,38 +689,74 @@ export class UserController { type: 'string' } */ - try { - const schema = Joi.object().keys({ - id: Joi.string().uuid().required().label('ID'), - token: Joi.string().required().label('Token') - }); + try { + const schema = Joi.object().keys({ + id: Joi.string().uuid().required().label("ID"), + token: Joi.string().required().label("Token"), + }) - req.params.token = String(req.query.token) ?? '' + req.params.token = String(req.query.token) ?? "" - const param: User & { token: string } = await schema.validateAsync(req.params); + const param: User & { token: string } = 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'], - where: { id: param.id } - }); + const detail = await userRepository.findOne({ + relations: ["roles", "roles.application"], + where: { id: param.id }, + }) - if (detail != null) { - return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, detail); - } else { - return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, ""); - } - } catch (e: unknown) { - log.error(e); - const err = e as Error; + 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, + } + if (detail.nik) { + const url = config.get("service.hrms") + "api/get-employee?nik=" + detail.nik + const { data: dataHrms } = await axios.get(url) + if (dataHrms && dataHrms.status && dataHrms.data.count == 1) { + hrms = { + uuid: dataHrms.data.list[0].uuid, + idx: dataHrms.data.list[0]._idx, + nik: dataHrms.data.list[0].nik, + name: dataHrms.data.list[0].employeename, + title: dataHrms.data.list[0].title, + department_id: dataHrms.data.list[0].idxdept, + departement_uuid: dataHrms.data.list[0].deptuuid, + department_name: dataHrms.data.list[0].departement, + level_id: dataHrms.data.list[0].idxlevel, + level_name: dataHrms.data.list[0].level, + } + } + } - return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_view, err.message); - } - } + const data = { + ...detail, + hrms, + } - static async restore(req: Request, res: Response, next: NextFunction): Promise { - /* + 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) + } + } + + static async restore(req: Request, res: Response, next: NextFunction): Promise { + /* #swagger.tags = ['User'] #swagger.security = [{ "bearerAuth": [] @@ -756,29 +769,29 @@ 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); - } - } -} \ No newline at end of file + return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_restore, err.message) + } + } +}