chore: initial project import
Some checks failed
CI - Production Readiness / Verify (push) Has been cancelled
Some checks failed
CI - Production Readiness / Verify (push) Has been cancelled
This commit is contained in:
50
lib/audit.ts
Normal file
50
lib/audit.ts
Normal 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 };
|
||||
}
|
||||
Reference in New Issue
Block a user