feat: bootstrap commercial AI drama platform

This commit is contained in:
xz
2026-08-24 10:24:34 +08:00
commit ffb27d845b
100 changed files with 35314 additions and 0 deletions
+53
View File
@@ -0,0 +1,53 @@
import assert from "node:assert/strict";
import { unlink } from "node:fs/promises";
import { resolve } from "node:path";
const api = process.env.AI_DRAMA_API_BASE || "http://127.0.0.1:8787";
async function request(path, headers, options = {}) {
const response = await fetch(`${api}${path}`, {
...options,
headers: { "content-type": "application/json", ...(headers || {}), ...(options.headers || {}) }
});
const payload = await response.json().catch(() => ({}));
return { response, payload };
}
async function login(email) {
const result = await request("/api/auth/login", null, { method: "POST", body: JSON.stringify({ email, password: "Demo@123456" }) });
assert.equal(result.response.ok, true, `${email} 登录失败`);
return { authorization: `Bearer ${result.payload.session.token}` };
}
const owner = await login("producer@local.test");
const writer = await login("writer@local.test");
let createdRelativePath = "";
try {
const denied = await request("/api/system/readiness", writer);
assert.equal(denied.response.status, 403, "普通用户不应读取系统生产就绪度");
const readiness = await request("/api/system/readiness", owner);
assert.equal(readiness.response.ok, true, "系统管理员读取生产就绪度失败");
assert.ok(Array.isArray(readiness.payload.checks), "生产就绪度缺少检查项");
assert.equal(readiness.payload.activeRuntime.database, "node:sqlite", "当前业务数据库运行时记录不准确");
assert.ok(readiness.payload.checks.some((check) => check.key === "database-backup"), "生产就绪度缺少备份检查");
const created = await request("/api/system/backups", owner, { method: "POST", body: "{}" });
assert.equal(created.response.status, 201, `创建数据库快照失败:${JSON.stringify(created.payload)}`);
assert.ok(created.payload.backup?.relativePath, "数据库快照缺少相对路径");
assert.ok(Number(created.payload.backup.bytes) > 0, "数据库快照文件为空");
createdRelativePath = created.payload.backup.relativePath;
const backups = await request("/api/system/backups", owner);
assert.equal(backups.response.ok, true, "读取数据库快照列表失败");
assert.ok(backups.payload.backups.some((backup) => backup.relativePath === createdRelativePath), "数据库快照没有出现在列表中");
const readinessAfterBackup = await request("/api/system/readiness", owner);
assert.equal(readinessAfterBackup.response.ok, true, "创建快照后读取生产就绪度失败");
assert.ok(readinessAfterBackup.payload.backups.latest?.relativePath === createdRelativePath, "生产就绪度没有反映最近快照");
console.log(`readiness smoke passed: ${api}`);
} finally {
if (createdRelativePath) await unlink(resolve(process.cwd(), createdRelativePath)).catch(() => {});
}