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 | classTypeName?, defaultDurationMin?, defaultCapacity?, inviteEmails?. |
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 |
(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 | Wizard handleFinish calls POST /organizations + consents + onboarding-complete. |
apps/web/src/app/[lang]/(protected)/dashboard/settings/page.tsx | Branding + 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
| 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. 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).