From 3bf3c9e1eb48bb1e3215eddeeb27af8ebc61011a Mon Sep 17 00:00:00 2001 From: yosaphatprs Date: Wed, 26 Nov 2025 16:59:44 +0700 Subject: [PATCH] feat: delete validation on admin at tindakna --- .../api/src/modules/audit/audit.service.ts | 50 +++++-------------- .../src/components/dashboard/DataTable.vue | 4 ++ .../dashboard/audit-trail/AuditTrailView.vue | 2 + 3 files changed, 18 insertions(+), 38 deletions(-) diff --git a/backend/api/src/modules/audit/audit.service.ts b/backend/api/src/modules/audit/audit.service.ts index e4eb9b3..0f24b4f 100644 --- a/backend/api/src/modules/audit/audit.service.ts +++ b/backend/api/src/modules/audit/audit.service.ts @@ -84,30 +84,6 @@ export class AuditService { let bookmark = ''; let processedCount = 0; - // try { - // const intervalId = setInterval(() => { - // processedCount++; - // const progressData = { - // status: 'RUNNING', - // progress_count: processedCount, - // }; - - // this.logger.log('Mengirim progres via WebSocket:', progressData); - // // PANGGIL FUNGSI GATEWAY - // this.auditGateway.sendProgress(progressData); - - // if (processedCount >= BATCH_SIZE) { - // clearInterval(intervalId); - // const completeData = { status: 'COMPLETED' }; - // this.logger.log('Mengirim selesai via WebSocket:', completeData); - // // PANGGIL FUNGSI GATEWAY - // this.auditGateway.sendComplete(completeData); - // } - // }, 500); - // } catch (error) { - // console.error('Tes streaming GAGAL', error); - // } - try { while (true) { const pageResults = await this.logService.getLogsWithPagination( @@ -135,15 +111,6 @@ export class AuditService { ) ).filter((record): record is AuditRecordPayload => record !== null); - // const records: AuditRecordPayload[] = []; - // for (let index = 0; index < logs.length; index++) { - // const record = await this.buildAuditRecord(logs[index], index); - // if (record !== null) { - // records.push(record); - // } - // await new Promise((resolve) => setTimeout(resolve, 250)); - // } - if (records.length > 0) { await this.prisma.$transaction( records.map((record) => @@ -252,9 +219,8 @@ export class AuditService { } let dbHash: string | null = null; - // try { - if (logId.startsWith('OBAT_')) { + if (logId.startsWith('OBAT')) { const obatId = this.extractNumericId(logId); if (obatId !== null) { const obat = await this.obatService.getObatById(obatId); @@ -302,9 +268,17 @@ export class AuditService { console.warn(`Failed to resolve related data for log ${logId}:`, err); } - const isNotTampered = dbHash - ? await this.compareData(blockchainHash, dbHash) - : false; + let isNotTampered = false; + const eventType = logEntry.value.event?.split('_').at(-1); + + if (eventType === 'deleted') { + isNotTampered = true; + console.log('Detected deleted event, marking as not tempered'); + } else { + const hashesMatch = + dbHash && (await this.compareData(blockchainHash, dbHash)); + isNotTampered = Boolean(hashesMatch); + } const result: ResultStatus = isNotTampered ? 'non_tampered' : 'tampered'; diff --git a/frontend/hospital-log/src/components/dashboard/DataTable.vue b/frontend/hospital-log/src/components/dashboard/DataTable.vue index a40eb5d..2637d0e 100644 --- a/frontend/hospital-log/src/components/dashboard/DataTable.vue +++ b/frontend/hospital-log/src/components/dashboard/DataTable.vue @@ -42,6 +42,10 @@ const formatCellValue = (item: T, columnKey: keyof T) => { if (segments.length >= 2 && segments[segments.length - 1] === "updated") { return "UPDATE"; } + + if (segments.length >= 2 && segments[segments.length - 1] === "deleted") { + return "DELETE"; + } } return value; diff --git a/frontend/hospital-log/src/views/dashboard/audit-trail/AuditTrailView.vue b/frontend/hospital-log/src/views/dashboard/audit-trail/AuditTrailView.vue index 77ef06b..19170ef 100644 --- a/frontend/hospital-log/src/views/dashboard/audit-trail/AuditTrailView.vue +++ b/frontend/hospital-log/src/views/dashboard/audit-trail/AuditTrailView.vue @@ -218,6 +218,8 @@ const fetchData = async () => { `/audit/trail${params.toString() ? `?${params.toString()}` : ""}` ); + console.log("Audit Log Response:", response); + const apiResponse = response as any; pagination.totalCount.value = apiResponse.totalCount;