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 HttpError from "../interfaces/http-error"; import { Equal, ILike, In, IsNull, Like, Not, Brackets, MoreThan } from "typeorm"; import { RequestWithUser } from "../middlewares/user"; import { ChangePosition, CreateChangePosition, UpdateChangePosition } from "../entities/ChangePosition"; import { ProfileChangePosition, CreateProfileChangePosition } from "../entities/ProfileChangePosition"; @Route("api/v1/org/placement/change-position") @Tags("Placement") @Security("bearerAuth") @Response( HttpStatusCode.INTERNAL_SERVER_ERROR, "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", ) @SuccessResponse(HttpStatusCode.OK, "สำเร็จ") export class ChangePositionController extends Controller { private ChangePositionRepository = AppDataSource.getRepository(ChangePosition); private ProfileChangePositionRepository = AppDataSource.getRepository(ProfileChangePosition); /** * API เพิ่มรอบย้ายสับเปลี่ยนตำแหน่ง * * @summary เพิ่มรอบย้ายสับเปลี่ยนตำแหน่ง (ADMIN) * */ @Post() async CreateChangePosition( @Body() body: CreateChangePosition, @Request() request: RequestWithUser, ) { const _changePosition = await this.ChangePositionRepository.findOne({ where: { name: body.name }, }); if(_changePosition){ throw new HttpError( HttpStatusCode.INTERNAL_SERVER_ERROR, "ชื่อรอบการย้ายสับเปลี่ยนตำแหน่งนี้มีอยู่ในระบบแล้ว", ); } const changePosition = new ChangePosition(); Object.assign(changePosition, body); changePosition.date = new Date, changePosition.status = "WAITTING", changePosition.createdUserId = request.user.sub; changePosition.createdFullName = request.user.name; changePosition.lastUpdateUserId = request.user.sub; changePosition.lastUpdateFullName = request.user.name; await this.ChangePositionRepository.save(changePosition); return new HttpSuccess(); } /** * API เพิ่มเพิ่มรายชื่อผู้ที่ย้ายสับเปลี่ยนตำแหน่ง * * @summary เพิ่มเพิ่มรายชื่อผู้ที่ย้ายสับเปลี่ยนตำแหน่ง (ADMIN) * * @param {string} id Id รอบย้ายสับเปลี่ยนตำแหน่ง */ @Post("profile/{id}") async CreateProfileChangePosition( @Path() id: string, @Body() body: CreateProfileChangePosition, @Request() request: RequestWithUser, ) { const changePosition = await this.ChangePositionRepository.findOneBy({ id }); if (!changePosition) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลรอบย้ายสับเปลี่ยนตำแหน่ง"); const profileChangePositions: ProfileChangePosition[] = []; const profiles = new ProfileChangePosition(); for (const data of body.profiles) { Object.assign(profiles, data); let positionOld = data.positionOld ? `${data.positionOld}` : ""; let rootOld = data.rootOld ? data.positionOld ? `/${data.rootOld}` : `${data.rootOld}` : ""; profiles.changePositionId = id; profiles.organizationPositionOld = `${positionOld}${rootOld}`, profiles.status = "WAITTING", profiles.createdUserId = request.user.sub; profiles.createdFullName = request.user.name; profiles.lastUpdateUserId = request.user.sub; profiles.lastUpdateFullName = request.user.name; profileChangePositions.push(profiles); } await this.ProfileChangePositionRepository.save(profileChangePositions); return new HttpSuccess(); } /** * API ลบรอบย้ายสับเปลี่ยนตำแหน่ง * * @summary ลบรอบย้ายสับเปลี่ยนตำแหน่ง (ADMIN) * * @param {string} id Id รอบย้ายสับเปลี่ยนตำแหน่ง */ @Delete("{id}") async DeleteChangePosition(@Path() id: string) { let result: any; try { result = await this.ChangePositionRepository.delete({ id: id }); } catch { throw new HttpError( HttpStatusCode.NOT_FOUND, "ไม่สามารถลบได้เนื่องจากมีการใช้งานรอบย้ายสับเปลี่ยนตำแหน่งนี้อยู่", ); } if (result.affected == undefined || result.affected <= 0) { throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); } return new HttpSuccess(); } /** * API แก้ไขรอบย้ายสับเปลี่ยนตำแหน่ง * * @summary แก้ไขรอบย้ายสับเปลี่ยนตำแหน่ง (ADMIN) * * @param {string} id Id รอบย้ายสับเปลี่ยนตำแหน่ง */ @Put("{id}") async UpdateChangePosition( @Request() request: RequestWithUser, @Path() id: string, @Body() body: UpdateChangePosition, ) { const changePosition = await this.ChangePositionRepository.findOneBy({ id }); if (!changePosition) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลรอบย้ายสับเปลี่ยนตำแหน่ง"); const checkDuplicate = await this.ChangePositionRepository.find({ where: { id: Not(id), name: body.name }, }); if(checkDuplicate.length > 0){ throw new HttpError( HttpStatusCode.INTERNAL_SERVER_ERROR, "ชื่อรอบการย้ายสับเปลี่ยนตำแหน่งนี้มีอยู่ในระบบแล้ว", ); } Object.assign(changePosition, body); changePosition.lastUpdateUserId = request.user.sub; changePosition.lastUpdateFullName = request.user.name; await this.ChangePositionRepository.save(changePosition); return new HttpSuccess(); } /** * API รายการรอบย้ายสับเปลี่ยนตำแหน่ง * * @summary API รายการรอบย้ายสับเปลี่ยนตำแหน่ง (ADMIN) * */ @Get() async GetChangePositionLists() { const data = await this.ChangePositionRepository.find(); return new HttpSuccess(data); } /** * API รายละเอียดรอบย้ายสับเปลี่ยนตำแหน่ง * * @summary API รายละเอียดรอบย้ายสับเปลี่ยนตำแหน่ง (ADMIN) * * @param {string} id Id รอบย้ายสับเปลี่ยนตำแหน่ง */ @Get("{id}") async GetChangePositionById( @Path() id: string ) { const data = await this.ChangePositionRepository.findOne({ where: { id: id }}); if (!data) throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลรอบย้ายสับเปลี่ยนตำแหน่ง"); return new HttpSuccess(data); } }