From 3e3d2cf01cae8cdd53f14216518f5f68a8d4fadf Mon Sep 17 00:00:00 2001 From: Methapon2001 <61303214+Methapon2001@users.noreply.github.com> Date: Fri, 28 Jun 2024 08:57:53 +0700 Subject: [PATCH] feat: employee history --- prisma/schema.prisma | 14 +++++++++++ src/controllers/employee-controller.ts | 33 ++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 14d9d71..6a2e62b 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -472,6 +472,20 @@ model Employee { employeeCheckup EmployeeCheckup[] employeeWork EmployeeWork[] employeeOtherInfo EmployeeOtherInfo[] + + editHistory EmployeeHistory[] +} + +model EmployeeHistory { + id String @id @default(uuid()) + field String + valueBefore Json + valueAfter Json + + timestamp DateTime @default(now()) + + masterId String + master Employee @relation(fields: [masterId], references: [id], onDelete: Cascade) } model EmployeeCheckup { diff --git a/src/controllers/employee-controller.ts b/src/controllers/employee-controller.ts index edb780b..abd7c83 100644 --- a/src/controllers/employee-controller.ts +++ b/src/controllers/employee-controller.ts @@ -635,6 +635,32 @@ export class EmployeeController extends Controller { }); }); + const historyEntries: { field: string; valueBefore: string; valueAfter: string }[] = []; + + for (const k of Object.keys(body)) { + const field = k as keyof typeof body; + + if (field === "employeeCheckup") continue; + if (field === "employeeOtherInfo") continue; + if (field === "employeeWork") continue; + + let valueBefore = employee[field]; + let valueAfter = body[field]; + + if (valueBefore === undefined && valueAfter === undefined) continue; + + if (valueBefore instanceof Date) valueBefore = valueBefore.toISOString(); + if (valueBefore === null || valueBefore === undefined) valueBefore = ""; + if (valueAfter instanceof Date) valueAfter = valueAfter.toISOString(); + if (valueAfter === null || valueAfter === undefined) valueAfter = ""; + + if (valueBefore !== valueAfter) historyEntries.push({ field, valueBefore, valueAfter }); + } + + await prisma.employeeHistory.createMany({ + data: historyEntries.map((v) => ({ ...v, masterId: employee.id })), + }); + return Object.assign(record, { profileImageUrl: await presignedGetObjectIfExist( MINIO_BUCKET, @@ -663,4 +689,11 @@ export class EmployeeController extends Controller { return await prisma.employee.delete({ where: { id: employeeId } }); } + + @Get("{employeeId}/edit-history") + async editHistory(@Path() employeeId: string) { + return await prisma.employeeHistory.findMany({ + where: { masterId: employeeId }, + }); + } }