Organizations — Code Map
API
| File | Purpose |
|---|---|
apps/api/src/organizations/organizations.module.ts | Wires controller + service; imports R2, Redis, Email, Memberships, Users, Notifications. |
apps/api/src/organizations/organizations.controller.ts | CRUD routes + logo flow + onboarding-complete. |
apps/api/src/organizations/organizations.service.ts | DB + Clerk org sync + R2 logo flow + welcome email. |
apps/api/src/organizations/minisites.controller.ts | Minisite content CRUD (public + admin endpoints). |
apps/api/src/organizations/minisites.service.ts | Minisite data layer. |
apps/api/src/organizations/dto/create-organization.dto.ts | CreateOrganizationDto, UpdateOrganizationDto, LogoUploadUrlDto. |
apps/api/src/organizations/dto/onboarding-complete.dto.ts | deliveryModes?, programNames?, classTypeName?, defaultDurationMin?, defaultCapacity?, inviteEmails?. |
apps/api/src/organizations/organization-appearance.{controller,service}.ts | Shared identity/palette drafts, immutable publication history, restore and workspace summary. |
apps/api/src/organizations/brand-assets.{controller,service}.ts | Immutable organization asset library and validated native PNG variants. |
apps/api/src/organizations/branding.{controller,service}.ts | Mobile-specific appearance publication plus schema-versioned public brand reads. |
apps/api/src/organizations/debt-policy.ts | loadDebtPolicy(db, orgId) — the org’s billing_grace_days + timezone (DebtPolicy) for the debt rules in payments/billing-debt.ts. |
Routes
| Method | Path | Handler |
|---|---|---|
| POST | /organizations | create |
| GET | /organizations | list (my orgs) |
| GET | /organizations/:id | getById |
| PATCH | /organizations/:id | update |
| POST | /organizations/:id/logo/upload-url | getLogoUploadUrl |
| POST | /organizations/:id/logo/confirm | confirmLogoUpload |
| POST | /organizations/:id/onboarding-complete | completeOnboarding |
| GET | /organizations/:id/brand-workspace | Capability-aware aggregate workspace read model |
| GET/PATCH | /organizations/:id/appearance | Read/autosave shared-brand draft |
| POST | /organizations/:id/appearance/publish | Publish exactly the expected shared draft revision |
| GET/POST | /organizations/:id/brand-assets | List/upload immutable shared assets |
(minisite routes under /organizations/:id/minisite and /public/... — see minisites.controller.ts) |
Web
| Route / Component | Description |
|---|---|
apps/web/src/app/[lang]/(protected)/onboarding/onboarding-content.tsx | Setup 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.tsx | Branding + 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
| Table | Used as |
|---|---|
organizations | Owned. Holds all org-level config. |
memberships | Inserted on create (owner row); read by all org-scoped checks. |
programs | Created elsewhere; referenced in onboarding-complete to find a parent for the seed class type. |
class_types | Created in onboarding-complete if classTypeName provided. |
invitations | Created in onboarding-complete if inviteEmails provided. |
minisite_content | One-to-one with org (TODO: confirm unique(organization_id)). |
Shared schemas
OrganizationResponseinlibs/shared/src/lib/schemas/organization.schema.ts.OrganizationTypeenum:physical | online | hybrid.PlatformTierenum:lite | pro | elite.checkTierLimit(platformTier, key, currentCount)for tier gating.
External integrations
- Clerk —
clerk.organizations.createOrganizationon 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).