🎉 init

This commit is contained in:
2026-07-01 15:43:18 +02:00
commit 2f492c55be
64 changed files with 11645 additions and 0 deletions
+53
View File
@@ -0,0 +1,53 @@
import { eq, inArray } from 'drizzle-orm'
import { useDb } from '../database/client'
import { expenseParticipants, expenses, participants, pots } from '../database/schema'
export interface ExpenseWithDetails {
id: number
type: string
description: string
amountCents: number
payerId: number
participantIds: number[]
createdAt: number
}
export async function getPotOrThrow(slug: string) {
const db = useDb()
const [pot] = await db.select().from(pots).where(eq(pots.slug, slug))
if (!pot) {
throw createError({ statusCode: 404, statusMessage: 'Pot not found' })
}
return pot
}
export async function getParticipants(slug: string) {
const db = useDb()
return db.select().from(participants).where(eq(participants.potSlug, slug))
}
export async function getExpensesWithParticipants(slug: string): Promise<ExpenseWithDetails[]> {
const db = useDb()
const expenseRows = await db.select().from(expenses).where(eq(expenses.potSlug, slug)).orderBy(expenses.createdAt)
if (expenseRows.length === 0) return []
const expenseIds = expenseRows.map(row => row.id)
const links = await db.select().from(expenseParticipants).where(inArray(expenseParticipants.expenseId, expenseIds))
const participantIdsByExpense = new Map<number, number[]>()
for (const link of links) {
const list = participantIdsByExpense.get(link.expenseId) ?? []
list.push(link.participantId)
participantIdsByExpense.set(link.expenseId, list)
}
return expenseRows.map(row => ({
id: row.id,
type: row.type,
description: row.description,
amountCents: row.amountCents,
payerId: row.payerId,
participantIds: participantIdsByExpense.get(row.id) ?? [],
createdAt: row.createdAt,
}))
}