import type { Kysely } from "kysely"; import { entityTable, execDdl, oneOf } from "../src/migration-helpers.ts"; // META-1 TMDB 缺失作品的元数据补全(REQ R03 / R10、§7.3、§7.5): // - metadata_enrichment:一次补全的记录(查询 → 网页搜索 / 读取 → 模型抽取出的建议;应用后指向建出的作品)。 // 每日预算按当天新建的行计数(命中归一化标题缓存不新建行);建议只存这里,应用前不写作品表。 // - metadata_field / field_override 的来源新增 web:值出自网页原文(Agent 改写 / 归纳的字段记 agent,不记 tmdb); // - metadata_field.evidence:字段证据(来源网页、证据等级、补全记录 id),作品详情"元数据来源"里显示链接。 const OLD_SOURCES = ["tmdb", "user", "agent", "nfo", "site", "import"] as const; const SOURCES = [...OLD_SOURCES, "web"] as const; // biome-ignore lint/suspicious/noExplicitAny: 迁移不依赖应用表类型 export async function up(db: Kysely): Promise { await execDdl( db, ` alter table metadata_field drop constraint metadata_field_source_check; alter table metadata_field add constraint metadata_field_source_check ${oneOf("source", SOURCES)}; alter table field_override drop constraint field_override_source_check; alter table field_override add constraint field_override_source_check ${oneOf("source", SOURCES)}; alter table metadata_field add column evidence jsonb; ${entityTable( "metadata_enrichment", ` identity_candidate_id uuid references identity_candidate (id) on delete set null, normalized_title text not null, query jsonb not null, status text not null default 'suggested' ${oneOf("status", ["suggested", "applied", "failed"])}, trigger text not null default 'manual' ${oneOf("trigger", ["manual", "auto", "agent"])}, suggestion jsonb, error text, usage jsonb not null default '{}'::jsonb, media_entity_id uuid references media_entity (id) on delete set null, applied_at timestamptz, applied_by text, created_by text`, )} create index metadata_enrichment_created_idx on metadata_enrichment (created_at); create index metadata_enrichment_candidate_idx on metadata_enrichment (identity_candidate_id, created_at desc); create index metadata_enrichment_title_idx on metadata_enrichment (normalized_title); `, ); } // biome-ignore lint/suspicious/noExplicitAny: 同上 export async function down(db: Kysely): Promise { await execDdl( db, ` drop table if exists metadata_enrichment; alter table metadata_field drop column if exists evidence; delete from metadata_field where source = 'web'; update field_override set source = 'agent' where source = 'web'; alter table metadata_field drop constraint metadata_field_source_check; alter table metadata_field add constraint metadata_field_source_check ${oneOf("source", OLD_SOURCES)}; alter table field_override drop constraint field_override_source_check; alter table field_override add constraint field_override_source_check ${oneOf("source", OLD_SOURCES)}; `, ); }