Skip to Content
Living documentation — last reviewed 2026-05-28
FeaturesWorkout ResultsWorkout results — code map

Workout results — code map

API

Base path: /organizations/:orgId

Routes

RouteMethodService method
POST /workouts/:workoutId/resultsLog a resultcreate
GET /workouts/:workoutId/resultsLeaderboard for the canonical workoutfindByWorkout
GET /workouts/:workoutId/results/me/latestMy most recent result with setsfindLatestByWorkoutForUser
PATCH /workouts/:workoutId/results/:idUpdate own resultupdate
DELETE /workouts/:workoutId/results/:idSoft-delete own resultremove
GET /results/meAll my results, newest firstfindByUser
POST /personal-records/meManual PRcreateManualPR
GET /personal-records/meMy PRsfindMyPersonalRecords
GET /members/:membershipId/personal-recordsA member’s PRsfindMemberPersonalRecords
GET /members/:membershipId/resultsA 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.tsCreateWorkoutResultDto (assignmentId, scoreValue, scoreUnit, rx, scaled, notes, performedAt, setResults[])
  • apps/api/src/workout-results/dto/update-workout-result.dto.ts
  • apps/api/src/workout-results/dto/create-personal-record.dto.tsCreatePersonalRecordDto (exerciseId XOR workoutId, value string, unit, achievedAt)

Key service helpers

  • parseScoreInput(scoring, raw) — parses time mm:ss/hh:mm:ss, AMRAP R+r, raw float.
  • formatScore(scoring, value) — display formatter.
  • toKilograms, toMetres, toSeconds — unit conversion to canonical.
  • checkIsPR(libraryWorkoutId, userId, currentResultId) — PR detection.
  • persistPRupsertPR — write to personal_records.
  • requireWorkout(workoutId, orgId) — workout-org gate.

Web

Routes

PathFile
Member profile historyapps/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 detailapps/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 — leaderboard
  • apps/web/src/components/member/pr-card.tsx, pr-entry-dialog.tsx — PR UI
  • apps/web/src/components/member/workout-progress/ — chart components
  • apps/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.md
  • workout_set_results — per-set canonical numerics + display units
  • personal_records — workout-level OR exercise-level PRs (CHECK enforces exclusivity)

Shared

libs/shared/src/lib/schemas/workout.schema.ts:

  • workoutResultResponseSchema, workoutSetResultResponseSchema, createSetResultInputSchema
  • workoutScoringValues — scoring enum

libs/shared/src/lib/schemas/personal-record.schema.ts — PR response shape (TODO: verify exact contents).

Tests

FileType
apps/api/src/workout-results/workout-results.service.unit.spec.tsUnit — service core (parse / format / PR detection)
apps/api/src/workout-results/workout-results.service.driver.tsTest driver
apps/web/e2e/specs/member-result-logging.spec.tsE2E — log a result and observe PR badge