← Retour à la marketplace
🏢

Multi-tenant

⭐ Recommandé

Architecture multi-tenant avec isolation des données par organisation.

InfrastructureComplexe~15 joursv1.1.0

Module multi-tenant avec gestion des organisations, isolation stricte des données (shared schema), invitations par email, rôles par organisation et sous-domaines (optionnel).

multi-tenantorganizationssaasisolationteams

Dépendances requises :

📋 Schéma Prisma

// === Module Multi-tenant ===

enum OrgRole {
  OWNER
  ADMIN
  MEMBER
  VIEWER
}

model Organization {
  id        String   @id @default(cuid())
  name      String
  slug      String   @unique
  logoUrl   String?
  planId    String?
  isActive  Boolean  @default(true)
  createdAt DateTime @default(now())
  updatedAt DateTime @updatedAt
  members   OrgMember[]
  invitations OrgInvitation[]

  @@map("organizations")
}

model OrgMember {
  id             String       @id @default(cuid())
  organizationId String
  organization   Organization @relation(fields: [organizationId], references: [id], onDelete: Cascade)
  userId         String
  role           OrgRole      @default(MEMBER)
  joinedAt       DateTime     @default(now())

  @@unique([organizationId, userId])
  @@map("org_members")
}

model OrgInvitation {
  id             String       @id @default(cuid())
  organizationId String
  organization   Organization @relation(fields: [organizationId], references: [id])
  email          String
  role           OrgRole      @default(MEMBER)
  token          String       @unique
  expiresAt      DateTime
  acceptedAt     DateTime?
  createdAt      DateTime     @default(now())

  @@map("org_invitations")
}

🔌 Endpoints API

## API Multi-tenant

GET  /api/orgs                   # Organisations de l'utilisateur
POST /api/orgs                   # Créer une organisation
GET  /api/orgs/:slug             # Détail organisation
PUT  /api/orgs/:slug             # Modifier
GET  /api/orgs/:slug/members     # Liste des membres
POST /api/orgs/:slug/invite      # Inviter un membre
PUT  /api/orgs/:slug/members/:id/role # Changer le rôle
DELETE /api/orgs/:slug/members/:id # Retirer un membre
GET  /api/invitations/:token     # Voir invitation (public)
POST /api/invitations/:token/accept # Accepter

🛠️ Guide d'implémentation

## Implémentation Multi-tenant

### Étape 1 — Contexte organisation
Créer src/lib/tenant/context.ts :
- Extraire l'org depuis le subdomain ou le header X-Org-Slug
- Vérifier que l'user est membre de l'org
- Injecter l'orgId dans chaque requête

### Étape 2 — Isolation des données
CRITIQUE : Ajouter organizationId à TOUS les modèles métier.
Filtrer SYSTÉMATIQUEMENT par organizationId dans toutes les requêtes.

### Étape 3 — Middleware tenant
Middleware Next.js qui résout l'org à partir du subdomain :
- app.mondomaine.fr → org globale
- client1.mondomaine.fr → org "client1"

### Étape 4 — Invitation
Workflow email : invitation → token → acceptation → création OrgMember.

Prêt à installer ce module ?

Ajoutez-le à un projet existant depuis la page modules du projet.

Voir les projets →