Skip to Content
Living documentation — last reviewed 2026-05-28
FeaturesWorkout AssignmentsWorkout assignments — code map

Workout assignments — code map

API

Base path: /organizations/:orgId/assignments

Routes

RouteMethodService method
GET /coach-overviewKPIs + roster + sparklinegetCoachOverview
GET /my-weekMember’s published weekfindMyWeek
GET /todayMember’s published dayfindMyToday
PATCH /publishSet published on listed ids; programId asserts ownership. Returns rows writtensetPublished
POST /bulk-previewFilter → count + 10 samplesbulkPreview
POST /bulk-deleteFilter → soft-delete + auditbulkDelete
POST /bulk-publishFilter → publish drafts + auditbulkPublish
POST /personalBulk assign to athletesassignPersonal
POST /program-day/replaceAtomically replace one program date for all active enrolleesreplaceProgramDay
POST /program-day/removeSoft-delete one program date without touching other scopesremoveProgramDay
POST /program-day/previewCount the rows a replace or remove would touchpreviewProgramDay
POST /feedInsert workout_feed_posts rowassignFeed
POST /scheduleInsert class_sessions + workout linkassignSchedule
GET /?weekStart&userId&programId; both ids intersectfindByUserWeek / findByProgramWeek
POST /Legacy single-athlete createcreate
PATCH /:idUpdate; ?programId asserts ownership when the caller knows itupdate
DELETE /:idSoft delete; ?programId asserts ownership when the caller knows itremove
POST /:id/completeStatus → completedcomplete
POST /:id/skipStatus → skippedskip
GET /:idSingle by id (member-scoped)findMyOne

Controller: apps/api/src/workout-assignments/workout-assignments.controller.ts Service: apps/api/src/workout-assignments/workout-assignments.service.ts (~1391 lines) Module: apps/api/src/workout-assignments/workout-assignments.module.ts

NestJS first-match-wins: literal routes (coach-overview, my-week, today, publish, bulk-*, program-day/replace, program-day/remove, program-day/preview, personal, feed, schedule) are declared above :id in the controller for routing precedence.

Cross-feature exports

forkSnapshotIfNeeded(assignmentId) is the canonical entry point for lazy-fork. Used by:

  • apps/api/src/workouts/workouts.service.ts — resolveEditTarget and updateMovementPrescription.
  • apps/api/src/workout-results/workout-results.service.ts — create (anchor result to snapshot id).

DTOs (apps/api/src/workout-assignments/dto/)

  • create-assignment.dto.ts — legacy single-athlete create.
  • update-assignment.dto.ts.
  • assign-personal.dto.ts — { workoutId?, kind?, note?, programId?, date, athleteIds[], drip:'now'|'morning_of' }.
  • assign-feed.dto.ts — { trackId, workoutId, publishAt, note? }.
  • assign-schedule.dto.ts — { workoutId, classTypeId, slots:[{startAt, capacity}] }.
  • set-published.dto.ts — bulk by id list.
  • bulk-filter.dto.ts — WorkoutAssignmentsBulkPreviewDto, BulkDeleteDto, BulkPublishDto; WorkoutAssignmentsBulkFilter schema in libs/shared.
  • replace-program-day.dto.ts — { programId, workoutId, date:'YYYY-MM-DD' }.
  • remove-program-day.dto.ts — { programId, date:'YYYY-MM-DD' }.
  • program-assignment-scope.ts — shared coaching-program and active-recipient validation for personal, legacy and template assignment creation. Program-day writes call it for program validation before touching the roster, so a foreign programId reports the program, not an empty roster.

Web

Routes

PathFile
Member whiteboard (today + week)apps/web/src/app/[lang]/(protected)/(member)/whiteboard/page.tsx
Member program (assigned workouts)apps/web/src/app/[lang]/(protected)/(member)/program/page.tsx
Coach overviewapps/web/src/app/[lang]/(protected)/dashboard/overview/page.tsx
Program week gridapps/web/src/app/[lang]/(protected)/dashboard/programs/[id]/week/[date]/page.tsx
Members tab in weekapps/web/src/app/[lang]/(protected)/dashboard/programs/[id]/week/[date]/members/page.tsx
Single member dayapps/web/src/app/[lang]/(protected)/dashboard/programs/[id]/week/[date]/members/[memberId]/page.tsx
Member day editapps/web/src/app/[lang]/(protected)/dashboard/programs/[id]/week/[date]/members/[memberId]/edit/page.tsx

Components

  • apps/web/src/components/overview/programming/ — the coaching program views:
    • member-week-grid.tsx — data, cell menus (workout/rest/note, publish toggle, chat), day-wide menu (assign/rest/note/replace/remove), the workout picker and bulk-actions sheets; renders its rows × 7 days grid through the shared week-grid.tsx (WeekGrid), the same component the daily-programming board uses — see daily-programming/code-map.md for the shared grid’s shape.
    • bulk-coaching-actions-sheet.tsx — bulk preview + delete + publish UI
    • feed-programming-view.tsx, client-compliance-view.tsx, program-enrollments-tab.tsx, program-comments-tab.tsx, program-class-types-tab.tsx
    • workout-picker-sheet.tsx — paste-first in create mode (paste → parse → StructureReviewDialog → assign, same as workout-parse’s other embedded entry points); picking a saved workout and “Build from scratch” are the secondary/adjust paths. Edit mode unchanged (no paste section).
    • week-navigation-bar.tsx, member-avatar.tsx, empty-state.tsx
  • apps/web/src/components/shared/program-grid/ — reusable cell shell + menus
  • apps/web/src/components/member/workouts/workout-detail-drawer.tsx — member’s view of one assignment’s snapshot
  • apps/web/src/components/member/session-card.tsx, apps/web/src/components/member/day-selector-strip.tsx

DB

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

  • workout_assignments — see data-model.md.
  • workout_feed_posts — feed broadcast row (lives in scheduling.ts).

Shared

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

  • workoutAssignmentResponseSchema — response shape.
  • assignmentStatusValues — assigned/completed/skipped.
  • workoutAssignmentsBulkFilterSchema, workoutAssignmentsBulkPreviewResponseSchema, workoutAssignmentsBulkDeleteInputSchema/ResponseSchema, workoutAssignmentsBulkPublishInputSchema/ResponseSchema.

Tests

FileType
apps/api/src/workout-assignments/workout-assignments.service.unit.spec.tsUnit — service core
apps/api/src/workout-assignments/workout-assignments.bulk.unit.spec.tsUnit — bulk preview/delete/publish
apps/api/src/workout-assignments/workout-assignments.service.driver.tsTest driver
apps/web/e2e/specs/coaching-grid.spec.tsE2E — coaching program grid
apps/web/e2e/specs/lazy-fork.spec.tsE2E — lazy-fork lifecycle
apps/web/e2e/specs/member-workout.spec.tsE2E — member day view