import { AppDataSource } from "../database/data-source"; import { CreateMeeting, Meeting } from "../entities/Meeting"; 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 { RequestWithUser } from "../middlewares/user"; import permission from "../interfaces/permission"; import { setLogDataDiff } from "../interfaces/utils"; import { Brackets } from "typeorm"; @Route("api/v1/evaluation/meeting") @Tags("meeting") @Security("bearerAuth") @Response( HttpStatusCode.INTERNAL_SERVER_ERROR, "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", ) @SuccessResponse(HttpStatusCode.OK, "สำเร็จ") export class MeetingController { private meetingRepository = AppDataSource.getRepository(Meeting); /** * API สำหรับแสดงรายการการประชุม * * @summary EV4_006 - รายการการประชุม (ADMIN) * */ @Get() async all( @Request() request: RequestWithUser, @Query("page") page: number = 1, @Query("pageSize") pageSize: number = 10, @Query("keyword") keyword?: string, ) { await new permission().PermissionList(request, "SYS_EVA_INFO"); const meetings = await AppDataSource.getRepository(Meeting) .createQueryBuilder("meeting") .andWhere( new Brackets((qb) => { qb.where(keyword != null && keyword != "" ? "meeting.title LIKE :keyword" : "1=1", { keyword: `%${keyword}%`, }).orWhere(keyword != null && keyword != "" ? "meeting.round LIKE :keyword" : "1=1", { keyword: `%${keyword}%`, }); }), ) .orderBy("meeting.createdAt", "DESC") .skip((page - 1) * pageSize) .take(pageSize) .getMany(); return new HttpSuccess(meetings); } @Get("admin") async allAdmin( @Request() request: RequestWithUser, @Query("page") page: number = 1, @Query("pageSize") pageSize: number = 10, @Query("keyword") keyword?: string, ) { const meetings = await AppDataSource.getRepository(Meeting) .createQueryBuilder("meeting") .andWhere( new Brackets((qb) => { qb.where(keyword != null && keyword != "" ? "meeting.title LIKE :keyword" : "1=1", { keyword: `%${keyword}%`, }).orWhere(keyword != null && keyword != "" ? "meeting.round LIKE :keyword" : "1=1", { keyword: `%${keyword}%`, }); }), ) .orderBy("meeting.createdAt", "DESC") .skip((page - 1) * pageSize) .take(pageSize) .getMany(); return new HttpSuccess(meetings); } /** * API สำหรับแสดงรายละเอียดการประชุม * * @summary EV4_007 - รายละเอียดการประชุม (ADMIN) * */ @Get("{id}") async one(@Path() id: string, @Request() request: RequestWithUser) { let _workflow = await new permission().Workflow(request, id, "SYS_EVA_INFO"); if (_workflow == false) await new permission().PermissionGet(request, "SYS_EVA_INFO"); const meeting = await this.meetingRepository.findOne({ where: { id } }); if (!meeting) { throw new HttpError(HttpStatusCode.NOT_FOUND, "not found."); } return new HttpSuccess(meeting); } /** * API สำหรับเพิ่มรายละเอียดการประชุม * * @summary EV4_008 - เพิ่มรายละเอียดการประชุม (ADMIN) * */ @Post() async save(@Body() requestBody: CreateMeeting, @Request() request: RequestWithUser) { await new permission().PermissionCreate(request, "SYS_EVA_INFO"); const meeting = Object.assign(new Meeting(), requestBody); meeting.createdUserId = request.user.sub; meeting.createdFullName = request.user.name; meeting.createdAt = new Date(); meeting.lastUpdateUserId = request.user.sub; meeting.lastUpdateFullName = request.user.name; meeting.lastUpdatedAt = new Date(); const before = null; await this.meetingRepository.save(meeting, { data: request }); setLogDataDiff(request, { before, after: meeting }); return new HttpSuccess(); } /** * API สำหรับแก้ไขรายละเอียดการประชุม * * @summary EV4_009 - แก้ไขรายละเอียดการประชุม (ADMIN) * */ @Put("{id}") async update(@Path() id: string, @Body() u: CreateMeeting, @Request() request: RequestWithUser) { await new permission().PermissionUpdate(request, "SYS_EVA_INFO"); let meeting = await this.meetingRepository.findOneBy({ id }); if (!meeting) { throw new HttpError(HttpStatusCode.NOT_FOUND, "not found."); } const before = structuredClone(meeting); meeting.lastUpdateUserId = request.user.sub; meeting.lastUpdateFullName = request.user.name; meeting.lastUpdatedAt = new Date(); this.meetingRepository.merge(meeting, u); await this.meetingRepository.save(meeting, { data: request }); setLogDataDiff(request, { before, after: meeting }); return new HttpSuccess(); } /** * API สำหรับลบรายละเอียดการประชุม * * @summary EV4_010 - ลบรายละเอียดการประชุม (ADMIN) * */ @Delete("{id}") async remove(id: string, @Request() request: RequestWithUser) { await new permission().PermissionDelete(request, "SYS_EVA_INFO"); let meeting = await this.meetingRepository.findOneBy({ id }); if (!meeting) { throw new HttpError(HttpStatusCode.NOT_FOUND, "not found."); } await this.meetingRepository.remove(meeting, { data: request }); return new HttpSuccess(); } }