fix: align attachment storage model
This commit is contained in:
80
scripts/verify-attachment-storage-model.mjs
Normal file
80
scripts/verify-attachment-storage-model.mjs
Normal file
@@ -0,0 +1,80 @@
|
||||
#!/usr/bin/env node
|
||||
import { mkdtemp, copyFile } from "node:fs/promises";
|
||||
import { existsSync } from "node:fs";
|
||||
import os from "node:os";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import { createRequire } from "node:module";
|
||||
|
||||
const rootDir = process.cwd();
|
||||
const scriptDir = path.dirname(fileURLToPath(import.meta.url));
|
||||
const require = createRequire(import.meta.url);
|
||||
const jiti = require("jiti")(fileURLToPath(import.meta.url), {
|
||||
alias: {
|
||||
"@/": `${path.join(rootDir, "src")}/`,
|
||||
},
|
||||
});
|
||||
|
||||
const tempDir = await mkdtemp(path.join(os.tmpdir(), "boss-attachment-model-"));
|
||||
const tempStateFile = path.join(tempDir, "boss-state.json");
|
||||
const sourceStateFile = path.join(rootDir, "data", "boss-state.json");
|
||||
|
||||
if (!existsSync(sourceStateFile)) {
|
||||
throw new Error(`Missing state file: ${sourceStateFile}`);
|
||||
}
|
||||
|
||||
await copyFile(sourceStateFile, tempStateFile);
|
||||
process.env.BOSS_STATE_FILE = tempStateFile;
|
||||
process.env.BOSS_RUNTIME_ROOT = rootDir;
|
||||
|
||||
const { getAttachmentStorageConfig, readState, writeState } = jiti(path.join(scriptDir, "..", "src", "lib", "boss-data.ts"));
|
||||
|
||||
const config = await getAttachmentStorageConfig("17600003315");
|
||||
if (config.mode !== "server_file") {
|
||||
throw new Error(`Expected default storage mode server_file, got ${config.mode}`);
|
||||
}
|
||||
if (!config.updatedAt || typeof config.updatedAt !== "string") {
|
||||
throw new Error("Expected updatedAt to be populated");
|
||||
}
|
||||
|
||||
const state = await readState();
|
||||
const messageId = "script-attachment-message";
|
||||
state.projects[0].messages.unshift({
|
||||
id: messageId,
|
||||
sender: "user",
|
||||
senderLabel: "测试用户",
|
||||
body: "Attachment round-trip",
|
||||
sentAt: "2026-03-29T00:00:00+08:00",
|
||||
kind: "attachment",
|
||||
attachments: [
|
||||
{
|
||||
attachmentId: "att-001",
|
||||
fileName: "demo.txt",
|
||||
mimeType: "text/plain",
|
||||
fileSizeBytes: 12,
|
||||
attachmentKind: "text",
|
||||
storageBackend: "server_file",
|
||||
storagePath: "/tmp/demo.txt",
|
||||
previewAvailable: true,
|
||||
uploadedAt: "2026-03-29T00:00:00+08:00",
|
||||
uploadedBy: "17600003315",
|
||||
analysisState: "not_applicable",
|
||||
},
|
||||
],
|
||||
});
|
||||
|
||||
await writeState(state);
|
||||
const reread = await readState();
|
||||
const message = reread.projects[0].messages.find((item) => item.id === messageId);
|
||||
|
||||
if (!message?.attachments?.length) {
|
||||
throw new Error("Expected message attachments to round-trip through state");
|
||||
}
|
||||
if (message.attachments[0].attachmentId !== "att-001") {
|
||||
throw new Error("Expected attachment metadata to persist");
|
||||
}
|
||||
if (message.attachments[0].storageBackend !== "server_file") {
|
||||
throw new Error("Expected attachment storage backend to persist");
|
||||
}
|
||||
|
||||
console.log("OK");
|
||||
Reference in New Issue
Block a user