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, "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง") 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() } }