diff --git a/packages/db/package.json b/packages/db/package.json index 47bb2cb9..a31caf5f 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -11,6 +11,7 @@ "db:pull": "drizzle-kit pull" }, "dependencies": { + "@atomcms/settings": "workspace:*", "drizzle-orm": "^0.38.0", "mysql2": "^3.11.0" }, diff --git a/packages/db/src/index.ts b/packages/db/src/index.ts new file mode 100644 index 00000000..62436154 --- /dev/null +++ b/packages/db/src/index.ts @@ -0,0 +1,8 @@ +export { createDb } from "./client.js"; +export type { Database } from "./client.js"; +export * as schema from "./schema/index.js"; +export { isBanActive } from "./bans/is-ban-active.js"; +export { makeUsersRepo } from "./repositories/users-repo.js"; +export { makeCurrencyRepo } from "./repositories/currency-repo.js"; +export { makeBansRepo } from "./repositories/bans-repo.js"; +export { makeSettingsRepo } from "./repositories/settings-repo.js"; diff --git a/packages/db/src/repositories/bans-repo.ts b/packages/db/src/repositories/bans-repo.ts new file mode 100644 index 00000000..41eec684 --- /dev/null +++ b/packages/db/src/repositories/bans-repo.ts @@ -0,0 +1,13 @@ +import { eq } from "drizzle-orm"; +import type { Database } from "../client.js"; +import { bans } from "../schema/bans.js"; +import { isBanActive } from "../bans/is-ban-active.js"; + +export function makeBansRepo(db: Database) { + return { + activeForUser: async (userId: number, nowUnixSeconds: number) => { + const rows = await db.select().from(bans).where(eq(bans.userId, userId)); + return rows.filter((b) => isBanActive(b, nowUnixSeconds)); + }, + }; +} diff --git a/packages/db/src/repositories/currency-repo.ts b/packages/db/src/repositories/currency-repo.ts new file mode 100644 index 00000000..c3467cc8 --- /dev/null +++ b/packages/db/src/repositories/currency-repo.ts @@ -0,0 +1,16 @@ +import { eq } from "drizzle-orm"; +import type { Database } from "../client.js"; +import { usersCurrency } from "../schema/users-currency.js"; + +export function makeCurrencyRepo(db: Database) { + return { + // Returns a map of currency type -> amount for one user. + forUser: async (userId: number): Promise> => { + const rows = await db + .select() + .from(usersCurrency) + .where(eq(usersCurrency.userId, userId)); + return new Map(rows.map((r) => [r.type, r.amount])); + }, + }; +} diff --git a/packages/db/src/repositories/settings-repo.ts b/packages/db/src/repositories/settings-repo.ts new file mode 100644 index 00000000..3faafd68 --- /dev/null +++ b/packages/db/src/repositories/settings-repo.ts @@ -0,0 +1,15 @@ +import type { Database } from "../client.js"; +import { websiteSettings } from "../schema/website-settings.js"; +import type { SettingRow } from "@atomcms/settings"; + +export function makeSettingsRepo(db: Database) { + return { + // Shaped to match @atomcms/settings SettingsFetcher. + all: async (): Promise => { + const rows = await db + .select({ key: websiteSettings.key, value: websiteSettings.value }) + .from(websiteSettings); + return rows; + }, + }; +} diff --git a/packages/db/src/repositories/users-repo.ts b/packages/db/src/repositories/users-repo.ts new file mode 100644 index 00000000..e7ac5ac4 --- /dev/null +++ b/packages/db/src/repositories/users-repo.ts @@ -0,0 +1,20 @@ +import { eq } from "drizzle-orm"; +import type { Database } from "../client.js"; +import { users } from "../schema/users.js"; + +export function makeUsersRepo(db: Database) { + return { + findById: async (id: number) => { + const rows = await db.select().from(users).where(eq(users.id, id)).limit(1); + return rows[0] ?? null; + }, + findByUsername: async (username: string) => { + const rows = await db + .select() + .from(users) + .where(eq(users.username, username)) + .limit(1); + return rows[0] ?? null; + }, + }; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8f68e103..53527f1c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,6 +26,9 @@ importers: packages/db: dependencies: + '@atomcms/settings': + specifier: workspace:* + version: link:../settings drizzle-orm: specifier: ^0.38.0 version: 0.38.4(mysql2@3.22.5(@types/node@22.20.0))