import { prisma } from '@/lib/prisma' type MaterialLogChanges = Record< string, { oldValue: unknown newValue: unknown } > let materialLogsTableEnsured = false async function executeSafely(sql: string) { try { await prisma.$executeRawUnsafe(sql) } catch (error) { console.error('[MaterialLog] Failed to execute SQL:', error) } } export async function ensureMaterialLogsTable() { if (materialLogsTableEnsured) return await executeSafely(` CREATE TABLE IF NOT EXISTS "material_logs" ( "id" TEXT PRIMARY KEY, "materialId" TEXT NOT NULL, "userId" TEXT NOT NULL, "action" TEXT NOT NULL, "changes" JSONB, "timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP ) `) await executeSafely( `CREATE INDEX IF NOT EXISTS "material_logs_materialId_idx" ON "material_logs" ("materialId")` ) await executeSafely(`CREATE INDEX IF NOT EXISTS "material_logs_userId_idx" ON "material_logs" ("userId")`) await executeSafely( `CREATE INDEX IF NOT EXISTS "material_logs_timestamp_idx" ON "material_logs" ("timestamp")` ) await executeSafely(` DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM pg_constraint WHERE conname = 'material_logs_materialId_fkey' ) THEN ALTER TABLE "material_logs" ADD CONSTRAINT "material_logs_materialId_fkey" FOREIGN KEY ("materialId") REFERENCES "materials"("id") ON DELETE CASCADE ON UPDATE CASCADE; END IF; END $$; `) await executeSafely(` DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM pg_constraint WHERE conname = 'material_logs_userId_fkey' ) THEN ALTER TABLE "material_logs" ADD CONSTRAINT "material_logs_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE; END IF; END $$; `) materialLogsTableEnsured = true } interface CreateMaterialLogParams { materialId: string userId: string action: string changes?: MaterialLogChanges | null } export async function createMaterialLog({ materialId, userId, action, changes = null, }: CreateMaterialLogParams) { try { await ensureMaterialLogsTable() await (prisma as any).materialLog.create({ data: { materialId, userId, action, changes, }, }) } catch (error) { console.error('[MaterialLog] Failed to create log:', error) } }