import type { Kysely } from "kysely"; import { dropTables, entityTable, execDdl } from "../src/migration-helpers.ts"; // W5-A 文件管理(docs/runbook/files.md): // - trash_item:删除进回收站的记录(原根/原相对路径/回收站内路径/到期时间/关联资产快照); // 还原或清除后删行(历史留在 audit_event)。root_id 为文件管理的根 id(lib: / dl::)。 // - artifact_files_idem_key:文件管理写操作的幂等键(artifact title='files_idem',content.key)唯一。 // biome-ignore lint/suspicious/noExplicitAny: 迁移不依赖应用表类型 export async function up(db: Kysely): Promise { await execDdl( db, ` ${entityTable( "trash_item", ` root_id text not null, library_root_id uuid references library_root (id) on delete set null, root_host_path text not null, original_path text not null, trash_path text not null, is_dir boolean not null default false, size_bytes bigint not null default 0, actor text, deleted_at timestamptz not null default now(), expires_at timestamptz not null, asset_snapshot jsonb, constraint trash_item_trash_path_key unique (trash_path)`, )} create index trash_item_expires_idx on trash_item (expires_at); create index trash_item_root_idx on trash_item (root_id, deleted_at desc); create unique index artifact_files_idem_key on artifact ((content->>'key')) where title = 'files_idem'; `, ); } // biome-ignore lint/suspicious/noExplicitAny: 同上 export async function down(db: Kysely): Promise { await execDdl(db, `drop index if exists artifact_files_idem_key;\n${dropTables(["trash_item"])}`); }