flnxi-Wu/lib/material-log.ts
WuYongJie d1c6efc79d
Some checks failed
CI Check / check (push) Has been cancelled
feat: NAS 部署与 Harbor 推送流程
2025-12-03 14:39:06 +08:00

102 lines
2.4 KiB
TypeScript

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)
}
}