brackt/app/models/tournament-result.ts

62 lines
1.7 KiB
TypeScript
Raw Normal View History

import { eq, and, asc } from "drizzle-orm";
import { database } from "~/database/context";
import * as schema from "~/database/schema";
export type TournamentResult = typeof schema.tournamentResults.$inferSelect;
export type NewTournamentResult = typeof schema.tournamentResults.$inferInsert;
export async function upsertTournamentResult(
data: NewTournamentResult
): Promise<TournamentResult> {
if (!data.tournamentId || !data.participantId) {
throw new Error("tournamentId and participantId are required");
}
const db = database();
const [result] = await db
.insert(schema.tournamentResults)
.values(data)
.onConflictDoUpdate({
target: [
schema.tournamentResults.tournamentId,
schema.tournamentResults.participantId,
],
set: {
placement: data.placement,
rawScore: data.rawScore,
updatedAt: new Date(),
},
})
.returning();
return result;
}
export async function getTournamentResults(
tournamentId: string
): Promise<TournamentResult[]> {
const db = database();
return await db
.select()
.from(schema.tournamentResults)
.where(eq(schema.tournamentResults.tournamentId, tournamentId))
.orderBy(asc(schema.tournamentResults.placement));
}
export async function getTournamentResultByParticipant(
tournamentId: string,
participantId: string
): Promise<TournamentResult | null> {
const db = database();
const results = await db
.select()
.from(schema.tournamentResults)
.where(
and(
eq(schema.tournamentResults.tournamentId, tournamentId),
eq(schema.tournamentResults.participantId, participantId)
)
)
.limit(1);
return results[0] ?? null;
}