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.tsclassTypeName?, defaultDurationMin?, defaultCapacity?, inviteEmails?.

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
(minisite routes under /organizations/:id/minisite and /public/... — see minisites.controller.ts)

Web

Route / ComponentDescription
apps/web/src/app/[lang]/(protected)/onboarding/onboarding-content.tsxWizard handleFinish calls POST /organizations + consents + onboarding-complete.
apps/web/src/app/[lang]/(protected)/dashboard/settings/page.tsxBranding + cancellation policy + timezone settings UI.
apps/web/src/app/[lang]/(protected)/dashboard/minisite/...Minisite builder.
i18n: settings.organization*, onboarding.* in apps/web/src/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

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

Tests

No dedicated unit spec found for OrganizationsService. 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).