Skip to Content
Living documentation — last reviewed 2026-05-28
FeaturesOrganizationsOrganizations — Code Map

Organizations — Code Map

API

FilePurpose
apps/api/src/organizations/organizations.module.tsWires controller + service; imports R2, Redis, Email, Memberships, Users, Notifications.
apps/api/src/organizations/organizations.controller.tsCRUD routes + logo flow + onboarding-complete.
apps/api/src/organizations/organizations.service.tsDB + Clerk org sync + R2 logo flow + welcome email.
apps/api/src/organizations/minisites.controller.tsMinisite content CRUD (public + admin endpoints).
apps/api/src/organizations/minisites.service.tsMinisite data layer.
apps/api/src/organizations/dto/create-organization.dto.tsCreateOrganizationDto, UpdateOrganizationDto, LogoUploadUrlDto.
apps/api/src/organizations/dto/onboarding-complete.dto.tsdeliveryModes?, programNames?, classTypeName?, defaultDurationMin?, defaultCapacity?, inviteEmails?.
apps/api/src/organizations/organization-appearance.{controller,service}.tsShared identity/palette drafts, immutable publication history, restore and workspace summary.
apps/api/src/organizations/brand-assets.{controller,service}.tsImmutable organization asset library and validated native PNG variants.
apps/api/src/organizations/branding.{controller,service}.tsMobile-specific appearance publication plus schema-versioned public brand reads.
apps/api/src/organizations/debt-policy.tsloadDebtPolicy(db, orgId) — the org’s billing_grace_days + timezone (DebtPolicy) for the debt rules in payments/billing-debt.ts.

Routes

MethodPathHandler
POST/organizationscreate
GET/organizationslist (my orgs)
GET/organizations/:idgetById
PATCH/organizations/:idupdate
POST/organizations/:id/logo/upload-urlgetLogoUploadUrl
POST/organizations/:id/logo/confirmconfirmLogoUpload
POST/organizations/:id/onboarding-completecompleteOnboarding
GET/organizations/:id/brand-workspaceCapability-aware aggregate workspace read model
GET/PATCH/organizations/:id/appearanceRead/autosave shared-brand draft
POST/organizations/:id/appearance/publishPublish exactly the expected shared draft revision
GET/POST/organizations/:id/brand-assetsList/upload immutable shared assets
(minisite routes under /organizations/:id/minisite and /public/... — see minisites.controller.ts)

Web

Route / ComponentDescription
apps/web/src/app/[lang]/(protected)/onboarding/onboarding-content.tsxSetup sheet handleSubmit calls POST /organizations + consents + onboarding-complete; a retry after a partial failure skips the calls that already succeeded.
apps/web/src/app/[lang]/(protected)/dashboard/settings/page.tsxBranding + cancellation policy + timezone settings UI.
apps/web/src/app/[lang]/(protected)/dashboard/settings/(shell)/booking/page.tsx (+ settings-booking-page.driver.tsx, .int.spec.tsx)Booking settings: cancellation window, registration window, and the Payment grace section (grace lengths, plan required to book).
apps/web/src/app/[lang]/(protected)/dashboard/minisite/...Minisite builder.
i18n: settings.organization*, onboarding.* in libs/shared/src/lib/i18n/dictionaries/.

DB tables

TableUsed as
organizationsOwned. Holds all org-level config.
membershipsInserted on create (owner row); read by all org-scoped checks.
programsCreated elsewhere; referenced in onboarding-complete to find a parent for the seed class type.
class_typesCreated in onboarding-complete if classTypeName provided.
invitationsCreated in onboarding-complete if inviteEmails provided.
minisite_contentOne-to-one with org (TODO: confirm unique(organization_id)).

Shared schemas

  • OrganizationResponse in libs/shared/src/lib/schemas/organization.schema.ts.
  • OrganizationType enum: physical | online | hybrid.
  • PlatformTier enum: lite | pro | elite.
  • checkTierLimit(platformTier, key, currentCount) for tier gating.

External integrations

  • Clerk — clerk.organizations.createOrganization on create. No further Clerk org calls in the service.
  • R2 — R2Service.getPresignedUploadUrl, objectExists, getPresignedUrlCached (1-hour cached read URLs), invalidatePresignedUrl.
  • Redis — upload:logo:${orgId} key with 600s TTL holds the in-progress upload session.

Tests

No dedicated unit spec found for OrganizationsService; organizations-audit-diff.unit.spec.ts covers the settings audit diff (including the grace settings). Logo upload flow is covered by an e2e (TODO: verify in apps/web/e2e/specs/). Onboarding flow is covered via the onboarding integration test (apps/web/e2e/specs/onboarding*.spec.ts — TODO: confirm).