feat(db): add users/currency/bans/settings read repositories
This commit is contained in:
1 parent
3e3776b477
commit
d04ed42586
7 files changed
+76
No files matched your search
@@ -11,6 +11,7 @@
|
||||
"db:pull": "drizzle-kit pull"
|
||||
},
|
||||
"dependencies": {
|
||||
"@atomcms/settings": "workspace:*",
|
||||
"drizzle-orm": "^0.38.0",
|
||||
"mysql2": "^3.11.0"
|
||||
},
|
||||
|
||||
@@ -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";
|
||||
@@ -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;
|
||||
},
|
||||
};
|
||||
}
|
||||
Generated
+3
@@ -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]))
|
||||
|
||||
Reference in new issue
Block a user