import { Activity, type ActivityPerformance, type Player } from "@blade-and-brawn/domain"; import { db } from "../database/db"; export class AssessmentsService { private static performanceFor = (activityPerformances: ActivityPerformance[], activity: Activity) => activityPerformances.find((p) => p.activity === activity)?.performance ?? null; async create(player: Player, activityPerformances: ActivityPerformance[], accountId?: string) { return await db.insertInto("assessments") .values({ account_id: accountId ?? null, name: player.name ?? "Anonymous", age: player.metrics.age, weight: player.metrics.weight, gender: player.metrics.gender, perf_back_squat: AssessmentsService.performanceFor(activityPerformances, Activity.BackSquat), perf_deadlift: AssessmentsService.performanceFor(activityPerformances, Activity.Deadlift), perf_bench_press: AssessmentsService.performanceFor(activityPerformances, Activity.BenchPress), perf_broad_jump: AssessmentsService.performanceFor(activityPerformances, Activity.BroadJump), perf_run: AssessmentsService.performanceFor(activityPerformances, Activity.Run), perf_cone_drill: AssessmentsService.performanceFor(activityPerformances, Activity.ConeDrill), }) .returning("id") .executeTakeFirstOrThrow(); } async list(opt: { filter?: { accountId?: string }, limit?: number, offset?: number, } = {}) { return await db.selectFrom("assessments") .selectAll() .$if(opt.filter?.accountId !== undefined, (qb) => qb .where("account_id", "=", opt.filter!.accountId!) ) .orderBy("created_at", "desc") .$if(opt.limit !== undefined, (qb) => qb.limit(opt.limit!)) .$if(opt.offset !== undefined, (qb) => qb.offset(opt.offset!)) .execute(); } async update(id: string, player: Player, activityPerformances: ActivityPerformance[]) { const result = await db.updateTable("assessments") .where("id", "=", id) .set({ name: player.name ?? "Anonymous", age: player.metrics.age, weight: player.metrics.weight, gender: player.metrics.gender, perf_back_squat: AssessmentsService.performanceFor(activityPerformances, Activity.BackSquat), perf_deadlift: AssessmentsService.performanceFor(activityPerformances, Activity.Deadlift), perf_bench_press: AssessmentsService.performanceFor(activityPerformances, Activity.BenchPress), perf_broad_jump: AssessmentsService.performanceFor(activityPerformances, Activity.BroadJump), perf_run: AssessmentsService.performanceFor(activityPerformances, Activity.Run), perf_cone_drill: AssessmentsService.performanceFor(activityPerformances, Activity.ConeDrill), }) .executeTakeFirst(); return result.numUpdatedRows > 0n; } async delete(id: string, accountId: string): Promise { const result = await db.deleteFrom("assessments") .where("id", "=", id) .where("account_id", "=", accountId) .executeTakeFirst(); return result.numDeletedRows > 0n; } }