import { Body, Controller, Delete, Get, Put, Path, Post, Request, Route, Security, Tags, } from "tsoa"; import prisma from "../db"; import HttpError from "../interfaces/http-error"; import HttpStatus from "../interfaces/http-status"; import { RequestWithUser } from "../interfaces/user"; const MANAGE_ROLES = ["system", "head_of_admin", "admin", "branch_manager", "head_of_sale", "sale"]; type EmployeeOtherInfoPayload = { citizenId?: string | null; fatherFirstName?: string | null; fatherLastName?: string | null; fatherBirthPlace?: string | null; motherFirstName?: string | null; motherLastName?: string | null; motherBirthPlace?: string | null; fatherFirstNameEN?: string | null; fatherLastNameEN?: string | null; motherFirstNameEN?: string | null; motherLastNameEN?: string | null; }; @Route("api/v1/employee/{employeeId}/other-info") @Tags("Employee Other Info") export class EmployeeOtherInfo extends Controller { @Get() @Security("keycloak") async list(@Path() employeeId: string) { return prisma.employeeOtherInfo.findFirst({ include: { createdBy: true, updatedBy: true, }, orderBy: { createdAt: "asc" }, where: { employeeId }, }); } @Post() @Security("keycloak", MANAGE_ROLES) async create( @Request() req: RequestWithUser, @Path() employeeId: string, @Body() body: EmployeeOtherInfoPayload, ) { if (!(await prisma.employee.findUnique({ where: { id: employeeId } }))) throw new HttpError(HttpStatus.BAD_REQUEST, "Employee cannot be found.", "employeeBadReq"); const record = await prisma.employeeOtherInfo.create({ include: { createdBy: true, updatedBy: true, }, data: { ...body, employee: { connect: { id: employeeId } }, createdBy: { connect: { id: req.user.sub } }, updatedBy: { connect: { id: req.user.sub } }, }, }); this.setStatus(HttpStatus.CREATED); return record; } @Put("{otherInfoId}") @Security("keycloak", MANAGE_ROLES) async editById( @Request() req: RequestWithUser, @Path() employeeId: string, @Path() otherInfoId: string, @Body() body: EmployeeOtherInfoPayload, ) { if (!(await prisma.employeeOtherInfo.findUnique({ where: { id: otherInfoId, employeeId } }))) { throw new HttpError( HttpStatus.NOT_FOUND, "Employee other info cannot be found.", "employeeOtherNotFound", ); } const record = await prisma.employeeOtherInfo.update({ include: { createdBy: true, updatedBy: true, }, where: { id: otherInfoId, employeeId }, data: { ...body, updatedByUserId: req.user.sub }, }); this.setStatus(HttpStatus.CREATED); return record; } @Delete("{otherInfoId}") @Security("keycloak", MANAGE_ROLES) async deleteById(@Path() employeeId: string, @Path() otherInfoId: string) { const record = await prisma.employeeOtherInfo.findFirst({ where: { id: otherInfoId, employeeId }, }); if (!record) { throw new HttpError( HttpStatus.NOT_FOUND, "Employee other info cannot be found.", "employeeOtherNotFound", ); } return await prisma.employeeOtherInfo.delete({ include: { createdBy: true, updatedBy: true, }, where: { id: otherInfoId, employeeId }, }); } }