Workout results — code map
API
Base path: /organizations/:orgId
Routes
| Route | Method | Service method |
|---|---|---|
POST /workouts/:workoutId/results | Log a result | create |
GET /workouts/:workoutId/results | Leaderboard for the canonical workout | findByWorkout |
GET /workouts/:workoutId/results/me/latest | My most recent result with sets | findLatestByWorkoutForUser |
PATCH /workouts/:workoutId/results/:id | Update own result | update |
DELETE /workouts/:workoutId/results/:id | Soft-delete own result | remove |
GET /results/me | All my results, newest first | findByUser |
POST /personal-records/me | Manual PR | createManualPR |
GET /personal-records/me | My PRs | findMyPersonalRecords |
GET /members/:membershipId/personal-records | A member’s PRs | findMemberPersonalRecords |
GET /members/:membershipId/results | A member’s full result history (staff) | findMemberResults |
Controller: apps/api/src/workout-results/workout-results.controller.ts
Service: apps/api/src/workout-results/workout-results.service.ts (~979 lines)
Module: apps/api/src/workout-results/workout-results.module.ts
DTOs
apps/api/src/workout-results/dto/create-workout-result.dto.ts—CreateWorkoutResultDto(assignmentId,scoreValue,scoreUnit,rx,scaled,notes,performedAt,setResults[])apps/api/src/workout-results/dto/update-workout-result.dto.tsapps/api/src/workout-results/dto/create-personal-record.dto.ts—CreatePersonalRecordDto(exerciseIdXORworkoutId,valuestring,unit,achievedAt)
Key service helpers
parseScoreInput(scoring, raw)— parses timemm:ss/hh:mm:ss, AMRAPR+r, raw float.formatScore(scoring, value)— display formatter.toKilograms,toMetres,toSeconds— unit conversion to canonical.checkIsPR(libraryWorkoutId, userId, currentResultId)— PR detection.persistPR→upsertPR— write topersonal_records.requireWorkout(workoutId, orgId)— workout-org gate.
Web
Routes
| Path | File |
|---|---|
| Member profile history | apps/web/src/app/[lang]/(protected)/(member)/profile/history/page.tsx |
| Member profile goals (PRs surface) | apps/web/src/app/[lang]/(protected)/(member)/profile/goals/page.tsx |
| Dashboard member detail | apps/web/src/app/[lang]/(protected)/dashboard/members/[id]/page.tsx |
| Workout detail (coach view of leaderboard) | apps/web/src/app/[lang]/(protected)/dashboard/workouts/[id]/page.tsx |
Components
apps/web/src/components/overview/workouts/result-logging-form.tsx— coach-side result entry (per member)apps/web/src/components/overview/workouts/workout-results-view.tsx— leaderboardapps/web/src/components/member/pr-card.tsx,pr-entry-dialog.tsx— PR UIapps/web/src/components/member/workout-progress/— chart componentsapps/web/src/components/member/workouts/workout-detail-drawer.tsx— member’s read view of the assignment + result-logging entry point
DB
libs/db/src/lib/schema/workouts.ts:
workout_results— see data-model.mdworkout_set_results— per-set canonical numerics + display unitspersonal_records— workout-level OR exercise-level PRs (CHECK enforces exclusivity)
Shared
libs/shared/src/lib/schemas/workout.schema.ts:
workoutResultResponseSchema,workoutSetResultResponseSchema,createSetResultInputSchemaworkoutScoringValues— scoring enum
libs/shared/src/lib/schemas/personal-record.schema.ts — PR response shape (TODO: verify exact contents).
Tests
| File | Type |
|---|---|
apps/api/src/workout-results/workout-results.service.unit.spec.ts | Unit — service core (parse / format / PR detection) |
apps/api/src/workout-results/workout-results.service.driver.ts | Test driver |
apps/web/e2e/specs/member-result-logging.spec.ts | E2E — log a result and observe PR badge |