hrms-api-org/src/controllers/ProfileAssessmentsEmployeeController.ts

213 lines
6.9 KiB
TypeScript

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 {
CreateProfileEmployeeAssessment,
ProfileAssessment,
UpdateProfileAssessment,
} from "../entities/ProfileAssessment";
import { ProfileAssessmentHistory } from "../entities/ProfileAssessmentHistory";
import { ProfileEmployee } from "../entities/ProfileEmployee";
import { RequestWithUser } from "../middlewares/user";
@Route("api/v1/org/profile-employee/assessments")
@Tags("ProfileEmployeeAssessments")
@Security("bearerAuth")
export class ProfileAssessmentsEmployeeController extends Controller {
private profileEmployeeRepo = AppDataSource.getRepository(ProfileEmployee);
private profileAssessmentsRepository = AppDataSource.getRepository(ProfileAssessment);
private profileAssessmentsHistoryRepository =
AppDataSource.getRepository(ProfileAssessmentHistory);
@Get("user")
public async detailProfileAssessmentsUser(@Request() request: { user: Record<string, any> }) {
const profile = await this.profileEmployeeRepo.findOneBy({ keycloak: request.user.sub });
if (!profile) {
throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
}
const getProfileAssessments = await this.profileAssessmentsRepository.find({
where: { profileEmployeeId: profile.id },
});
if (!getProfileAssessments) {
throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล");
}
return new HttpSuccess(getProfileAssessments);
}
@Get("{profileEmployeeId}")
@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",
profileEmployeeId: "1526d9d3-d8b1-43ab-81b5-a84dfbe99201",
name: "สาวิตรี ศรีสมัย",
date: "2024-03-13T03:55:42.000Z",
point1: 0,
point1Total: 0,
point2: 0,
point2Total: 0,
pointSum: 0,
pointSumTotal: 0,
},
],
})
public async detailProfileAssessments(@Path() profileEmployeeId: string) {
const getProfileAssessments = await this.profileAssessmentsRepository.findBy({
profileEmployeeId,
});
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",
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",
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: CreateProfileEmployeeAssessment,
) {
if (!body.profileEmployeeId) {
throw new HttpError(HttpStatus.BAD_REQUEST, "กรุณากรอก profileEmployeeId");
}
const profile = await this.profileEmployeeRepo.findOneBy({ id: body.profileEmployeeId });
if (!profile) {
throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว");
}
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 new HttpSuccess();
}
@Patch("{assessmentId}")
public async editProfileAssessment(
@Body() requestBody: UpdateProfileAssessment,
@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(history, { ...record, id: undefined });
Object.assign(record, requestBody);
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 new HttpSuccess();
}
@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 == undefined || result.affected <= 0)
throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล");
return new HttpSuccess();
}
}