From 564a18cfcb64627624ed8a18fdc9fc3cc404bf33 Mon Sep 17 00:00:00 2001 From: Dominic Ferrando Date: Sat, 22 Aug 2026 13:01:10 -0400 Subject: [PATCH] Implement put route for updating existing assessments --- apps/api/src/server.ts | 11 +++++++++ apps/api/src/services/assessments.ts | 37 +++++++++++++++++++++------- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/apps/api/src/server.ts b/apps/api/src/server.ts index a846fda..3bb8d25 100644 --- a/apps/api/src/server.ts +++ b/apps/api/src/server.ts @@ -23,6 +23,7 @@ import { EventsService, EventStatusSchema } from "./services/events"; import { AccountsService, type AccountRole } from "./services/accounts"; import { Value } from "@sinclair/typebox/value"; import { AssessmentsService } from "./services/assessments"; +import { Not } from "@sinclair/typebox"; // CONSTANTS // ----------------------- @@ -509,6 +510,16 @@ export const app = new Elysia() id: t.Optional(t.String()), }) }) + .put("/:id", async ({ body: { player, activityPerformances }, params: { id } }) => { + const updated = await s.Assessments.update(id, player, activityPerformances); + if (!updated) throw new NotFoundError("Assessment not found"); + }, { + params: t.Object({ id: t.String() }), + body: t.Object({ + player: PlayerSchema, + activityPerformances: t.Array(ActivityPerformanceSchema), + }) + }) ) ) diff --git a/apps/api/src/services/assessments.ts b/apps/api/src/services/assessments.ts index 70277ba..d6b2572 100644 --- a/apps/api/src/services/assessments.ts +++ b/apps/api/src/services/assessments.ts @@ -2,10 +2,10 @@ import { Activity, type ActivityPerformance, type Player } from "@blade-and-braw import { db } from "../database/db"; export class AssessmentsService { - async create(player: Player, activityPerformances: ActivityPerformance[], accountId?: string) { - const performanceFor = (activity: Activity) => - activityPerformances.find((p) => p.activity === activity)?.performance ?? null; + 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, @@ -13,12 +13,12 @@ export class AssessmentsService { age: player.metrics.age, weight: player.metrics.weight, gender: player.metrics.gender, - perf_back_squat: performanceFor(Activity.BackSquat), - perf_deadlift: performanceFor(Activity.Deadlift), - perf_bench_press: performanceFor(Activity.BenchPress), - perf_broad_jump: performanceFor(Activity.BroadJump), - perf_run: performanceFor(Activity.Run), - perf_cone_drill: performanceFor(Activity.ConeDrill), + 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(); @@ -40,6 +40,25 @@ export class AssessmentsService { .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)