Skip to Content
Living documentation — last reviewed 2026-05-28
FeaturesWorkoutsWorkouts — code map

Workouts — code map

API (NestJS)

Base path: /organizations/:orgId

RouteFileMethod
POST /workoutsapps/api/src/workouts/workouts.controller.tsWorkoutsService.create
GET /workoutssamefindAll (filters: programId, q)
GET /workouts/:idsamefindById
PATCH /workouts/:idsameupdate (accepts ?assignmentId for lazy-fork redirect)
DELETE /workouts/:idsameremove (soft delete; rejects snapshots)
PUT /workouts/:id/sectionssamesetSections (accepts ?assignmentId)
PATCH /workouts/:id/movements/:movementId/prescriptionsameupdateMovementPrescription (accepts ?assignmentId)
GET /workouts/:id/movements/:movementId/commentssamelistMovementComments
POST /workouts/:id/movements/:movementId/commentssamecreateMovementComment

Module: apps/api/src/workouts/workouts.module.ts registers the BullMQ workouts-enrichment queue, plus dependencies on MembershipsModule, UsersModule, UploadsModule, R2Module, PushNotificationsModule, and WorkoutAssignmentsModule (for forkSnapshotIfNeeded).

DTOs

  • apps/api/src/workouts/dto/create-workout.dto.tsCreateWorkoutDto
  • apps/api/src/workouts/dto/update-workout.dto.tsUpdateWorkoutDto
  • apps/api/src/workouts/dto/set-sections.dto.tsSetSectionsDto, SectionDto, MovementDto
  • apps/api/src/workouts/dto/update-movement-prescription.dto.tsUpdateMovementPrescriptionDto
  • apps/api/src/workouts/dto/create-exercise-comment.dto.tsCreateExerciseCommentDto

Key service methods (apps/api/src/workouts/workouts.service.ts)

  • resolveEditTarget(workoutId, assignmentId?) — delegates to WorkoutAssignmentsService.forkSnapshotIfNeeded; returns the snapshot id when assignmentId is supplied.
  • requireWorkoutBuilder(orgId) — tier gate for structured-mode writes.
  • mapMovementToSnapshot / resolveSnapshotMovement — locate the snapshot’s mirror of a library movement after fork.
  • deepCopyWorkout — lives in WorkoutAssignmentsService.deepCopyWorkout (apps/api/src/workout-assignments/workout-assignments.service.ts:859). Copies sections, movements, and comments.
  • WorkoutsService.computeDisplayName (static) — title or first line of description, ≤60 chars.

Web (Next.js)

RouteFile path
Library listapps/web/src/app/[lang]/(protected)/dashboard/workouts/page.tsx
Create chooserapps/web/src/app/[lang]/(protected)/dashboard/workouts/new/page.tsx
Structured builder (new)apps/web/src/app/[lang]/(protected)/dashboard/workouts/new/builder/page.tsx
Freeform createapps/web/src/app/[lang]/(protected)/dashboard/workouts/new/freeform/page.tsx
Workout detailapps/web/src/app/[lang]/(protected)/dashboard/workouts/[id]/page.tsx
Editapps/web/src/app/[lang]/(protected)/dashboard/workouts/[id]/edit/page.tsx
Member whiteboardapps/web/src/app/[lang]/(protected)/(member)/whiteboard/page.tsx

Key components

  • apps/web/src/components/overview/workouts/workout-list-view.tsx — coach library list
  • apps/web/src/components/overview/workouts/workout-card.tsx — list item
  • apps/web/src/components/overview/workouts/workout-builder.tsx — top-level builder shell
  • apps/web/src/components/overview/workouts/workout-builder/ — builder internals:
    • use-builder-state.ts — central state machine (draft sections, movements, undo/redo)
    • use-builder-save.ts — POST/PUT orchestration
    • prescription-codec.ts — serialize/parse Prescription JSONB
    • shape.ts — section shape (linear/amrap/emom/…) registry helpers
    • superset.ts — superset grouping rules
    • volume.ts — total-volume computation for the right-rail summary
    • keys.ts — stable React keys across reorders
    • components/section-editor.tsx, prescription-panel.tsx, builder-right-rail.tsx, builder-header.tsx, builder-action-bar.tsx, ribbon-action.tsx, shape-renderers.tsx, sortable-section.tsx, section-type-combobox.tsx, num-input.tsx, movement-demo-dialog.tsx
  • apps/web/src/components/overview/workouts/freeform-workout-form.tsx — freeform editor
  • apps/web/src/components/overview/workouts/workout-execution-view.tsx — read-only display for non-edit contexts
  • apps/web/src/components/overview/workouts/exercise-autocomplete.tsx, exercise-library-browser.tsx, exercise-video-dialog.tsx — exercise pickers
  • apps/web/src/components/member/workouts/workout-detail-drawer.tsx — member’s read view of the snapshot

DB (Drizzle, PostgreSQL)

All schema in libs/db/src/lib/schema/workouts.ts:

TablePurpose
workoutsLibrary and snapshot rows. is_snapshot discriminates.
workout_sectionsOrdered sections per workout; carries shape + config JSONB for AMRAP/EMOM/etc.
workout_movementsOrdered movements per section; carries prescription JSONB + label + superset_group.

Comments: exercise_comments in libs/db/src/lib/schema/comments.ts. Attachments: attachments in libs/db/src/lib/schema/attachments.ts (polymorphic ownerType='exercise_comment').

Shared

FileExports
libs/shared/src/lib/schemas/workout.schema.tsworkoutResponseSchema, workoutSummaryResponseSchema, workoutSectionSchema, workoutMovementSchema, setSectionsInputSchema, scoring/section-type/mode enum values
libs/shared/src/lib/schemas/prescription.tsPrescriptionSchema + sub-schemas (reps, load)
libs/shared/src/lib/schemas/section-shape.tsSection container shape registry (linear / amrap / emom / for_time / tabata / rep_scheme / rounds / intervals) — TODO: verify exact filename casing
libs/shared/src/lib/constants/platform-tiers.tstierHasFeature, basic_workouts, workout_builder feature constants

Tests

TypeFile
Builder state unitapps/web/src/components/overview/workouts/workout-builder/use-builder-state.int.spec.tsx
Builder save unitapps/web/src/components/overview/workouts/workout-builder/use-builder-save.unit.spec.ts
Prescription codecapps/web/src/components/overview/workouts/workout-builder/prescription-codec.unit.spec.ts
Section shapeapps/web/src/components/overview/workouts/workout-builder/shape.unit.spec.ts
Supersetapps/web/src/components/overview/workouts/workout-builder/superset.unit.spec.ts
Volumeapps/web/src/components/overview/workouts/workout-builder/volume.unit.spec.ts
Builder keysapps/web/src/components/overview/workouts/workout-builder/keys.unit.spec.ts
Builder deriveapps/web/src/components/overview/workouts/workout-builder-derive.unit.spec.ts
Member detail drawerapps/web/src/components/member/workouts/workout-detail-drawer.int.spec.tsx
Comments panelapps/web/src/components/messages/workout-comments-panel.int.spec.tsx
E2E builderapps/web/e2e/specs/workout-builder.spec.ts
E2E member workoutapps/web/e2e/specs/member-workout.spec.ts
E2E commentsapps/web/e2e/specs/workout-comments.spec.ts
E2E lazy-forkapps/web/e2e/specs/lazy-fork.spec.ts