feat(db): add users/currency/bans/settings read repositories

This commit is contained in:
Simo committed 2026-06-27 14:34:59 +02:00
1 parent 3e3776b477
commit d04ed42586
7 files changed
+76

No files matched your search

+1
View File
@@ -11,6 +11,7 @@
"db:pull": "drizzle-kit pull"
},
"dependencies": {
"@atomcms/settings": "workspace:*",
"drizzle-orm": "^0.38.0",
"mysql2": "^3.11.0"
},
+8
View File
@@ -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";
+13
View File
@@ -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));
},
};
}
@@ -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<Map<number, number>> => {
const rows = await db
.select()
.from(usersCurrency)
.where(eq(usersCurrency.userId, userId));
return new Map(rows.map((r) => [r.type, r.amount]));
},
};
}
@@ -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<SettingRow[]> => {
const rows = await db
.select({ key: websiteSettings.key, value: websiteSettings.value })
.from(websiteSettings);
return rows;
},
};
}
@@ -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;
},
};
}
+3
View File
@@ -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([email protected](@types/[email protected]))