import { Body, Controller, Delete, Get, Patch, Path, Post, Request, Route, Security, Tags, } from "tsoa"; import { AppDataSource } from "../database/data-source"; import HttpSuccess from "../interfaces/http-success"; import HttpStatus from "../interfaces/http-status"; import HttpError from "../interfaces/http-error"; import { ProfileDevelopmentHistory } from "../entities/ProfileDevelopmentHistory"; import { RequestWithUser } from "../middlewares/user"; import { ProfileEmployee } from "../entities/ProfileEmployee"; import { CreateProfileEmployeeDevelopment, ProfileDevelopment, UpdateProfileDevelopment, } from "../entities/ProfileDevelopment"; import permission from "../interfaces/permission"; import { DevelopmentProject } from "../entities/DevelopmentProject"; @Route("api/v1/org/profile-temp/development") @Tags("ProfileDevelopment") @Security("bearerAuth") export class ProfileDevelopmentEmployeeTempController extends Controller { private profileRepository = AppDataSource.getRepository(ProfileEmployee); private developmentRepository = AppDataSource.getRepository(ProfileDevelopment); private developmentHistoryRepository = AppDataSource.getRepository(ProfileDevelopmentHistory); private developmentProjectRepository = AppDataSource.getRepository(DevelopmentProject); @Get("user") public async getDevelopmentUser(@Request() request: { user: Record }) { const profile = await this.profileRepository.findOneBy({ keycloak: request.user.sub }); if (!profile) { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const lists = await this.developmentRepository.find({ where: { profileEmployeeId: profile.id }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); } @Get("{profileId}") public async getDevelopment(@Path() profileId: string, @Request() req: RequestWithUser) { await new permission().PermissionGet(req, "SYS_REGISTRY_TEMP"); const lists = await this.developmentRepository.find({ where: { profileEmployeeId: profileId }, order: { createdAt: "ASC" }, }); return new HttpSuccess(lists); } @Get("history/{developmentId}") public async developmentHistory(@Path() developmentId: string, @Request() req: RequestWithUser) { await new permission().PermissionGet(req, "SYS_REGISTRY_TEMP"); const record = await this.developmentHistoryRepository.find({ where: { profileDevelopmentId: developmentId }, order: { createdAt: "DESC" }, }); return new HttpSuccess(record); } @Post() public async newDevelopment( @Request() req: RequestWithUser, @Body() body: CreateProfileEmployeeDevelopment, ) { await new permission().PermissionUpdate(req, "SYS_REGISTRY_TEMP"); if (!body.profileEmployeeId) { throw new HttpError(HttpStatus.BAD_REQUEST, "กรุณากรอก profileId"); } const profile = await this.profileRepository.findOneBy({ id: body.profileEmployeeId }); if (!profile) { throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); } const data = new ProfileDevelopment(); const meta = { createdUserId: req.user.sub, createdFullName: req.user.name, lastUpdateUserId: req.user.sub, lastUpdateFullName: req.user.name, createdAt: new Date(), lastUpdatedAt: new Date(), }; Object.assign(data, { ...body, ...meta }); const history = new ProfileDevelopmentHistory(); Object.assign(history, { ...data, id: undefined }); await this.developmentRepository.save(data); history.profileDevelopmentId = data.id; await this.developmentHistoryRepository.save(history); if (body.developmentProjects != null) { await Promise.all( body.developmentProjects.map(async (x) => { let developmentProject = new DevelopmentProject(); let developmentProjectHistory = new DevelopmentProject(); Object.assign(developmentProject, { ...meta, name: x, profileDevelopmentId: data.id, }); Object.assign(developmentProject, { ...meta, name: x, profileDevelopmentHistoryId: history.id, }); await Promise.all([ this.developmentProjectRepository.save(developmentProject), this.developmentProjectRepository.save(developmentProjectHistory), ]); }), ); } return new HttpSuccess(); } @Patch("{developmentId}") public async editDevelopment( @Request() req: RequestWithUser, @Body() body: UpdateProfileDevelopment, @Path() developmentId: string, ) { await new permission().PermissionUpdate(req, "SYS_REGISTRY_TEMP"); const record = await this.developmentRepository.findOne({ where: { id: developmentId }, }); if (!record) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); const history = new ProfileDevelopmentHistory(); Object.assign(record, body); Object.assign(history, { ...record, id: undefined }); history.profileDevelopmentId = developmentId; record.lastUpdateUserId = req.user.sub; record.lastUpdateFullName = req.user.name; record.lastUpdatedAt = new Date(); history.lastUpdateUserId = req.user.sub; history.lastUpdateFullName = req.user.name; history.createdUserId = req.user.sub; history.createdFullName = req.user.name; history.createdAt = new Date(); history.lastUpdatedAt = new Date(); await Promise.all([ this.developmentRepository.save(record), this.developmentHistoryRepository.save(history), ]); await this.developmentProjectRepository.delete({ profileDevelopmentId: record.id }); if (body.developmentProjects != null) { const meta = { createdUserId: req.user.sub, createdFullName: req.user.name, lastUpdateUserId: req.user.sub, lastUpdateFullName: req.user.name, createdAt: new Date(), lastUpdatedAt: new Date(), }; await Promise.all( body.developmentProjects.map(async (x) => { let developmentProject = new DevelopmentProject(); let developmentProjectHistory = new DevelopmentProject(); Object.assign(developmentProject, { ...meta, name: x, profileDevelopmentId: record.id, }); Object.assign(developmentProject, { ...meta, name: x, profileDevelopmentHistoryId: history.id, }); await Promise.all([ this.developmentProjectRepository.save(developmentProject), this.developmentProjectRepository.save(developmentProjectHistory), ]); }), ); } return new HttpSuccess(); } @Delete("{developmentId}") public async deleteDevelopment(@Path() developmentId: string, @Request() req: RequestWithUser) { await new permission().PermissionDelete(req, "SYS_REGISTRY_TEMP"); await this.developmentHistoryRepository.delete({ profileDevelopmentId: developmentId, }); const result = await this.developmentRepository.delete({ id: developmentId }); if (result.affected == undefined || result.affected <= 0) { throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); } return new HttpSuccess(); } }