← Retour à la marketplaceVoir les projets →
🏢
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
📋 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.