mirror of
https://github.com/R0m1k3/CollectFlow.git
synced 2026-10-11 17:26:32 +02:00
feat: Add API to save session snapshots and initialize the corresponding database table.
This commit is contained in:
1 parent
77fb61ef79
commit
3b3021d85f
2 files changed
+65
-3
No files matched your search
@@ -0,0 +1,25 @@
|
||||
"use server";
|
||||
|
||||
import { db } from "@/db";
|
||||
import { sql } from "drizzle-orm";
|
||||
|
||||
export async function initSnapshotTable() {
|
||||
try {
|
||||
await db.execute(sql`
|
||||
CREATE TABLE IF NOT EXISTS session_snapshots (
|
||||
id SERIAL PRIMARY KEY,
|
||||
code_fournisseur VARCHAR(20) NOT NULL,
|
||||
nom_fournisseur VARCHAR(255),
|
||||
magasin VARCHAR(20) NOT NULL,
|
||||
changes JSONB NOT NULL,
|
||||
summary_json JSONB,
|
||||
label TEXT,
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
`);
|
||||
return { success: true };
|
||||
} catch (err) {
|
||||
console.error("Init DB error:", err);
|
||||
return { success: false, error: err instanceof Error ? err.message : String(err) };
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
import { db } from "@/db";
|
||||
import { sessionSnapshots } from "@/db/schema";
|
||||
import { z } from "zod";
|
||||
import { sql } from "drizzle-orm";
|
||||
|
||||
const SaveSnapshotSchema = z.object({
|
||||
codeFournisseur: z.string(),
|
||||
@@ -44,8 +45,44 @@ export async function saveSnapshot(raw: unknown) {
|
||||
.returning({ id: sessionSnapshots.id });
|
||||
|
||||
return { success: true, snapshotId: created?.id };
|
||||
} catch (err) {
|
||||
console.error("Snapshot DB insertion error:", err);
|
||||
return { success: false, error: "Database error during insertion" };
|
||||
} catch (err: any) {
|
||||
console.error("Snapshot DB error, attempting auto-repair:", err);
|
||||
|
||||
// Si la table n'existe pas, on tente de la créer
|
||||
if (err.message?.includes("relation") && err.message?.includes("does not exist")) {
|
||||
try {
|
||||
await db.execute(sql`
|
||||
CREATE TABLE IF NOT EXISTS session_snapshots (
|
||||
id SERIAL PRIMARY KEY,
|
||||
code_fournisseur VARCHAR(20) NOT NULL,
|
||||
nom_fournisseur VARCHAR(255),
|
||||
magasin VARCHAR(20) NOT NULL,
|
||||
changes JSONB NOT NULL,
|
||||
summary_json JSONB,
|
||||
label TEXT,
|
||||
created_at TIMESTAMP DEFAULT NOW()
|
||||
);
|
||||
`);
|
||||
// On ré-essaie l'insertion une seule fois
|
||||
const [created] = await db
|
||||
.insert(sessionSnapshots)
|
||||
.values({
|
||||
codeFournisseur,
|
||||
nomFournisseur: nomFournisseur ?? null,
|
||||
magasin,
|
||||
label: label ?? `Snapshot — ${new Date().toLocaleDateString("fr-FR")}`,
|
||||
changes,
|
||||
summaryJson: summary ?? null,
|
||||
})
|
||||
.returning({ id: sessionSnapshots.id });
|
||||
return { success: true, snapshotId: created?.id };
|
||||
} catch (repairErr: any) {
|
||||
console.error("Auto-repair failed:", repairErr);
|
||||
return { success: false, error: `Repair failed: ${repairErr.message}` };
|
||||
}
|
||||
}
|
||||
|
||||
const errorMessage = err instanceof Error ? err.message : String(err);
|
||||
return { success: false, error: `DB Error: ${errorMessage}` };
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user