import { Injectable } from '@nestjs/common'; import { PrismaService } from '../prisma/prisma.service'; import { LogService } from '../log/log.service'; import { ObatService } from '../obat/obat.service'; import { RekammedisService } from '../rekammedis/rekammedis.service'; import { TindakanDokterService } from '../tindakandokter/tindakandokter.service'; import { sha256 } from '@api/common/crypto/hash'; @Injectable() export class AuditService { constructor( // private readonly prisma: PrismaService, private readonly logService: LogService, private readonly obatService: ObatService, private readonly rekamMedisService: RekammedisService, private readonly tindakanDokterService: TindakanDokterService, ) {} async getAuditTrails(pageSize: number, bookmark: string) { if (!pageSize || pageSize <= 0) { pageSize = 10; } if (!bookmark) { bookmark = ''; } const logs = await this.logService.getLogsWithPagination( pageSize, bookmark, ); console.log('Fetched logs:', logs); const flattenLogs = logs.logs.map((log: { value: any }) => { return { ...log.value, bookmark: logs.bookmark, }; }); const formattedLogs = await Promise.all( flattenLogs.map(async (log: any) => { let relatedData = null; let payloadData = null; let payloadHash = null; const id = log.id.split('_')[1]; if (log.event === 'obat_created' || log.event === 'obat_updated') { relatedData = await this.obatService.getObatById(parseInt(id)); payloadData = { id: relatedData?.id_visit, obat: relatedData?.obat, jumlah_obat: relatedData?.jumlah_obat, aturan_pakai: relatedData?.aturan_pakai, }; payloadHash = sha256(JSON.stringify(payloadData)); } else if ( log.event === 'rekam_medis_created' || log.event === 'rekam_medis_updated' ) { relatedData = await this.rekamMedisService.getRekamMedisById(id); payloadData = { dokter_id: 123, visit_id: relatedData?.id_visit, anamnese: relatedData?.anamnese, jenis_kasus: relatedData?.jenis_kasus, tindak_lanjut: relatedData?.tindak_lanjut, }; payloadHash = sha256(JSON.stringify(payloadData)); } else if ( log.event === 'tindakan_dokter_created' || log.event === 'tindakan_dokter_updated' ) { relatedData = await this.tindakanDokterService.getTindakanDokterById( parseInt(id), ); payloadData = { id_visit: relatedData?.id_visit, tindakan: relatedData?.tindakan, kategori_tindakan: relatedData?.kategori_tindakan, kelompok_tindakan: relatedData?.kelompok_tindakan, }; payloadHash = sha256(JSON.stringify(payloadData)); } return { ...log, isTampered: payloadHash === log.payload, }; }), ); return formattedLogs; } }