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
PUT /assignments/:assignmentId/parts/:sectionIdLog one part (section) of my assigned workout — never completes itlogPart
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.ts — CreateWorkoutResultDto (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/log-workout-part.dto.ts — LogWorkoutPartDto (scores[] {slotKey, value, unit?}, setResults[]); empty scores with no sets clears the part
  • apps/api/src/workout-results/dto/create-personal-record.dto.ts — CreatePersonalRecordDto (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.
  • persistPR → upsertPR — write to personal_records.
  • requireWorkout(workoutId, orgId) — workout-org gate.
  • requireAssignmentSection(workoutId, sectionId, sortOrder?) — the section of the workout the member is reading, or its copy after a lazy fork.
  • parsePartScores(dto, slots) / assertSetsBelongToSection(sets, movements) — per-part write validation.

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
  • workout_result_part_scores — one row per (result, section, slot); the per-part scores
  • personal_records — workout-level OR exercise-level PRs (CHECK enforces exclusivity)

Shared

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

  • workoutResultResponseSchema (carries parts[]), workoutResultPartResponseSchema, workoutSetResultResponseSchema, createSetResultInputSchema, logWorkoutPartInputSchema
  • sectionScoreSlotSchema / sectionScoreSlotsSchema — the slots a coach defines per section
  • 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-part-logging.int.spec.tsIntegration — per-part logging: no completion, upsert, per-section sets, clearing, Finish, slot copies
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