From d04ed4258651633bbdeafecc7394c0a0ec008893 Mon Sep 17 00:00:00 2001 From: simoleo89 Date: Sat, 27 Jun 2026 14:34:59 +0200 Subject: [PATCH] feat(db): add users/currency/bans/settings read repositories --- packages/db/package.json | 1 + packages/db/src/index.ts | 8 ++++++++ packages/db/src/repositories/bans-repo.ts | 13 ++++++++++++ packages/db/src/repositories/currency-repo.ts | 16 +++++++++++++++ packages/db/src/repositories/settings-repo.ts | 15 ++++++++++++++ packages/db/src/repositories/users-repo.ts | 20 +++++++++++++++++++ pnpm-lock.yaml | 3 +++ 7 files changed, 76 insertions(+) create mode 100644 packages/db/src/index.ts create mode 100644 packages/db/src/repositories/bans-repo.ts create mode 100644 packages/db/src/repositories/currency-repo.ts create mode 100644 packages/db/src/repositories/settings-repo.ts create mode 100644 packages/db/src/repositories/users-repo.ts diff --git a/packages/db/package.json b/packages/db/package.json index 47bb2cb9a0..a31caf5f6f 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 0000000000..62436154c5 --- /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 0000000000..41eec6842a --- /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 0000000000..c3467cc83f --- /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 0000000000..3faafd6804 --- /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 0000000000..e7ac5ac45b --- /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 8f68e103bd..53527f1c3d 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))