export interface AuthorRow { name: string; displayName: string | null; addedAt: number; lastSyncedAt: number | null; note: string | null; } export interface WorkRow { id: string; author: string; title: string; duration: string | null; publishedAt: number | null; firstSeenAt: number; lastSeenAt: number; latestPriceYen: number | null; latestOnPromo: boolean; latestPricedAt: number | null; detailFetchedAt: number | null; } export interface PriceHistoryRow { id: string; priceYen: number; onPromo: boolean; observedAt: number; source: "listing" | "detail"; } export interface MagnetRow { id: string; magnetId: string; magnetUrl: string; title: string | null; fileSize: string | null; uploadTime: string | null; firstSeenAt: number; lastSeenAt: number; } export type SyncRunStatus = "running" | "ok" | "partial" | "error"; export interface SyncRunRow { id: number; author: string; startedAt: number; finishedAt: number | null; status: SyncRunStatus; newWorks: number; priceChanges: number; newMagnets: number; withDetail: boolean; withSukebei: boolean; errorMessage: string | null; } export interface PriceState { priceYen: number; onPromo: boolean; } export interface PriceObservation { id: string; priceYen: number; onPromo: boolean; observedAt: number; }