chore: initial project import
Some checks failed
CI - Production Readiness / Verify (push) Has been cancelled

This commit is contained in:
Wira Basalamah
2026-04-21 09:29:29 +07:00
commit adde003fba
222 changed files with 37657 additions and 0 deletions

50
lib/audit.ts Normal file
View File

@ -0,0 +1,50 @@
import { headers } from "next/headers";
import { prisma } from "@/lib/prisma";
export type AuditTrailParams = {
tenantId: string;
actorUserId?: string | null;
entityType: string;
entityId: string;
action: string;
metadata?: unknown;
ipAddress?: string | null;
userAgent?: string | null;
};
function serializeMetadata(metadata: unknown) {
if (typeof metadata === "undefined") {
return null;
}
try {
return JSON.stringify(metadata);
} catch {
return null;
}
}
export async function writeAuditTrail(params: AuditTrailParams) {
await prisma.auditLog.create({
data: {
tenantId: params.tenantId,
actorUserId: params.actorUserId,
entityType: params.entityType,
entityId: params.entityId,
action: params.action,
metadataJson: serializeMetadata(params.metadata),
ipAddress: params.ipAddress,
userAgent: params.userAgent
}
});
}
export async function getRequestAuditContext() {
const requestHeaders = await headers();
const forwardedFor = requestHeaders.get("x-forwarded-for");
const ipAddress = forwardedFor ? forwardedFor.split(",")[0]?.trim() : requestHeaders.get("x-real-ip");
const userAgent = requestHeaders.get("user-agent");
return { ipAddress, userAgent };
}