refactor: enforce layered architecture by extracting all DB queries into @sofa/db/queries/*

- Create 18 new query modules under `packages/db/src/queries/` covering every domain (availability, cache, colors, credits, cron, discovery, image-cache, imports, integrations, lists, metadata, person, settings, system-health, thumbhash, title, tracking, webhooks)
- Remove all direct `db` client imports and raw Drizzle expressions from `@sofa/core` services and `apps/server` procedures/cron; replace with named query functions
- Extract cron DB helpers (`startCronRun`, `completeCronRun`, `failCronRun`, `getLibraryTitleIds`, `getStaleLibraryTitles`, etc.) into `packages/core/src/cron.ts`
- Extract integration DB helpers into `packages/core/src/integrations.ts`
- Add `drizzle-orm` as a direct dependency of `@sofa/db` and remove it from `@sofa/core`
- Update `AGENTS.md` to document the strict layered architecture rule
This commit is contained in:
2026-03-18 17:31:18 -04:00
parent 3a0374c825
commit 3c1b7cfe11
55 changed files with 3048 additions and 2079 deletions
+8 -11
View File
@@ -1,22 +1,19 @@
import { db } from "@sofa/db/client";
import { count, eq } from "@sofa/db/helpers";
import { appSettings, user } from "@sofa/db/schema";
import {
getSettingValue,
getUserCount as queryGetUserCount,
upsertSetting,
} from "@sofa/db/queries/settings";
export function getSetting(key: string): string | null {
const row = db.select().from(appSettings).where(eq(appSettings.key, key)).get();
return row?.value ?? null;
return getSettingValue(key);
}
export function setSetting(key: string, value: string): void {
db.insert(appSettings)
.values({ key, value })
.onConflictDoUpdate({ target: appSettings.key, set: { value } })
.run();
upsertSetting(key, value);
}
export function getUserCount(): number {
const result = db.select({ count: count() }).from(user).get();
return result?.count ?? 0;
return queryGetUserCount();
}
export function getInstanceId(): string {