feat: expand commercial ai drama platform
This commit is contained in:
@@ -8,8 +8,8 @@ const api = process.env.AI_DRAMA_API_BASE || "http://127.0.0.1:8787";
|
||||
const projectRoot = resolve(import.meta.dirname, "..");
|
||||
const organizationId = "org-studio-lab";
|
||||
const workspaceId = "ws-local-aidrama";
|
||||
const projectId = "thunder-mouth";
|
||||
const runId = Date.now();
|
||||
const projectId = `smoke-portal-project-${runId}`;
|
||||
const sourceRoot = `storage/smoke-delivery-portal-${runId}`;
|
||||
const sourcePath = `${sourceRoot}/clip.mp4`;
|
||||
const lastFramePath = `${sourceRoot}/actual-last-frame.jpg`;
|
||||
@@ -61,6 +61,12 @@ const reviewerLogin = expectOk(await request("/api/auth/login", {
|
||||
body: JSON.stringify({ email: "review@local.test", password: "Demo@123456" })
|
||||
}), "reviewer login");
|
||||
|
||||
const producerSetupHeaders = {
|
||||
authorization: `Bearer ${producerLogin.session.token}`,
|
||||
"x-organization-id": organizationId,
|
||||
"x-workspace-id": workspaceId,
|
||||
"x-project-id": "thunder-mouth"
|
||||
};
|
||||
const producerHeaders = {
|
||||
authorization: `Bearer ${producerLogin.session.token}`,
|
||||
"x-organization-id": organizationId,
|
||||
@@ -80,9 +86,7 @@ const crossOrganizationHeaders = {
|
||||
"x-project-id": "northstar-pilot"
|
||||
};
|
||||
|
||||
const projectShot = dbGet("SELECT id FROM shots WHERE episode_id IN (SELECT e.id FROM episodes e JOIN seasons se ON se.id = e.season_id JOIN series sr ON sr.id = se.series_id WHERE sr.project_id = ?) ORDER BY shot_number LIMIT 1", [projectId]);
|
||||
const producerUser = dbGet("SELECT id FROM users WHERE email = ?", ["producer@local.test"]);
|
||||
assert.ok(projectShot?.id, "smoke project must have a starter shot");
|
||||
assert.ok(producerUser?.id, "producer user must exist");
|
||||
|
||||
let channelId = "";
|
||||
@@ -91,8 +95,20 @@ let primaryToken = "";
|
||||
let expiredToken = "";
|
||||
let revokedToken = "";
|
||||
let seeded = false;
|
||||
let projectCreated = false;
|
||||
|
||||
try {
|
||||
const project = expectStatus(await request("/api/projects", {
|
||||
method: "POST",
|
||||
headers: producerSetupHeaders,
|
||||
body: JSON.stringify({ id: projectId, name: `门户烟测项目 ${runId}`, type: "AI 漫剧" })
|
||||
}), 201, "producer creates isolated portal project");
|
||||
projectCreated = true;
|
||||
assert.equal(project.project.id, projectId, "isolated portal project must be created");
|
||||
const graph = expectOk(await request("/api/production/graph", { headers: producerHeaders }), "read isolated portal graph");
|
||||
const projectShot = { id: graph.graph.shots[0]?.id };
|
||||
assert.ok(projectShot.id, "smoke project must have a starter shot");
|
||||
|
||||
const channels = expectOk(await request("/api/production/delivery-channels", { headers: reviewerHeaders }), "reviewer can view delivery channels");
|
||||
channelId = channels.channels.find((channel) => channel.kind === "local-file")?.id || "";
|
||||
assert.ok(channelId, "workspace must expose a local-file delivery channel");
|
||||
@@ -122,11 +138,13 @@ try {
|
||||
await writeFile(resolve(projectRoot, sourcePath), Buffer.from("fake local video evidence"));
|
||||
await writeFile(resolve(projectRoot, lastFramePath), Buffer.from("fake actual last frame evidence"));
|
||||
await writeFile(resolve(projectRoot, manifestPath), JSON.stringify({ schema: "smoke-delivery-portal-manifest", deliveryId: delivery.delivery.id }, null, 2));
|
||||
const timestamp = new Date().toISOString();
|
||||
dbRun("INSERT INTO delivery_batches(id, organization_id, workspace_id, project_id, delivery_id, batch_number, label, status, manifest_path, source_json, result_json, created_by, created_at, updated_at) VALUES (?, ?, ?, ?, ?, 1, 'smoke portal batch', 'active', ?, '{}', ?, ?, ?, ?)", [batchId, organizationId, workspaceId, projectId, delivery.delivery.id, manifestPath, JSON.stringify({ blockers: [], manifestWritten: true }), producerUser.id, timestamp, timestamp]);
|
||||
dbRun("INSERT INTO delivery_batch_items(id, batch_id, shot_id, sequence_number, source_path, actual_last_frame_path, source_sha256, metadata_json, created_at) VALUES (?, ?, ?, 1, ?, ?, ?, '{}', ?)", [`smoke-portal-item-${runId}`, batchId, projectShot.id, sourcePath, lastFramePath, "a".repeat(64), timestamp]);
|
||||
dbRun("UPDATE deliveries SET status = 'approved', active_batch_id = ?, approved_by = ?, approved_at = ?, updated_at = ? WHERE id = ?", [batchId, producerUser.id, timestamp, timestamp, delivery.delivery.id]);
|
||||
seeded = true;
|
||||
const timestamp = new Date().toISOString();
|
||||
dbRun("INSERT INTO delivery_batches(id, organization_id, workspace_id, project_id, delivery_id, batch_number, label, status, manifest_path, source_json, result_json, created_by, created_at, updated_at) VALUES (?, ?, ?, ?, ?, 1, 'smoke portal batch', 'active', ?, '{}', ?, ?, ?, ?)", [batchId, organizationId, workspaceId, projectId, delivery.delivery.id, manifestPath, JSON.stringify({ blockers: [], manifestWritten: true }), producerUser.id, timestamp, timestamp]);
|
||||
dbRun("INSERT INTO delivery_batch_items(id, batch_id, shot_id, sequence_number, source_path, actual_last_frame_path, source_sha256, metadata_json, created_at) VALUES (?, ?, ?, 1, ?, ?, ?, ?, ?)", [`smoke-portal-item-${runId}`, batchId, projectShot.id, sourcePath, lastFramePath, "a".repeat(64), JSON.stringify({ artifactStatus: "inspected" }), timestamp]);
|
||||
dbRun("UPDATE deliveries SET status = 'approved', active_batch_id = ?, approved_by = ?, approved_at = ?, updated_at = ? WHERE id = ?", [batchId, producerUser.id, timestamp, timestamp, delivery.delivery.id]);
|
||||
expectOk(await request("/api/production/reviews", { headers: producerHeaders }), "ensure portal QA reviews");
|
||||
dbRun("UPDATE reviews SET status = 'approved', score = 100, decision_by = ?, decision_at = ?, evidence_json = ?, updated_at = ? WHERE project_id = ?", [producerUser.id, timestamp, JSON.stringify({ source: "smoke-delivery-portal", checkedAt: timestamp }), timestamp, projectId]);
|
||||
seeded = true;
|
||||
|
||||
const release = expectStatus(await request(`/api/production/deliveries/${encodeURIComponent(delivery.delivery.id)}/releases`, {
|
||||
method: "POST",
|
||||
@@ -257,5 +275,17 @@ try {
|
||||
dbRun("DELETE FROM audit_logs WHERE target_id = ?", [deliveryId]);
|
||||
dbRun("DELETE FROM deliveries WHERE id = ?", [deliveryId]);
|
||||
}
|
||||
dbRun("DELETE FROM delivery_clearance_reports WHERE project_id = ?", [projectId]);
|
||||
dbRun("DELETE FROM reviews WHERE project_id = ?", [projectId]);
|
||||
if (projectCreated) {
|
||||
dbRun("DELETE FROM shots WHERE episode_id IN (SELECT id FROM episodes WHERE season_id IN (SELECT id FROM seasons WHERE series_id = ?))", [`series-${projectId}`]);
|
||||
dbRun("DELETE FROM episodes WHERE season_id IN (SELECT id FROM seasons WHERE series_id = ?)", [`series-${projectId}`]);
|
||||
dbRun("DELETE FROM seasons WHERE series_id = ?", [`series-${projectId}`]);
|
||||
dbRun("DELETE FROM series WHERE id = ?", [`series-${projectId}`]);
|
||||
dbRun("DELETE FROM audit_logs WHERE project_id = ? OR metadata_json LIKE ?", [projectId, `%${projectId}%`]);
|
||||
dbRun("DELETE FROM projects WHERE id = ?", [projectId]);
|
||||
}
|
||||
await rm(resolve(projectRoot, sourceRoot), { recursive: true, force: true });
|
||||
await rm(resolve(projectRoot, "storage", "deliveries", projectId), { recursive: true, force: true });
|
||||
await rm(resolve(projectRoot, "storage", "releases", projectId), { recursive: true, force: true });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user