hospital-log/backend/api/src/modules/audit/audit.service.ts

93 lines
3.0 KiB
TypeScript
Raw Normal View History

2025-11-10 07:28:08 +00:00
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;
}
}