feat(db): download_task 增加缺席记录与代数字段(迁移 0067)
missing_since / missing_count 记录 qB 里连续查不到的起点与轮数;generation 记录 removed 行复活次数,用于完成事件幂等键换代。contracts DownloadTask 同步为可选字段。 Co-Authored-By: Claude Opus 5.5 <[email protected]> Claude-Session: https://claude.ai/code/session_01Cxwgnn2pbzQ7rXv3rq7fei
This commit is contained in:
1 parent
00045a24cb
commit
3904abc472
3 files changed
+33
No files matched your search
@@ -223,6 +223,11 @@ export const DownloadTask = EntityBase.extend({
|
|||||||
removedAt: Timestamp.nullable(),
|
removedAt: Timestamp.nullable(),
|
||||||
fileList: z.array(z.object({ path: z.string(), size: NonNegInt, progress: z.number().optional() })).nullable(),
|
fileList: z.array(z.object({ path: z.string(), size: NonNegInt, progress: z.number().optional() })).nullable(),
|
||||||
lastError: JsonObject.nullable(),
|
lastError: JsonObject.nullable(),
|
||||||
|
/** 下载器里连续查不到的起点与轮数:达到阈值才判 removed,中途出现即清零 */
|
||||||
|
missingSince: Timestamp.nullable().optional(),
|
||||||
|
missingCount: NonNegInt.optional(),
|
||||||
|
/** removed 行被再次提交 / 接管复活的次数(完成事件幂等键随之换代) */
|
||||||
|
generation: NonNegInt.optional(),
|
||||||
});
|
});
|
||||||
export type DownloadTask = z.infer<typeof DownloadTask>;
|
export type DownloadTask = z.infer<typeof DownloadTask>;
|
||||||
export const DownloadTaskCreate = DownloadTask.pick({
|
export const DownloadTaskCreate = DownloadTask.pick({
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
import type { Kysely } from "kysely";
|
||||||
|
import { execDdl } from "../src/migration-helpers.ts";
|
||||||
|
|
||||||
|
// 下载调度卡死修复(docs/plan/system-review.md ③):
|
||||||
|
// - missing_since / missing_count:qB 列表与按 hash 查都查不到时先记缺席,连续多轮才判 removed,中途出现即清零
|
||||||
|
// - generation:同一 (实例, hash) 的 removed 行被再次提交 / 接管而复活时 +1,完成事件幂等键随之换代,
|
||||||
|
// 复活后的完成仍能触发整理
|
||||||
|
// biome-ignore lint/suspicious/noExplicitAny: 迁移不依赖应用表类型
|
||||||
|
export async function up(db: Kysely<any>): Promise<void> {
|
||||||
|
await execDdl(
|
||||||
|
db,
|
||||||
|
`alter table download_task add column if not exists missing_since timestamptz;
|
||||||
|
alter table download_task add column if not exists missing_count integer not null default 0;
|
||||||
|
alter table download_task add column if not exists generation integer not null default 0;`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// biome-ignore lint/suspicious/noExplicitAny: 同上
|
||||||
|
export async function down(db: Kysely<any>): Promise<void> {
|
||||||
|
await execDdl(
|
||||||
|
db,
|
||||||
|
`alter table download_task drop column if exists missing_since;
|
||||||
|
alter table download_task drop column if exists missing_count;
|
||||||
|
alter table download_task drop column if exists generation;`,
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -719,6 +719,9 @@ export interface DownloadTaskTable {
|
|||||||
updated_at: GeneratedTimestamptz;
|
updated_at: GeneratedTimestamptz;
|
||||||
media_entity_id: string | null;
|
media_entity_id: string | null;
|
||||||
import_plan_id: string | null;
|
import_plan_id: string | null;
|
||||||
|
missing_since: Timestamptz | null;
|
||||||
|
missing_count: Generated<number>;
|
||||||
|
generation: Generated<number>;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface DownloaderInstanceTable {
|
export interface DownloaderInstanceTable {
|
||||||
|
|||||||
Reference in new issue
Block a user