import { Controller, Get, Post, Put, Delete, Patch, Route, Security, Tags, Body, Path, Request, Example, SuccessResponse, Response, Query, } from "tsoa"; import { AppDataSource } from "../database/data-source"; import HttpSuccess from "../interfaces/http-success"; import HttpStatusCode from "../interfaces/http-status"; import { PosType, CreatePosType, UpdatePosType } from "../entities/PosType"; import { PosLevel } from "../entities/PosLevel"; import HttpError from "../interfaces/http-error"; import { Not } from "typeorm"; @Route("api/v1/salary/pos/type") @Tags("PosType") @Security("bearerAuth") @Response( HttpStatusCode.INTERNAL_SERVER_ERROR, "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", ) @SuccessResponse(HttpStatusCode.OK, "สำเร็จ") export class PosTypeController extends Controller { private posTypeRepository = AppDataSource.getRepository(PosType); private posLevelRepository = AppDataSource.getRepository(PosLevel); /** * API เพิ่มประเภทตำแหน่ง * * @summary เพิ่มประเภทตำแหน่ง (ADMIN) * */ @Post() @Example({ positionName: "นักบริหาร", posTypeRank: 1, }) async createType( @Body() requestBody: CreatePosType, @Request() request: { user: Record }, ) { const posType = Object.assign(new PosType(), requestBody); if (!posType) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } const chkPosTypeName = await this.posTypeRepository.findOne({ where: { posTypeName: requestBody.posTypeName, }, }); if (chkPosTypeName) { throw new HttpError( HttpStatusCode.NOT_FOUND, "ชื่อประเภทตำแหน่ง: " + requestBody.posTypeName + " มีอยู่ในระบบแล้ว", ); } // try { posType.createdUserId = request.user.sub; posType.createdFullName = request.user.name; posType.lastUpdateUserId = request.user.sub; posType.lastUpdateFullName = request.user.name; await this.posTypeRepository.save(posType); return new HttpSuccess(posType); // } catch (error) { // return error; // } } /** * API แก้ไขประเภทตำแหน่ง * * @summary แก้ไขประเภทตำแหน่ง (ADMIN) * * @param {string} id Id ประเภทตำแหน่ง */ @Put("{id}") @Example({ positionName: "นักบริหาร", posTypeRank: 1, }) async editType( @Path() id: string, @Body() requestBody: UpdatePosType, @Request() request: { user: Record }, ) { const posType = await this.posTypeRepository.findOne({ where: { id } }); if (!posType) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลไอดีนี้"); } const chkPosTypeName = await this.posTypeRepository.findOne({ where: { id: Not(id), posTypeName: requestBody.posTypeName, }, }); if (chkPosTypeName) { throw new HttpError( HttpStatusCode.NOT_FOUND, "ชื่อประเภทตำแหน่ง: " + requestBody.posTypeName + " มีอยู่ในระบบแล้ว", ); } // try { posType.lastUpdateUserId = request.user.sub; posType.lastUpdateFullName = request.user.name; this.posTypeRepository.merge(posType, requestBody); await this.posTypeRepository.save(posType); return new HttpSuccess(posType.id); // } catch (error) { // return error; // } } /** * API ลบประเภทตำแหน่ง * * @summary ลบประเภทตำแหน่ง (ADMIN) * * @param {string} id Id ตำแหน่ง */ @Delete("{id}") async deleteType(@Path() id: string) { const delPosType = await this.posTypeRepository.findOne({ where: { id } }); if (!delPosType) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลไอดีนี้"); } const IdExitsInLevel = await this.posLevelRepository.find({ where: { posTypeId: id }, }); if (IdExitsInLevel.length > 0) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่สามารถลบได้ เนื่องจาก id ผูกกับ posLevel"); } // try { await this.posTypeRepository.remove(delPosType); return new HttpSuccess(); // } catch (error) { // return error; // } } /** * API รายละเอียดประเภทตำแหน่ง * * @summary รายละเอียดประเภทตำแหน่ง (ADMIN) * * @param {string} id Id ประเภทตำแหน่ง */ @Get("{id}") @Example([ { id: "00000000-0000-0000-0000-000000000000", posTypeName: "นักบริหาร", posLevelposTypeRanks: 1, posLevels: [ { id: "00000000-0000-0000-0000-000000000000", posLevelName: "นักบริหาร", posLevelRank: 1, posLevelAuthority: "HEAD", }, ], }, ]) async GetTypeDetail(@Path() id: string) { // try { const getPosType = await this.posTypeRepository.findOne({ select: ["id", "posTypeName", "posTypeRank"], relations: ["posLevels"], where: { id: id }, }); if (!getPosType) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลไอดีนี้"); } const mapGetPosType = { id: getPosType.id, posTypeName: getPosType.posTypeName, posTypeRank: getPosType.posTypeRank, posLevels: getPosType.posLevels.map((posLevel) => ({ id: posLevel.id, posLevelName: posLevel.posLevelName, posLevelRank: posLevel.posLevelRank, posLevelAuthority: posLevel.posLevelAuthority, })), }; return new HttpSuccess(mapGetPosType); // } catch (error) { // return error; // } } /** * API รายการประเภทตำแหน่ง * * @summary SLR_006 - รายการประเภทตำแหน่ง #6 * */ @Get() @Example([ { id: "00000000-0000-0000-0000-000000000000", posTypeName: "นักบริหาร", posTypeRank: 1, posLevels: [ { id: "00000000-0000-0000-0000-000000000000", posLevelName: "นักบริหาร", posLevelRank: 1, posLevelAuthority: "HEAD", }, ], }, ]) async GetPosType() { // try { const posType = await this.posTypeRepository.find({ select: ["id", "posTypeName", "posTypeRank"], relations: ["posLevels"], }); const mapPosType = posType.map((item) => ({ id: item.id, posTypeName: item.posTypeName, posTypeRank: item.posTypeRank, posLevels: item.posLevels.map((posLevel) => ({ id: posLevel.id, posLevelName: posLevel.posLevelName, posLevelRank: posLevel.posLevelRank, posLevelAuthority: posLevel.posLevelAuthority, })), })); return new HttpSuccess(mapPosType); // } catch (error) { // return error; // } } }