From f6ae26c3a1333a7a5ac5d943b71d0a1f520cdb11 Mon Sep 17 00:00:00 2001 From: Net <93821485+somnetsak123@users.noreply.github.com> Date: Wed, 13 Mar 2024 11:10:29 +0700 Subject: [PATCH] feat: profile assessments endpoints --- .../ProfileAssessmentsController.ts | 195 ++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 src/controllers/ProfileAssessmentsController.ts diff --git a/src/controllers/ProfileAssessmentsController.ts b/src/controllers/ProfileAssessmentsController.ts new file mode 100644 index 00000000..d6b82473 --- /dev/null +++ b/src/controllers/ProfileAssessmentsController.ts @@ -0,0 +1,195 @@ +import { + Controller, + Post, + Put, + Delete, + Route, + Security, + Tags, + Body, + Path, + Request, + SuccessResponse, + Response, + Get, + Query, + Patch, + Example, +} from "tsoa"; +import HttpError from "../interfaces/http-error"; +import HttpStatus from "../interfaces/http-status"; +import HttpSuccess from "../interfaces/http-success"; + +import { AppDataSource } from "../database/data-source"; +import { CreateProfileAssessment, ProfileAssessment } from "../entities/ProfileAssessment"; +import { ProfileAssessmentHistory } from "../entities/ProfileAssessmentHistory"; +import { Profile } from "../entities/Profile"; +import { RequestWithUser } from "../middlewares/user"; + +@Route("api/v1/org/profile/assessments") +@Tags("ProfileAssessments") +@Security("bearerAuth") +export class ProfileAssessmentsController extends Controller { + private profileRepo = AppDataSource.getRepository(Profile); + private profileAssessmentsRepository = AppDataSource.getRepository(ProfileAssessment); + private profileAssessmentsHistoryRepository = + AppDataSource.getRepository(ProfileAssessmentHistory); + + @Get("{profileId}") + @Example({ + status: 200, + message: "สำเร็จ", + result: [ + { + id: "f723bf42-a61c-4af4-ba8b-0e4ad0a89a80", + createdAt: "2024-03-12T20:56:45.986Z", + createdUserId: "59134ef9-9e62-41d0-aac5-339be727f2b0", + lastUpdatedAt: "2024-03-12T20:56:45.986Z", + lastUpdateUserId: "59134ef9-9e62-41d0-aac5-339be727f2b0", + createdFullName: "test bar", + lastUpdateFullName: "test bar", + profileId: "1526d9d3-d8b1-43ab-81b5-a84dfbe99201", + isActive: true, + name: "สาวิตรี ศรีสมัย", + date: "2024-03-13T03:55:42.000Z", + point1: 0, + point1Total: 0, + point2: 0, + point2Total: 0, + pointSum: 0, + pointSumTotal: 0, + }, + ], + }) + public async detailProfileAssessments(@Path() profileId: string) { + const getProfileAssessments = await this.profileAssessmentsRepository.findBy({ profileId }); + if (!getProfileAssessments) { + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + } + return new HttpSuccess(getProfileAssessments); + } + + @Get("history/{assessmentId}") + @Example({ + status: 200, + message: "สำเร็จ", + result: [ + { + id: "47b3e370-be05-4469-a34f-e4a04747f54e", + createdAt: "2024-03-12T20:59:39.774Z", + createdUserId: "00000000-0000-0000-0000-000000000000", + lastUpdatedAt: "2024-03-12T20:59:39.774Z", + lastUpdateUserId: "00000000-0000-0000-0000-000000000000", + createdFullName: "string", + lastUpdateFullName: "test bar", + isActive: true, + name: "สาวิตรี ศรีสมัย", + date: "2024-03-13T03:55:42.000Z", + point1: 0, + point1Total: 0, + point2: 100, + point2Total: 100, + pointSum: 100, + pointSumTotal: 100, + profileAssessmentId: "f723bf42-a61c-4af4-ba8b-0e4ad0a89a80", + }, + { + id: "ecff89b1-9bef-49a9-83f5-8be3cecb8ca7", + createdAt: "2024-03-12T20:58:19.450Z", + createdUserId: "00000000-0000-0000-0000-000000000000", + lastUpdatedAt: "2024-03-12T20:58:19.450Z", + lastUpdateUserId: "00000000-0000-0000-0000-000000000000", + createdFullName: "string", + lastUpdateFullName: "test bar", + isActive: true, + name: "สาวิตรี ศรีสมัย", + date: "2024-03-13T03:55:42.000Z", + point1: 50, + point1Total: 50, + point2: 100, + point2Total: 100, + pointSum: 150, + pointSumTotal: 150, + profileAssessmentId: "f723bf42-a61c-4af4-ba8b-0e4ad0a89a80", + }, + ], + }) + public async getProfileAssessmentsHistory(@Path() assessmentId: string) { + const record = await this.profileAssessmentsHistoryRepository.findBy({ + profileAssessmentId: assessmentId, + }); + + if (!record) { + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + } + + return new HttpSuccess(record); + } + + @Post() + public async profileAssessment( + @Request() req: RequestWithUser, + @Body() body: CreateProfileAssessment, + ) { + if (!body.profileId) { + throw new HttpError(HttpStatus.BAD_REQUEST, "กรุณากรอก profileId"); + } + + const profile = await this.profileRepo.findOneBy({ id: body.profileId }); + if (!profile) { + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + } + + const data = new ProfileAssessment(); + const meta = { + createdUserId: req.user.sub, + createdFullName: req.user.name, + lastUpdateUserId: req.user.sub, + lastUpdateFullName: req.user.name, + }; + Object.assign(data, { ...body, ...meta }); + + await this.profileAssessmentsRepository.save(data); + + return this.setStatus(HttpStatus.NO_CONTENT); + } + + @Patch("{assessmentId}") + public async editProfileAssessment( + @Body() requestBody: CreateProfileAssessment, + @Request() req: RequestWithUser, + @Path() assessmentId: string, + ) { + const record = await this.profileAssessmentsRepository.findOneBy({ id: assessmentId }); + if (!record) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + + const history = new ProfileAssessmentHistory(); + + Object.assign(record, requestBody); + Object.assign(history, { ...requestBody, id: undefined }); + + history.profileAssessmentId = assessmentId; + history.lastUpdateFullName = req.user.name; + record.lastUpdateFullName = req.user.name; + + await Promise.all([ + this.profileAssessmentsRepository.save(record), + this.profileAssessmentsHistoryRepository.save(history), + ]); + return this.setStatus(HttpStatus.NO_CONTENT); + } + + @Delete("{assessmentId}") + public async deleteProfileAssessment(@Path() assessmentId: string) { + await this.profileAssessmentsHistoryRepository.delete({ + profileAssessmentId: assessmentId, + }); + + const result = await this.profileAssessmentsRepository.delete({ id: assessmentId }); + + if (result.affected && result.affected <= 0) + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + + return this.setStatus(HttpStatus.NO_CONTENT); + } +}