import type { CalibrationEvent, PerformanceSnapshot, PublicationRecord, RubricVersion, ScoringRun, } from "../calibration/types"; import type { ConfirmedFactCard, OptimizedArticle, QaReport } from "../domain/types"; import type { ArticleJob, BrandTemplate, NewArticleJob, NewBrandTemplate, } from "./repositories"; import { getAppCloudflareEnv, type AppCloudflareEnv } from "../runtime/cloudflare"; import { createD1Repository } from "./d1-repository"; import { createSqliteRepository } from "./sqlite-repository"; export interface AppRepository { createBrandTemplate(input: NewBrandTemplate): Promise; listBrandTemplates(): Promise; getBrandTemplate(id: string): Promise; createArticleJob(input: NewArticleJob): Promise; getArticleJob(id: string): Promise; updateArticleJob( id: string, changes: Partial>, ): Promise; saveFactCard( jobId: string, factCard: ConfirmedFactCard, ): Promise<{ job_id: string } & ConfirmedFactCard>; getFactCard(jobId: string): Promise<({ job_id: string } & ConfirmedFactCard) | null>; saveOptimizedArticle(jobId: string, article: OptimizedArticle): Promise; getLatestOptimizedArticle(jobId: string): Promise; saveQaReport(jobId: string, revision: number, report: QaReport): Promise; getLatestQaReport(jobId: string): Promise; saveRubricVersion(rubric: RubricVersion): Promise; saveScoringRun(run: ScoringRun): Promise; getLatestScoringRun(jobId: string, revision: number): Promise; createPublicationRecord( input: Omit, ): Promise; listPublicationRecords(jobId: string): Promise; getPublicationRecord(id: string): Promise; savePerformanceSnapshot(snapshot: PerformanceSnapshot): Promise; listPerformanceSnapshots(publicationId: string): Promise; saveCalibrationEvent(event: CalibrationEvent): Promise; } interface RuntimeRepositoryOptions { appRuntime?: string; dbPath?: string; cloudflareEnv?: AppCloudflareEnv; } export function getRepositoryFromRuntime( options: RuntimeRepositoryOptions = {}, ): AppRepository { const appRuntime = options.appRuntime ?? process.env.APP_RUNTIME; if (appRuntime === "cloudflare") { const env = options.cloudflareEnv ?? getAppCloudflareEnv(); if (!env?.DB) { throw new Error("Cloudflare D1 binding DB is required"); } return createD1Repository(env.DB); } return createSqliteRepository(options.dbPath); }