import { Controller, Route, Security, Tags, Body, Request, SuccessResponse, Response, Get, Put, Post, Path, Delete, } from "tsoa"; import { setLogDataDiff } from "../interfaces/utils"; import { AppDataSource } from "../database/data-source"; import HttpSuccess from "../interfaces/http-success"; import HttpStatusCode from "../interfaces/http-status"; import HttpError from "../interfaces/http-error"; import permission from "../interfaces/permission"; import { RequestWithUser } from "../middlewares/user"; import { Appoint, CreateAppoint, Person, UpdateAppoint } from "../entities/Appoint"; import { AppointDirector } from "../entities/AppointDirector"; @Route("api/v1/probation/appoint") @Tags("Appoint Director") @Security("bearerAuth") @Response( HttpStatusCode.INTERNAL_SERVER_ERROR, "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", ) @SuccessResponse(HttpStatusCode.OK, "สำเร็จ") export class AppointController extends Controller { private appointRepository = AppDataSource.getRepository(Appoint); private appointDirectorRepository = AppDataSource.getRepository(AppointDirector); /** * API รายการแต่งตั้งคณะกรรมการฯ ทดลองงาน * * @summary รายการแต่งตั้งคณะกรรมการฯ * */ @Get("") async GetList(@Request() request: RequestWithUser) { await new permission().PermissionList(request, "SYS_PROBATION"); const appoint = await this.appointRepository.find({}); return new HttpSuccess(appoint); } /** * API รายการแต่งตั้งคณะกรรมการฯ ที่ออกคำสั่งแล้วทดลองงาน * * @summary รายการแต่งตั้งคณะกรรมการฯ ที่ออกคำสั่งแล้ว * */ @Get("list/{id}") async GetListCommand(@Request() request: RequestWithUser, @Path() id: string) { const appoint = await this.appointRepository.find({ relations: ["directors"], where: { profileId: id, status: "DONE" }, }); return new HttpSuccess(appoint); } /** * API สร้างการแต่งตั้งคณะกรรมการฯ ทดลองงาน * * @summary สร้างการแต่งตั้งคณะกรรมการฯ * */ @Post("") async Create(@Request() request: RequestWithUser, @Body() requestBody: CreateAppoint) { await new permission().PermissionCreate(request, "SYS_PROBATION"); const data: any = { topic: requestBody.topic, profileId: requestBody.profileId, createdUserId: request.user.sub, createdFullName: request.user.name, }; const before = null; const appoint = await this.appointRepository.save(data, { data: request }); setLogDataDiff(request, { before, after: appoint }); return new HttpSuccess(appoint.id); } /** * API ดึงข้อมูลแต่งตั้งคณะกรรมการฯ * * @summary API ดึงข้อมูลแต่งตั้งคณะกรรมการฯ ตาม id * */ @Get("{id}") async GetById(@Request() request: RequestWithUser, @Path() id: string) { await new permission().PermissionGet(request, "SYS_PROBATION"); const appoint = await this.appointRepository.findOne({ select: ["id", "topic", "status", "profileId"], where: { id }, relations: ["directors"], }); return new HttpSuccess(appoint); } /** * API แก้ไขการแต่งตั้งคณะกรรมการฯ ทดลองงาน * * @summary แก้ไขการแต่งตั้งคณะกรรมการฯ * */ @Put("{id}") async Update( @Request() request: RequestWithUser, @Body() requestBody: UpdateAppoint, @Path() id: string, ) { await new permission().PermissionUpdate(request, "SYS_PROBATION"); const appoint: any = await this.appointRepository.findOne({ where: { id } }); if (!appoint) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการแต่งตั้งคณะกรรมการฯ"); } const before = appoint; appoint.topic = requestBody.topic; appoint.updateUserId = request.user.sub; appoint.updateFullName = request.user.name; await this.appointDirectorRepository.delete({ appointId: id }); const directors = await requestBody.persons.map((x: Person) => ({ ...x, appointId: id, createdUserId: request.user.sub, createdFullName: request.user.name, updateUserId: request.user.sub, updateFullName: request.user.name, })); await this.appointDirectorRepository.save(directors); await this.appointRepository.save(appoint, { data: request }); setLogDataDiff(request, { before, after: appoint }); return new HttpSuccess(); } /** * API ลบรายการแต่งตั้งคณะกรรมการฯ * * @summary ลบรายการแต่งตั้งคณะกรรมการฯ * */ @Delete("{id}") public async deleteRole(@Path() id: string, @Request() request: RequestWithUser) { await new permission().PermissionDelete(request, "SYS_PROBATION"); await this.appointDirectorRepository.delete({ appointId: id }); const result = await this.appointRepository.delete({ id }); if (!result) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); return new HttpSuccess(); } }