Ceci est une ancienne révision du document !
Table des matières
Phase 4-A — Consolidation Finale du Prisma Schema
Objectif
Fusionner l'ensemble des modèles construits durant :
Phase 2-A à Phase 2-N
dans un unique schéma Prisma cohérent :
apps/api/prisma/schema.prisma
Ce schéma deviendra :
Source de vérité de la base PostgreSQL
et servira à générer :
Prisma Client Repositories Services NestJS DTO OpenAPI SDK Frontend
Étape 4-A.1 — Consolidation des Enums
Créer les enums globaux
enum UserStatus enum ReservationStatus enum PaymentStatus enum ContractStatus enum LeadStatus enum OpportunityStatus enum TaskStatus enum TaskPriority enum PropertyStatus enum RiskLevel enum NotificationType enum CampaignStatus enum ChannelType enum SyncStatus enum CurrencyCode enum LanguageCode enum DataClassificationLevel
Exemple
enum UserStatus {
ACTIVE
INACTIVE
BLOCKED
PENDING
}
Étape 4-A.2 — Consolidation Authentification & RBAC
Modèles concernés
User Role Permission UserRole RolePermission Session RefreshToken
Relations attendues
User ↓ UserRole ↓ Role ↓ RolePermission ↓ Permission
Contraintes
@@unique([userId, roleId]) @@unique([roleId, permissionId])
Étape 4-A.3 — Consolidation CRM
Modèles
Lead Opportunity Pipeline PipelineStage Activity Task CustomerNote Tag Segment
Corrections
Ajouter :
assignedUserId String?
sur :
Lead Opportunity Task
Relation
assignedUser User? @relation(fields:[assignedUserId], references:[id])
Étape 4-A.4 — Consolidation Immobilier
Modèles
Owner Property PropertyMedia PropertyFeature PropertyAvailability PropertyRate PropertyDistribution
Champs supplémentaires
slug String @unique reference String @unique publicUrl String?
Index
@@index([slug]) @@index([reference])
Étape 4-A.5 — Consolidation Réservations
Modèles
Reservation ReservationGuest ReservationPricing ReservationEvent ReservationStatusHistory
Champ métier
reservationNumber String @unique
Index
@@index([reservationNumber])
Étape 4-A.6 — Consolidation Finance
Modèles
Payment Refund Invoice AccountingEntry
Contraintes
paymentReference String @unique invoiceNumber String @unique
Index
@@index([paymentReference]) @@index([invoiceNumber])
Étape 4-A.7 — Consolidation Communication
Modèles
Conversation Message Notification Email Sms Template Campaign CampaignRecipient CampaignExecution
Multi-tenant
Ajouter :
tenantId String
sur tous les modèles.
Étape 4-A.8 — Consolidation IA
Modèles
AiConversation AiMessage KnowledgeDocument KnowledgeChunk Recommendation AutomationScenario AutomationExecution
Support Vector Search
Si pgvector est utilisé :
embedding Unsupported("vector")?
Fallback
Sinon :
embedding Json?
Étape 4-A.9 — Consolidation Gouvernance
Modèles
AuditLog EntityHistory FeatureFlag Workflow WorkflowStep WorkflowInstance WorkflowExecution
Multi-tenant
Ajouter :
tenantId String
sur l'ensemble des modèles.
Étape 4-A.10 — Mise en place du Multi-Tenant
Modèle central
model Tenant {
id String @id @default(uuid())
code String @unique
name String
active Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
Relation standard
Ajouter sur tous les modèles métier :
tenantId String tenant Tenant @relation(fields:[tenantId], references:[id])
Index
@@index([tenantId])
Étape 4-A.11 — Soft Delete Global
Ajouter sur tous les modèles métier
deletedAt DateTime?
Bénéfices
Suppression logique Restauration possible Audit complet Conformité RGPD
Étape 4-A.12 — Audit Global
Ajouter sur tous les modèles métier
createdAt DateTime @default(now()) updatedAt DateTime @updatedAt createdBy String? updatedBy String?
Objectif
Tracer :
Création Modification Historique utilisateur
sur l'ensemble du système.
Étape 4-A.13 — Indexation Enterprise
Ajouter systématiquement
@@index([createdAt]) @@index([updatedAt]) @@index([deletedAt])
sur tous les modèles volumineux :
Reservation Payment Invoice Lead Activity AuditLog Notification Message CampaignExecution AutomationExecution
Étape 4-A.14 — Validation du schéma
Vérification Prisma
npx prisma validate
Formatage
npx prisma format
Génération Client
npx prisma generate
Résultat attendu
À la fin de la Phase 4-A :
1 schema.prisma consolidé ≈ 110 modèles ≈ 350 relations ≈ 150 enums ≈ 500 index 100 % cohérent Prêt pour migration
Livrable
apps/api/prisma/schema.prisma
Phase 4-B — Migrations Prisma
Objectif
Transformer le schéma Prisma consolidé :
apps/api/prisma/schema.prisma
en une véritable base PostgreSQL opérationnelle.
À l'issue de cette phase :
✓ Base PostgreSQL créée ✓ Tables générées ✓ Index générés ✓ Contraintes générées ✓ Prisma Client généré ✓ Prisma Studio disponible
Prérequis
Vérifier PostgreSQL
docker ps
Vous devez voir :
postgres
en cours d'exécution.
Tester la connexion
psql -h localhost -U postgres
ou
docker exec -it postgres psql -U postgres
Étape 4-B.1 — Création du fichier .env
apps/api/.env
touch apps/api/.env
Contenu
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/rental_platform?schema=public"
Vérification
cat apps/api/.env
Étape 4-B.2 — Validation Prisma
Vérification du schéma
cd apps/api npx prisma validate
Résultat attendu
The schema at prisma/schema.prisma is valid
Si erreur
Corriger :
relations enum index syntaxe Prisma
avant de continuer.
Étape 4-B.3 — Formatage Prisma
Formatage
npx prisma format
Résultat
Prisma schema loaded Formatted prisma/schema.prisma
Étape 4-B.4 — Création de la première migration
Génération
npx prisma migrate dev --name init
Prisma va créer
prisma/
└── migrations/
└── xxxxxxxxx_init/
└── migration.sql
Exemple
CREATE TABLE "User" CREATE TABLE "Role" CREATE TABLE "Property" CREATE TABLE "Reservation" CREATE TABLE "Invoice" CREATE TABLE "Payment"
etc.
Étape 4-B.5 — Vérification des tables
Ouvrir PostgreSQL
docker exec -it postgres psql -U postgres
Sélection base
\c rental_platform
Lister les tables
\dt
Résultat attendu
Tenant User Role Permission Owner Property Customer Reservation Contract Invoice Payment ...
≈ 110 tables.
Étape 4-B.6 — Génération Prisma Client
Générer
npx prisma generate
Résultat
node_modules/.prisma/client
Vérification
ls node_modules/.prisma/client
Étape 4-B.7 — Test Prisma Client
Créer
apps/api/src/test-prisma.ts
Contenu
import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
const tenants = await prisma.tenant.findMany();
console.log(tenants);
}
main();
Exécuter
npx ts-node src/test-prisma.ts
Résultat attendu
[]
ou une liste de tenants.
Étape 4-B.8 — Seed Initial
Créer
prisma/seed.ts
Tenant principal
await prisma.tenant.create({
data: {
code: 'MAIN',
name: 'Main Tenant'
}
});
Rôle Admin
await prisma.role.create({
data: {
code: 'SUPER_ADMIN',
name: 'Super Administrateur'
}
});
Permissions
await prisma.permission.createMany({
data: [
{
code: 'users.read',
name: 'Users Read'
},
{
code: 'users.create',
name: 'Users Create'
}
]
});
Exécuter
npx prisma db seed
Étape 4-B.9 — Prisma Studio
Lancer
npx prisma studio
URL
http://localhost:5555
Vérifications
Tenant User Role Permission Property Reservation Payment Invoice
doivent être visibles.
Étape 4-B.10 — Snapshot SQL
Générer
pg_dump \ -U postgres \ -d rental_platform \ -s \ > schema.sql
Résultat
schema.sql
Ce fichier servira :
Audit Review Backup Documentation
Contrôles qualité
Nombre de tables
SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='public';
Nombre d'index
SELECT COUNT(*) FROM pg_indexes WHERE schemaname='public';
Nombre de contraintes
SELECT COUNT(*) FROM information_schema.table_constraints;
Définition de terminé
La Phase 4-B est terminée lorsque :
✓ Migration init exécutée ✓ PostgreSQL fonctionnel ✓ 110+ tables créées ✓ Prisma Client généré ✓ Seed exécuté ✓ Prisma Studio fonctionnel ✓ Snapshot SQL généré
Livrables
prisma/schema.prisma prisma/migrations/* prisma/seed.ts schema.sql
Étape suivante
Phase 4-C — DTO & Contrats TypeScript
Objectif :
Générer l'ensemble des contrats applicatifs :
DTO NestJS Types TypeScript Zod Schemas OpenAPI Models Validation Classes
à partir du Prisma Schema consolidé.