From 2e6eedb797b6ab9a3fe043f3499f21787cf8aefb Mon Sep 17 00:00:00 2001 From: Net <93821485+somnetsak123@users.noreply.github.com> Date: Wed, 13 Mar 2024 11:42:07 +0700 Subject: [PATCH] feat: profile ability endpoints --- src/controllers/ProfileAbilityController.ts | 187 ++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 src/controllers/ProfileAbilityController.ts diff --git a/src/controllers/ProfileAbilityController.ts b/src/controllers/ProfileAbilityController.ts new file mode 100644 index 00000000..6d7cafb5 --- /dev/null +++ b/src/controllers/ProfileAbilityController.ts @@ -0,0 +1,187 @@ +import { + Body, + Controller, + Delete, + Example, + Get, + Patch, + Path, + Post, + Request, + Route, + Security, + Tags, +} from "tsoa"; +import { AppDataSource } from "../database/data-source"; +import { Profile } from "../entities/Profile"; +import { + CreateProfileAbility, + ProfileAbility, + UpdateProfileAbility, +} from "../entities/ProfileAbility"; +import { ProfileAbilityHistory } from "../entities/ProfileAbilityHistory"; +import { RequestWithUser } from "../middlewares/user"; +import HttpError from "../interfaces/http-error"; +import HttpStatus from "../interfaces/http-status"; +import HttpSuccess from "../interfaces/http-success"; + +@Route("api/v1/org/profile/ability") +@Tags("ProfileAbility") +@Security("bearerAuth") +export class ProfileAbilityController extends Controller { + private profileRepo = AppDataSource.getRepository(Profile); + private profileAbilityRepo = AppDataSource.getRepository(ProfileAbility); + private profileAbilityHistoryRepo = AppDataSource.getRepository(ProfileAbilityHistory); + + @Get("{profileId}") + @Example({ + status: 200, + message: "สำเร็จ", + result: [ + { + id: "ad7d0955-7bcd-4ed0-911c-2edceba12579", + createdAt: "2024-03-12T21:37:35.037Z", + createdUserId: "59134ef9-9e62-41d0-aac5-339be727f2b0", + lastUpdatedAt: "2024-03-12T21:37:35.037Z", + lastUpdateUserId: "59134ef9-9e62-41d0-aac5-339be727f2b0", + createdFullName: "test bar", + lastUpdateFullName: "test bar", + profileId: "1526d9d3-d8b1-43ab-81b5-a84dfbe99201", + isActive: true, + remark: "ต้องส่งให้ทันก่อนวันที่ 15 มีนาคม", + detail: "-", + reference: "-", + dateStart: "2024-03-13T04:36:06.000Z", + dateEnd: "2024-03-13T04:36:06.000Z", + field: "ความมั่นคง", + }, + ], + }) + public async detailProfileAbility(@Path() profileId: string) { + const getProfileAbilityId = await this.profileAbilityRepo.findBy({ profileId }); + if (!getProfileAbilityId) { + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + } + return new HttpSuccess(getProfileAbilityId); + } + + @Get("history/{abilityId}") + @Example({ + status: 200, + message: "สำเร็จ", + result: [ + { + id: "1c92cd8a-e176-48af-ac00-c018fb4c9895", + createdAt: "2024-03-12T21:38:56.342Z", + createdUserId: "00000000-0000-0000-0000-000000000000", + lastUpdatedAt: "2024-03-12T21:38:56.342Z", + lastUpdateUserId: "00000000-0000-0000-0000-000000000000", + createdFullName: "string", + lastUpdateFullName: "test bar", + isActive: true, + remark: "ต้องส่งให้ทันก่อนวันที่ 15 มีนาคม", + detail: "ด่วน", + reference: "-", + dateStart: "2024-03-13T04:36:06.000Z", + dateEnd: "2024-03-13T04:36:06.000Z", + field: "ความมั่นคง", + profileAbilityId: "ad7d0955-7bcd-4ed0-911c-2edceba12579", + }, + { + id: "2fb95768-cb62-40a3-9540-5a561d640959", + createdAt: "2024-03-12T21:39:06.094Z", + createdUserId: "00000000-0000-0000-0000-000000000000", + lastUpdatedAt: "2024-03-12T21:39:06.094Z", + lastUpdateUserId: "00000000-0000-0000-0000-000000000000", + createdFullName: "string", + lastUpdateFullName: "test bar", + isActive: true, + remark: "ต้องส่งให้ทันก่อนวันที่ 15 มีนาคม", + detail: "ด่วนมากสุด", + reference: "-", + dateStart: "2024-03-13T04:36:06.000Z", + dateEnd: "2024-03-13T04:36:06.000Z", + field: "ความมั่นคง", + profileAbilityId: "ad7d0955-7bcd-4ed0-911c-2edceba12579", + }, + ], + }) + public async getProfileAbilityHistory(@Path() abilityId: string) { + const record = await this.profileAbilityHistoryRepo.findBy({ + profileAbilityId: abilityId, + }); + if (!record) { + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + } + return new HttpSuccess(record); + } + + @Post() + public async newProfileAbility( + @Request() req: RequestWithUser, + @Body() body: CreateProfileAbility, + ) { + 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.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); + } + + const data = new ProfileAbility(); + 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.profileAbilityRepo.save(data); + + return this.setStatus(HttpStatus.NO_CONTENT); + } + + @Patch("{abilityId}") + public async editProfileAbility( + @Body() requestBody: UpdateProfileAbility, + @Request() req: RequestWithUser, + @Path() abilityId: string, + ) { + const record = await this.profileAbilityRepo.findOneBy({ id: abilityId }); + if (!record) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + + const history = new ProfileAbilityHistory(); + + Object.assign(record, requestBody); + Object.assign(history, { ...requestBody, id: undefined }); + + history.profileAbilityId = abilityId; + history.lastUpdateFullName = req.user.name; + record.lastUpdateFullName = req.user.name; + + await Promise.all([ + this.profileAbilityRepo.save(record), + this.profileAbilityHistoryRepo.save(history), + ]); + + return this.setStatus(HttpStatus.NO_CONTENT); + } + + @Delete("{abilityId}") + public async deleteProfileAbility(@Path() abilityId: string) { + await this.profileAbilityHistoryRepo.delete({ + profileAbilityId: abilityId, + }); + + const result = await this.profileAbilityRepo.delete({ id: abilityId }); + + if (result.affected && result.affected <= 0) + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + + return this.setStatus(HttpStatus.NO_CONTENT); + } +}