import { AppDataSource } from "../database/data-source"; import { CreateDirector, Director } from "../entities/Director"; import { Body, Delete, Get, Path, Post, Put, Response, Route, SuccessResponse, Tags, Query, Request, Security, } from "tsoa"; import HttpStatusCode from "../interfaces/http-status"; import HttpSuccess from "../interfaces/http-success"; import HttpError from "../interfaces/http-error"; import { Not, Brackets } from "typeorm"; import permission from "../interfaces/permission"; import { RequestWithUser } from "../middlewares/user"; import { setLogDataDiff } from "../interfaces/utils"; @Route("api/v1/evaluation/director") @Tags("director") @Security("bearerAuth") @Response( HttpStatusCode.INTERNAL_SERVER_ERROR, "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", ) @SuccessResponse(HttpStatusCode.OK, "สำเร็จ") export class DirectorController { private directorRepository = AppDataSource.getRepository(Director); /** * API สำหรับแสดงรายการกรรมการ * * @summary EV4_001 - รายการกรรมการ (ADMIN) * */ @Get() async all( @Request() request: RequestWithUser, @Query("page") page: number = 1, @Query("pageSize") pageSize: number = 10, @Query("keyword") keyword?: string, ) { try { await new permission().PermissionList(request, "SYS_EVA_INFO"); const directors = await AppDataSource.getRepository(Director) .createQueryBuilder("director") .andWhere( new Brackets((qb) => { qb.where( keyword != null && keyword != "" ? "CONCAT(director.prefix, director.firstName, ' ', director.lastName) LIKE :keyword" : "1=1", { keyword: `%${keyword}%`, }, ) .orWhere( keyword != null && keyword != "" ? "director.position LIKE :keyword" : "1=1", { keyword: `%${keyword}%`, }, ) .orWhere(keyword != null && keyword != "" ? "director.email LIKE :keyword" : "1=1", { keyword: `%${keyword}%`, }) .orWhere(keyword != null && keyword != "" ? "director.phone LIKE :keyword" : "1=1", { keyword: `%${keyword}%`, }); }), ) .orderBy("director.createdAt", "DESC") .skip((page - 1) * pageSize) .take(pageSize) .getMany(); return new HttpSuccess(directors); } catch (error: any) { if (error instanceof HttpError) { throw error; } else throw new HttpError(HttpStatusCode.INTERNAL_SERVER_ERROR, error); } } @Get("admin") async allAdmin( @Request() request: RequestWithUser, @Query("page") page: number = 1, @Query("pageSize") pageSize: number = 10, @Query("keyword") keyword?: string, ) { try { const directors = await AppDataSource.getRepository(Director) .createQueryBuilder("director") .andWhere( new Brackets((qb) => { qb.where( keyword != null && keyword != "" ? "CONCAT(director.prefix, director.firstName, ' ', director.lastName) LIKE :keyword" : "1=1", { keyword: `%${keyword}%`, }, ) .orWhere( keyword != null && keyword != "" ? "director.position LIKE :keyword" : "1=1", { keyword: `%${keyword}%`, }, ) .orWhere(keyword != null && keyword != "" ? "director.email LIKE :keyword" : "1=1", { keyword: `%${keyword}%`, }) .orWhere(keyword != null && keyword != "" ? "director.phone LIKE :keyword" : "1=1", { keyword: `%${keyword}%`, }); }), ) .orderBy("director.createdAt", "DESC") .skip((page - 1) * pageSize) .take(pageSize) .getMany(); return new HttpSuccess(directors); } catch (error: any) { if (error instanceof HttpError) { throw error; } else throw new HttpError(HttpStatusCode.INTERNAL_SERVER_ERROR, error); } } /** * API สำหรับแสดงรายละเอียดกรรมการ * * @summary EV4_002 - รายละเอียดกรรมการ (ADMIN) * */ @Get("{id}") async one(@Path() id: string, @Request() request: RequestWithUser) { try { let _workflow = await new permission().Workflow(request, id, "SYS_EVA_INFO"); if (_workflow == false) await new permission().PermissionGet(request, "SYS_EVA_INFO"); const director = await this.directorRepository.findOne({ where: { id } }); if (!director) { throw new HttpError(HttpStatusCode.NOT_FOUND, "not found."); } return new HttpSuccess(director); } catch (error: any) { if (error instanceof HttpError) { throw error; } else throw new HttpError(HttpStatusCode.INTERNAL_SERVER_ERROR, error); } } /** * API สำหรับเพิ่มรายละเอียดกรรมการ * * @summary EV4_003 - เพิ่มรายละเอียดกรรมการ (ADMIN) * */ @Post() async save(@Body() requestBody: CreateDirector, @Request() request: RequestWithUser) { try { await new permission().PermissionCreate(request, "SYS_EVA_INFO"); let directorDup = await this.directorRepository.findOne({ where: { firstName: requestBody.firstName, lastName: requestBody.lastName }, }); if (directorDup != null) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ชื่อกรรมการนี้มีอยู่ในระบบแล้ว"); } const director = Object.assign(new Director(), requestBody); director.createdUserId = request.user.sub; director.createdFullName = request.user.name; director.createdAt = new Date(); director.lastUpdateUserId = request.user.sub; director.lastUpdateFullName = request.user.name; director.lastUpdatedAt = new Date(); const before = null; await this.directorRepository.save(director, { data: request }); setLogDataDiff(request, { before, after: director }); return new HttpSuccess(); } catch (error: any) { if (error instanceof HttpError) { throw error; } else throw new HttpError(HttpStatusCode.INTERNAL_SERVER_ERROR, error); } } /** * API สำหรับแก้ไขรายละเอียดกรรมการ * * @summary แก้ไขรายละเอียดกรรมการ (ADMIN) * */ @Put("duty/{id}") async updateDuty(@Path() id: string, @Body() body:{duty: string} , @Request() request: RequestWithUser) { try { await new permission().PermissionUpdate(request, "SYS_EVA_INFO"); let director = await this.directorRepository.findOneBy({ id }); if (!director) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลกรรมการ"); } const before = structuredClone(director); director.duty = body?.duty; director.lastUpdateUserId = request.user.sub; director.lastUpdateFullName = request.user.name; director.lastUpdatedAt = new Date(); await this.directorRepository.save(director, { data: request }); setLogDataDiff(request, { before, after: director }); return new HttpSuccess(); } catch (error: any) { if (error instanceof HttpError) { throw error; } else throw new HttpError(HttpStatusCode.INTERNAL_SERVER_ERROR, error); } } /** * API สำหรับแก้ไขรายละเอียดกรรมการ * * @summary EV4_004 - แก้ไขรายละเอียดกรรมการ (ADMIN) * */ @Put("{id}") async update(@Path() id: string, @Body() u: CreateDirector, @Request() request: RequestWithUser) { try { await new permission().PermissionUpdate(request, "SYS_EVA_INFO"); let directorDup = await this.directorRepository.findOne({ where: { firstName: u.firstName, lastName: u.lastName, id: Not(id) }, }); if (directorDup != null) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ชื่อกรรมการนี้มีอยู่ในระบบแล้ว"); } let director = await this.directorRepository.findOneBy({ id }); if (!director) { throw new HttpError(HttpStatusCode.NOT_FOUND, "not found."); } const before = structuredClone(directorDup); director.lastUpdateUserId = request.user.sub; director.lastUpdateFullName = request.user.name; director.lastUpdatedAt = new Date(); this.directorRepository.merge(director, u); await this.directorRepository.save(director, { data: request }); setLogDataDiff(request, { before, after: director }); return new HttpSuccess(); } catch (error: any) { if (error instanceof HttpError) { throw error; } else throw new HttpError(HttpStatusCode.INTERNAL_SERVER_ERROR, error); } } /** * API สำหรับลบรายละเอียดกรรมการ * * @summary EV4_005 - ลบรายละเอียดกรรมการ (ADMIN) * */ @Delete("{id}") async remove(id: string, @Request() request: RequestWithUser) { try { await new permission().PermissionDelete(request, "SYS_EVA_INFO"); let director = await this.directorRepository.findOneBy({ id }); if (!director) { throw new HttpError(HttpStatusCode.NOT_FOUND, "not found."); } await this.directorRepository.remove(director, { data: request }); return new HttpSuccess(); } catch (error: any) { if (error instanceof HttpError) { throw error; } else throw new HttpError(HttpStatusCode.INTERNAL_SERVER_ERROR, error); } } }