93 lines
3.0 KiB
TypeScript
93 lines
3.0 KiB
TypeScript
|
|
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;
|
||
|
|
}
|
||
|
|
}
|