====== 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 ---- ====== Phase 4-C — DTO & Contrats TypeScript ====== ===== Objectif ===== Transformer le modèle Prisma consolidé en contrats applicatifs utilisables par : NestJS Swagger OpenAPI Zod NextJS React Query SDK TypeScript À l'issue de cette phase : ✓ DTO générés ✓ Types TypeScript générés ✓ Validation Zod générée ✓ Contrats API stabilisés ✓ Base de génération Swagger ---- ====== Architecture cible ====== ===== Structure ===== libs/ └── contracts/ ├── dto/ ├── schemas/ ├── enums/ ├── types/ └── index.ts ---- ===== Objectif ===== Séparer : Base de données ↓ Prisma Models ---------------- API ↓ DTO ---------------- Frontend ↓ Types ---- ====== Étape 4-C.1 — Création de la librairie Contracts ====== ===== Nx ===== nx g @nx/js:library contracts ---- ===== Résultat ===== libs/contracts ---- ====== Étape 4-C.2 — Installation des dépendances ====== ===== DTO ===== npm install class-validator npm install class-transformer npm install @nestjs/swagger ---- ===== Validation Runtime ===== npm install zod ---- ===== Génération Zod ===== npm install prisma-zod-generator ---- ====== Étape 4-C.3 — Organisation des contrats ====== ===== Arborescence ===== libs/contracts ├── dto │ ├── auth │ ├── users │ ├── properties │ ├── reservations │ ├── crm │ ├── finance │ └── security │ ├── schemas │ ├── enums │ └── types ---- ====== Étape 4-C.4 — DTO Auth ====== ===== CreateUserDto ===== export class CreateUserDto { @IsEmail() email: string; @IsString() firstName: string; @IsString() lastName: string; @MinLength(8) password: string; } ---- ===== LoginDto ===== export class LoginDto { @IsEmail() email: string; @IsString() password: string; } ---- ===== RefreshTokenDto ===== export class RefreshTokenDto { @IsString() refreshToken: string; } ---- ====== Étape 4-C.5 — DTO Users ====== ===== UpdateUserDto ===== export class UpdateUserDto { @IsOptional() firstName?: string; @IsOptional() lastName?: string; @IsOptional() phone?: string; } ---- ===== UserResponseDto ===== export class UserResponseDto { id: string; email: string; firstName: string; lastName: string; status: UserStatus; } ---- ====== Étape 4-C.6 — DTO Properties ====== ===== CreatePropertyDto ===== export class CreatePropertyDto { title: string; description?: string; propertyType: string; maxGuests: number; bedrooms: number; bathrooms: number; } ---- ===== UpdatePropertyDto ===== export class UpdatePropertyDto { title?: string; description?: string; published?: boolean; } ---- ===== PropertyResponseDto ===== export class PropertyResponseDto { id: string; reference: string; slug: string; title: string; published: boolean; } ---- ====== Étape 4-C.7 — DTO Reservations ====== ===== CreateReservationDto ===== export class CreateReservationDto { propertyId: string; customerId: string; checkInDate: Date; checkOutDate: Date; adults: number; children?: number; } ---- ===== ReservationResponseDto ===== export class ReservationResponseDto { id: string; reservationNumber: string; status: ReservationStatus; totalAmount: number; } ---- ====== Étape 4-C.8 — DTO CRM ====== ===== CreateLeadDto ===== export class CreateLeadDto { firstName: string; lastName: string; email: string; source?: string; } ---- ===== CreateTaskDto ===== export class CreateTaskDto { title: string; description?: string; assignedUserId?: string; dueDate?: Date; } ---- ====== Étape 4-C.9 — DTO Finance ====== ===== CreateInvoiceDto ===== export class CreateInvoiceDto { reservationId: string; issueDate: Date; } ---- ===== PaymentDto ===== export class PaymentDto { reservationId: string; amount: number; currencyCode: string; } ---- ====== Étape 4-C.10 — DTO Security ====== ===== EnableMfaDto ===== export class EnableMfaDto { method: string; } ---- ===== ConsentDto ===== export class ConsentDto { consentType: string; granted: boolean; } ---- ====== Étape 4-C.11 — Pagination Contracts ====== ===== PaginationRequest ===== export class PaginationRequest { page?: number; pageSize?: number; sort?: string; search?: string; } ---- ===== PaginationResponse ===== export class PaginationResponse { data: T[]; total: number; page: number; pageSize: number; totalPages: number; } ---- ====== Étape 4-C.12 — API Response Contracts ====== ===== Success ===== export interface ApiResponse { success: true; data: T; } ---- ===== Error ===== export interface ApiError { success: false; code: string; message: string; } ---- ====== Étape 4-C.13 — Génération Zod ====== ===== Generator Prisma ===== Dans : schema.prisma ajouter : generator zod { provider = "prisma-zod-generator" } ---- ===== Génération ===== npx prisma generate ---- ===== Résultat ===== libs/contracts/schemas contenant : UserSchema PropertySchema ReservationSchema LeadSchema InvoiceSchema PaymentSchema ---- ====== Étape 4-C.14 — Barrel Exports ====== ===== enums/index.ts ===== export * from './user-status.enum'; export * from './reservation-status.enum'; export * from './payment-status.enum'; ---- ===== dto/index.ts ===== export * from './auth'; export * from './users'; export * from './properties'; export * from './reservations'; ---- ===== index.ts ===== export * from './dto'; export * from './schemas'; export * from './enums'; export * from './types'; ---- ====== Contrôles qualité ====== ===== Compilation ===== nx build contracts ---- ===== Type Check ===== npx tsc --noEmit ---- ===== Lint ===== nx lint contracts ---- ====== Livrables ====== libs/contracts/dto libs/contracts/types libs/contracts/enums libs/contracts/schemas libs/contracts/index.ts ---- ====== Définition de terminé ====== La Phase 4-C est terminée lorsque : ✓ DTO créés ✓ Types TypeScript créés ✓ Zod généré ✓ Contrats partagés Backend/Frontend ✓ Validation unifiée ✓ Build vert ---- ====== Phase 4-D — Structure NestJS Enterprise ====== ===== Objectif ===== Construire l'architecture complète du backend NestJS à partir : Prisma Schema consolidé OpenAPI Enterprise 4.0 Contrats DTO DDD CQRS Hexagonal Architecture À l'issue de cette phase : ✓ Backend structuré ✓ Modules générés ✓ CQRS en place ✓ Event Bus en place ✓ Repository Pattern ✓ Domain Services ✓ Guards ✓ Interceptors ✓ Filters ✓ Multi-Tenant ---- ====== Architecture cible ====== ===== Structure globale ===== apps/api/src ├── core ├── infrastructure ├── shared ├── modules └── bootstrap ---- ====== Étape 4-D.1 — Core Layer ====== ===== Objectif ===== Contenir les composants techniques communs. ---- ===== Arborescence ===== src/core ├── database ├── cqrs ├── events ├── guards ├── interceptors ├── filters ├── decorators ├── exceptions ├── logging └── tenancy ---- ====== Database ====== ===== Prisma Service ===== src/core/database/prisma.service.ts ---- ===== Prisma Module ===== src/core/database/prisma.module.ts ---- ====== CQRS ====== ===== Installation ===== npm install @nestjs/cqrs ---- ===== Module ===== src/core/cqrs/cqrs.module.ts ---- ===== Composants ===== Commands Queries Handlers Events Sagas ---- ====== Event Bus ====== ===== Événements globaux ===== UserCreated ReservationCreated ContractSigned PaymentReceived InvoiceGenerated LeadConverted MfaEnabled ---- ===== Répertoire ===== src/core/events ---- ====== Étape 4-D.2 — Shared Layer ====== ===== Objectif ===== Mutualiser les objets transverses. ---- ===== Structure ===== src/shared ├── dto ├── enums ├── constants ├── types ├── interfaces └── utils ---- ====== Étape 4-D.3 — Infrastructure Layer ====== ===== Objectif ===== Contenir les adaptateurs techniques. ---- ===== Structure ===== ====== Phase 4-D — Structure NestJS Enterprise ====== ===== Objectif ===== Construire l'architecture complète du backend NestJS à partir : Prisma Schema consolidé OpenAPI Enterprise 4.0 Contrats DTO DDD CQRS Hexagonal Architecture À l'issue de cette phase : ✓ Backend structuré ✓ Modules générés ✓ CQRS en place ✓ Event Bus en place ✓ Repository Pattern ✓ Domain Services ✓ Guards ✓ Interceptors ✓ Filters ✓ Multi-Tenant ---- ====== Architecture cible ====== ===== Structure globale ===== apps/api/src ├── core ├── infrastructure ├── shared ├── modules └── bootstrap ---- ====== Étape 4-D.1 — Core Layer ====== ===== Objectif ===== Contenir les composants techniques communs. ---- ===== Arborescence ===== src/core ├── database ├── cqrs ├── events ├── guards ├── interceptors ├── filters ├── decorators ├── exceptions ├── logging └── tenancy ---- ====== Database ====== ===== Prisma Service ===== src/core/database/prisma.service.ts ---- ===== Prisma Module ===== src/core/database/prisma.module.ts ---- ====== CQRS ====== ===== Installation ===== npm install @nestjs/cqrs ---- ===== Module ===== src/core/cqrs/cqrs.module.ts ---- ===== Composants ===== Commands Queries Handlers Events Sagas ---- ====== Event Bus ====== ===== Événements globaux ===== UserCreated ReservationCreated ContractSigned PaymentReceived InvoiceGenerated LeadConverted MfaEnabled ---- ===== Répertoire ===== src/core/events ---- ====== Étape 4-D.2 — Shared Layer ====== ===== Objectif ===== Mutualiser les objets transverses. ---- ===== Structure ===== src/shared ├── dto ├── enums ├── constants ├── types ├── interfaces └── utils ---- ====== Phase 4-D.3 — Infrastructure Layer (suite) ====== ===== Structure ===== src/infrastructure ├── prisma ├── cache ├── queue ├── mail ├── sms ├── storage ├── payments ├── signatures ├── ota ├── ai └── search ---- ====== Cache ====== ===== Redis ===== src/infrastructure/cache ---- ===== Installation ===== npm install @nestjs/cache-manager npm install cache-manager npm install cache-manager-redis-store npm install redis ---- ===== Services ===== CacheService CacheKeys CacheInvalidationService ---- ====== Queue ====== ===== BullMQ ===== npm install @nestjs/bullmq npm install bullmq ---- ===== Files ===== queue.module.ts jobs/ processors/ workers/ ---- ===== Jobs ===== SendEmailJob SendSmsJob GenerateInvoiceJob SyncOtaJob GenerateContractJob AiIndexationJob ---- ====== Mail ====== ===== Provider ===== SendGrid Mailgun SMTP Amazon SES ---- ===== Interface ===== export interface EmailProvider { send( payload: SendEmailPayload ): Promise; } ---- ====== SMS ====== ===== Provider ===== Twilio MessageBird OVH SMS ---- ===== Interface ===== export interface SmsProvider { send( payload: SendSmsPayload ): Promise; } ---- ====== Storage ====== ===== Providers ===== S3 MinIO Azure Blob ---- ===== Services ===== StorageService FileUploadService ImageOptimizationService ---- ====== Payments ====== ===== Providers ===== Stripe PayPal ---- ===== Adapters ===== StripeAdapter PaypalAdapter ---- ====== Signature ====== ===== Providers ===== DocuSign Yousign Universign ---- ===== Adapters ===== DocusignAdapter YousignAdapter ---- ====== OTA ====== ===== Connecteurs ===== BookingAdapter AirbnbAdapter VrboAdapter ExpediaAdapter ---- ====== IA ====== ===== Providers ===== OpenAI Azure OpenAI Anthropic ---- ===== Services ===== AiAssistantService EmbeddingService RecommendationService KnowledgeSearchService ---- ====== Étape 4-D.4 — Domain Modules ====== ===== Structure standard ===== Chaque domaine métier adopte exactement la même structure. ---- ===== Exemple ===== src/modules/properties ├── application ├── domain ├── infrastructure ├── presentation └── properties.module.ts ---- ====== Application Layer ====== ===== Structure ===== application ├── commands ├── queries ├── handlers ├── dto └── mappers ---- ===== Exemple ===== commands/ CreatePropertyCommand UpdatePropertyCommand PublishPropertyCommand ---- ===== Queries ===== GetPropertyQuery SearchPropertiesQuery GetAvailabilityQuery ---- ====== Domain Layer ====== ===== Structure ===== domain ├── entities ├── repositories ├── services ├── value-objects └── events ---- ===== Entités ===== Property Reservation Owner Invoice Lead ---- ===== Repositories ===== export interface PropertyRepository { findById(id: string); save(property: Property); delete(id: string); } ---- ===== Domain Services ===== PricingService ReservationService ContractService RevenueManagementService ---- ====== Infrastructure Layer Domaine ====== ===== Implémentations ===== PrismaPropertyRepository PrismaReservationRepository PrismaLeadRepository ---- ===== Exemple ===== infrastructure/prisma └── prisma-property.repository.ts ---- ====== Presentation Layer ====== ===== Structure ===== presentation ├── controllers ├── presenters └── swagger ---- ===== Exemple ===== properties.controller.ts availability.controller.ts rates.controller.ts ---- ====== Étape 4-D.5 — Modules Métier ====== ===== Modules à générer ===== AuthModule UsersModule OwnersModule PropertiesModule ReservationsModule ContractsModule PaymentsModule InvoicesModule CRMModule MessagingModule MarketingModule AutomationModule AiModule GovernanceModule OtaModule RevenueModule SecurityModule InternationalizationModule ---- ====== Étape 4-D.6 — Multi-Tenant ====== ===== Tenant Context ===== src/core/tenancy ---- ===== Service ===== TenantContextService ---- ===== Header ===== X-Tenant-Id ---- ===== Guard ===== TenantGuard ---- ===== Middleware ===== TenantMiddleware ---- ===== Objectif ===== Injecter automatiquement : tenantId dans tous les accès Prisma. ---- ====== Étape 4-D.7 — Security ====== ===== Guards ===== JwtAuthGuard RolesGuard PermissionsGuard TenantGuard MfaGuard ---- ===== Decorators ===== @CurrentUser() @Roles() @Permissions() @Tenant() ---- ====== Étape 4-D.8 — Interceptors ====== ===== Interceptors globaux ===== LoggingInterceptor AuditInterceptor CacheInterceptor TenantInterceptor ResponseTransformInterceptor ---- ====== Étape 4-D.9 — Exception Filters ====== ===== Filtres ===== GlobalExceptionFilter PrismaExceptionFilter ValidationExceptionFilter DomainExceptionFilter ---- ===== Exemple ===== { "success": false, "code": "PROPERTY_NOT_FOUND", "message": "Property not found" } ---- ====== Étape 4-D.10 — Bootstrap ====== ===== Structure ===== src/bootstrap ├── swagger.ts ├── validation.ts ├── security.ts └── app.ts ---- ===== main.ts ===== async function bootstrap() { const app = await NestFactory.create(AppModule); setupSwagger(app); setupValidation(app); setupSecurity(app); await app.listen(3000); } ---- ====== Étape 4-D.11 — AppModule ====== ===== Agrégation ===== AppModule ├── CoreModule ├── InfrastructureModule ├── AuthModule ├── UsersModule ├── OwnersModule ├── PropertiesModule ├── ReservationsModule ├── ContractsModule ├── PaymentsModule ├── CRMModule ├── MessagingModule ├── RevenueModule ├── SecurityModule ---- ====== Contrôles qualité ====== ===== Compilation ===== nx build api ---- ===== Lint ===== nx lint api ---- ===== Tests ===== nx test api ---- ====== Livrables ====== src/core src/shared src/infrastructure src/modules src/bootstrap app.module.ts main.ts ---- ====== Définition de terminé ====== La Phase 4-D est terminée lorsque : ✓ Architecture Hexagonale en place ✓ CQRS installé ✓ Event Bus installé ✓ Modules générés ✓ Multi-Tenant opérationnel ✓ Guards opérationnels ✓ Interceptors opérationnels ✓ Filters opérationnels ✓ Build vert ---- ====== Phase 4-E — Structure NextJS Enterprise ====== ===== Objectif ===== Construire l'architecture Frontend complète de la plateforme. Cette phase transforme : OpenAPI Enterprise DTO TypeScript SDK TypeScript Contrats API en une application : NextJS 15 React 19 TypeScript TanStack Query TailwindCSS shadcn/ui Multi-Tenant RBAC Internationalisée ---- ====== Résultat attendu ====== À l'issue de cette phase : ✓ Frontend compilable ✓ Authentification complète ✓ Layouts Enterprise ✓ Design System ✓ Pages métier ✓ Gestion permissions ✓ Multi-tenant ✓ Multi-langues ---- ====== Étape 4-E.1 — Création de l'application ====== ===== Génération ===== cd apps npx create-next-app@latest web ---- ===== Options ===== TypeScript YES ESLint YES TailwindCSS YES App Router YES src/ directory YES Turbopack YES Import Alias YES ---- ===== Résultat ===== apps/web ---- ====== Étape 4-E.2 — Installation des dépendances ====== ===== TanStack Query ===== npm install @tanstack/react-query npm install @tanstack/react-query-devtools ---- ===== Formulaires ===== npm install react-hook-form npm install zod npm install @hookform/resolvers ---- ===== Auth ===== npm install jwt-decode ---- ===== UI ===== npx shadcn@latest init ---- ===== Composants ===== npx shadcn add button npx shadcn add input npx shadcn add dialog npx shadcn add table npx shadcn add dropdown-menu npx shadcn add form npx shadcn add card npx shadcn add tabs npx shadcn add toast ---- ====== Étape 4-E.3 — Structure globale ====== ===== Architecture ===== apps/web/src ├── app ├── modules ├── components ├── layouts ├── hooks ├── services ├── providers ├── stores ├── lib ├── types └── config ---- ====== Étape 4-E.4 — Providers ====== ===== Structure ===== providers ├── query-provider.tsx ├── auth-provider.tsx ├── tenant-provider.tsx ├── theme-provider.tsx └── i18n-provider.tsx ---- ===== Query Provider ===== {children} ---- ====== Étape 4-E.5 — SDK API ====== ===== Structure ===== services/api ├── auth ├── users ├── properties ├── reservations ├── crm ├── finance ├── ota ├── ai └── security ---- ===== Exemple ===== export const getProperty = ( id: string ) => sdk.properties.getProperty(id); ---- ====== Étape 4-E.6 — Gestion Auth ====== ===== Structure ===== modules/auth ├── hooks ├── services ├── components └── pages ---- ===== Pages ===== /login /register /forgot-password /reset-password /mfa ---- ===== Hook ===== useCurrentUser() useLogin() useLogout() usePermissions() ---- ====== Étape 4-E.7 — Layouts ====== ===== Public ===== layouts/public-layout.tsx ---- ===== Auth ===== layouts/auth-layout.tsx ---- ===== Dashboard ===== layouts/dashboard-layout.tsx ---- ===== Owner ===== layouts/owner-layout.tsx ---- ===== Admin ===== layouts/admin-layout.tsx ---- ====== Étape 4-E.8 — Navigation ====== ===== Sidebar ===== Dashboard Reservations Properties Owners CRM Finance Marketing Analytics Security Administration ---- ===== Menu dynamique ===== Piloté par : Permissions Tenant Feature Flags ---- ====== Étape 4-E.9 — Module Properties ====== ===== Pages ===== /properties /properties/create /properties/[id] /properties/[id]/edit ---- ===== Composants ===== PropertyForm PropertyTable PropertyCard PropertyGallery AvailabilityCalendar ---- ====== Étape 4-E.10 — Module Reservations ====== ===== Pages ===== /reservations /reservations/create /reservations/[id] ---- ===== Composants ===== ReservationForm ReservationDetails GuestList PricingSummary ---- ====== Étape 4-E.11 — Module CRM ====== ===== Pages ===== /crm/leads /crm/opportunities /crm/tasks /crm/customers ---- ===== Composants ===== LeadKanban OpportunityPipeline TaskBoard CustomerTimeline ---- ====== Étape 4-E.12 — Module Finance ====== ===== Pages ===== /finance/payments /finance/invoices /finance/refunds ---- ===== Composants ===== InvoiceTable PaymentHistory RefundManager ---- ====== Étape 4-E.13 — Module OTA ====== ===== Pages ===== /ota/channels /ota/distribution /ota/synchronization ---- ===== Composants ===== ChannelStatus SyncDashboard DistributionTable ---- ====== Étape 4-E.14 — Module IA ====== ===== Pages ===== /ai /ai/chat /ai/recommendations /ai/knowledge-base ---- ===== Composants ===== AiChat RecommendationPanel KnowledgeSearch AutomationDashboard ---- ====== Étape 4-E.15 — Module Sécurité ====== ===== Pages ===== /security /security/mfa /security/sessions /security/privacy /security/compliance ---- ===== Composants ===== MfaWizard SessionManager ConsentManager RiskMatrix ---- ====== Étape 4-E.16 — Dashboard ====== ===== Route ===== /dashboard ---- ===== Widgets ===== Revenue KPI Occupancy KPI Reservations KPI Payments KPI Lead KPI Security KPI ---- ====== Étape 4-E.17 — Internationalisation ====== ===== Installation ===== npm install next-intl ---- ===== Langues ===== fr en es it de nl ---- ===== Structure ===== messages ├── fr.json ├── en.json ├── es.json └── de.json ---- ====== Étape 4-E.18 — Multi-Tenant ====== ===== Header ===== X-Tenant-Id ---- ===== Provider ===== TenantProvider ---- ===== Context ===== TenantContext ---- ===== Objectif ===== Changer dynamiquement : Branding Logo Couleurs Permissions Domaine selon le tenant. ---- ====== Étape 4-E.19 — RBAC Frontend ====== ===== Hooks ===== useRole() usePermission() useFeatureFlag() ---- ===== Composant ===== ---- ====== Étape 4-E.20 — Feature Flags ====== ===== Service ===== FeatureFlagProvider ---- ===== Exemple ===== ---- ====== Étape 4-E.21 — Gestion des erreurs ====== ===== Pages ===== not-found.tsx error.tsx global-error.tsx ---- ===== Composants ===== ErrorBoundary ApiErrorAlert ---- ====== Étape 4-E.22 — Tests ====== ===== Installation ===== npm install vitest npm install @testing-library/react npm install @testing-library/jest-dom ---- ===== Types ===== Unit Integration Component ---- ====== Contrôles qualité ====== ===== Lint ===== nx lint web ---- ===== Type Check ===== npx tsc --noEmit ---- ===== Build ===== nx build web ---- ===== Local ===== nx serve web ---- ====== Livrables ====== apps/web layouts providers modules components hooks services stores ---- ====== Définition de terminé ====== La Phase 4-E est terminée lorsque : ✓ NextJS compilable ✓ Auth fonctionnelle ✓ SDK intégré ✓ RBAC opérationnel ✓ Multi-Tenant opérationnel ✓ Internationalisation opérationnelle ✓ Dashboard opérationnel ✓ Build vert ---- ====== Phase 4-F — Docker Compose Enterprise ====== ===== Objectif ===== Industrialiser complètement l'environnement local de développement. À l'issue de cette phase : ✓ PostgreSQL ✓ Redis ✓ NestJS ✓ NextJS ✓ PgAdmin ✓ Mailhog ✓ MinIO ✓ Nginx ✓ Monitoring ✓ Docker Network ✓ Volumes persistants seront disponibles via une simple commande : docker compose up -d ---- ====== Architecture cible ====== ===== Services ===== ┌─────────────┐ │ NextJS │ └──────┬──────┘ │ ▼ ┌─────────────┐ │ NGINX │ └──────┬──────┘ │ ▼ ┌─────────────┐ │ NestJS │ └──────┬──────┘ │ ┌─────┼─────┐ ▼ ▼ ▼ Postgres Redis MinIO │ ▼ Mailhog ---- ====== Étape 4-F.1 — Structure Docker ====== ===== Créer ===== docker ├── postgres ├── redis ├── minio ├── nginx ├── mailhog ├── prometheus └── grafana ---- ====== Étape 4-F.2 — Docker Network ====== ===== docker-compose.yml ===== Créer à la racine : docker-compose.yml ---- ===== Network ===== networks: platform-network: driver: bridge ---- ====== Étape 4-F.3 — PostgreSQL ====== ===== Service ===== postgres: image: postgres:16 container_name: postgres restart: always environment: POSTGRES_DB: rental_platform POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data networks: - platform-network ---- ===== Volume ===== volumes: postgres_data: ---- ====== Étape 4-F.4 — PgAdmin ====== ===== Service ===== pgadmin: image: dpage/pgadmin4 container_name: pgadmin restart: always environment: PGADMIN_DEFAULT_EMAIL: admin@local.dev PGADMIN_DEFAULT_PASSWORD: admin ports: - "5050:80" depends_on: - postgres ---- ===== URL ===== http://localhost:5050 ---- ====== Étape 4-F.5 — Redis ====== ===== Service ===== redis: image: redis:7-alpine container_name: redis restart: always ports: - "6379:6379" volumes: - redis_data:/data networks: - platform-network ---- ===== Volume ===== redis_data: ---- ====== Étape 4-F.6 — Mailhog ====== ===== Service ===== mailhog: image: mailhog/mailhog container_name: mailhog restart: always ports: - "1025:1025" - "8025:8025" networks: - platform-network ---- ===== URLs ===== SMTP localhost:1025 ---------------- UI http://localhost:8025 ---- ====== Étape 4-F.7 — MinIO ====== ===== Service ===== minio: image: minio/minio container_name: minio command: server /data --console-address ":9001" restart: always environment: MINIO_ROOT_USER: admin MINIO_ROOT_PASSWORD: password123 ports: - "9000:9000" - "9001:9001" volumes: - minio_data:/data networks: - platform-network ---- ===== Volume ===== minio_data: ---- ===== Console ===== http://localhost:9001 ---- ====== Étape 4-F.8 — API NestJS ====== ===== Dockerfile ===== Créer : apps/api/Dockerfile ---- ===== Contenu ===== FROM node:22-alpine WORKDIR /app COPY . . RUN npm install RUN npm run build api CMD ["node","dist/apps/api/main.js"] ---- ===== Service ===== api: build: context: . dockerfile: apps/api/Dockerfile container_name: api restart: always ports: - "3000:3000" env_file: - apps/api/.env depends_on: - postgres - redis networks: - platform-network ---- ====== Étape 4-F.9 — Frontend NextJS ====== ===== Dockerfile ===== Créer : apps/web/Dockerfile ---- ===== Contenu ===== FROM node:22-alpine WORKDIR /app COPY . . RUN npm install RUN npm run build web CMD ["npm","run","start:web"] ---- ===== Service ===== web: build: context: . dockerfile: apps/web/Dockerfile container_name: web restart: always ports: - "4200:3000" depends_on: - api networks: - platform-network ---- ====== Étape 4-F.10 — NGINX Reverse Proxy ====== ===== Fichier ===== docker/nginx/default.conf ---- ===== Configuration ===== server { listen 80; location / { proxy_pass http://web:3000; } location /api { proxy_pass http://api:3000; } } ---- ===== Service ===== nginx: image: nginx:alpine container_name: nginx ports: - "80:80" volumes: - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf depends_on: - web - api networks: - platform-network ---- ====== Étape 4-F.11 — Prometheus ====== ===== Configuration ===== docker/prometheus/prometheus.yml ---- ===== Service ===== prometheus: image: prom/prometheus container_name: prometheus ports: - "9090:9090" volumes: - ./docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml networks: - platform-network ---- ====== Étape 4-F.12 — Grafana ====== ===== Service ===== grafana: image: grafana/grafana container_name: grafana ports: - "3001:3000" volumes: - grafana_data:/var/lib/grafana networks: - platform-network ---- ===== Volume ===== grafana_data: ---- ===== URL ===== http://localhost:3001 ---- ====== Étape 4-F.13 — Fichier .env Docker ====== ===== Créer ===== .env.docker ---- ===== Contenu ===== POSTGRES_USER=postgres POSTGRES_PASSWORD=postgres POSTGRES_DB=rental_platform REDIS_HOST=redis REDIS_PORT=6379 MINIO_ENDPOINT=minio MINIO_ACCESS_KEY=admin MINIO_SECRET_KEY=password123 ---- ====== Étape 4-F.14 — Démarrage ====== ===== Lancer ===== docker compose up -d ---- ===== Vérifier ===== docker ps ---- ===== Résultat ===== postgres redis mailhog minio pgadmin api web nginx prometheus grafana ---- ====== Étape 4-F.15 — Vérifications ====== ===== API ===== http://localhost:3000 ---- ===== Swagger ===== http://localhost:3000/api ---- ===== Front ===== http://localhost:4200 ---- ===== PgAdmin ===== http://localhost:5050 ---- ===== Mailhog ===== http://localhost:8025 ---- ===== MinIO ===== http://localhost:9001 ---- ===== Grafana ===== http://localhost:3001 ---- ===== Prometheus ===== http://localhost:9090 ---- ====== Définition de terminé ====== La Phase 4-F est terminée lorsque : ✓ Tous les conteneurs démarrent ✓ PostgreSQL accessible ✓ Redis accessible ✓ API accessible ✓ Frontend accessible ✓ Swagger accessible ✓ Mailhog opérationnel ✓ MinIO opérationnel ✓ Monitoring opérationnel ---- ====== Livrables ====== docker-compose.yml apps/api/Dockerfile apps/web/Dockerfile docker/nginx/default.conf docker/prometheus/prometheus.yml .env.docker ---- ====== Phase 4-G — GitHub Actions CI/CD Enterprise ====== ===== Objectif ===== Industrialiser complètement le cycle de développement. À l'issue de cette phase : ✓ Build automatique ✓ Lint automatique ✓ Tests automatiques ✓ Validation Prisma ✓ Génération OpenAPI ✓ Build Docker ✓ Security Scan ✓ Release automatique ✓ Qualité contrôlée sur chaque : Push Pull Request Release ---- ====== Architecture CI/CD ====== ===== Pipelines ===== CI ↓ Quality ↓ Security ↓ Docker ↓ Release ↓ Deploy ---- ====== Structure ====== ===== Répertoire ===== .github └── workflows ├── ci.yml ├── quality.yml ├── security.yml ├── docker.yml ├── release.yml └── deploy.yml ---- ====== Étape 4-G.1 — Workflow CI ====== ===== Fichier ===== .github/workflows/ci.yml ---- ===== Déclencheurs ===== on: push: branches: - main - develop pull_request: ---- ===== Jobs ===== Install Lint Build Test ---- ===== Exemple ===== name: CI jobs: install: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 - run: npm ci ---- ====== Étape 4-G.2 — Lint ====== ===== Job ===== lint: runs-on: ubuntu-latest steps: - run: nx lint api - run: nx lint web - run: nx lint contracts ---- ===== Contrôle ===== ESLint Prettier Architecture ---- ====== Étape 4-G.3 — Type Check ====== ===== Job ===== typecheck: runs-on: ubuntu-latest steps: - run: npx tsc --noEmit ---- ====== Étape 4-G.4 — Prisma Validation ====== ===== Job ===== prisma: runs-on: ubuntu-latest steps: - run: npx prisma validate - run: npx prisma format --check ---- ===== Objectif ===== Empêcher : Migration cassée Relation invalide Schema incorrect ---- ====== Étape 4-G.5 — Build ====== ===== API ===== build-api: runs-on: ubuntu-latest steps: - run: nx build api ---- ===== Front ===== build-web: runs-on: ubuntu-latest steps: - run: nx build web ---- ===== Contracts ===== build-contracts: runs-on: ubuntu-latest steps: - run: nx build contracts ---- ====== Étape 4-G.6 — Tests ====== ===== Unitaires ===== test-unit: runs-on: ubuntu-latest steps: - run: nx test api - run: nx test web ---- ===== Couverture ===== Minimum 80% ---- ===== Contrôle ===== - run: npm run test:coverage ---- ====== Étape 4-G.7 — PostgreSQL CI ====== ===== Service ===== services: postgres: image: postgres:16 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: testdb ports: - 5432:5432 ---- ===== Migration ===== - run: npx prisma migrate deploy ---- ===== Seed ===== - run: npx prisma db seed ---- ====== Étape 4-G.8 — Tests E2E ====== ===== Job ===== e2e: runs-on: ubuntu-latest ---- ===== Scénarios ===== Register Login Create Property Create Reservation Create Invoice Payment ---- ===== Commande ===== - run: nx e2e api-e2e ---- ====== Étape 4-G.9 — Security Scan ====== ===== Dépendances ===== - run: npm audit ---- ===== Trivy ===== - uses: aquasecurity/trivy-action ---- ===== Vérifications ===== CVE Secrets Images Docker ---- ====== Étape 4-G.10 — Secret Scan ====== ===== Gitleaks ===== - uses: gitleaks/gitleaks-action ---- ===== Détecte ===== API Keys Passwords Tokens Secrets AWS ---- ====== Étape 4-G.11 — OpenAPI Validation ====== ===== Génération ===== - run: npm run swagger:generate ---- ===== Validation ===== - run: npm run openapi:validate ---- ===== Vérification ===== Swagger valide Contrats cohérents ---- ====== Étape 4-G.12 — Build Docker ====== ===== Job ===== docker: runs-on: ubuntu-latest ---- ===== API ===== docker build \ -f apps/api/Dockerfile . ---- ===== Front ===== docker build \ -f apps/web/Dockerfile . ---- ====== Étape 4-G.13 — Push Registry ====== ===== GitHub Container Registry ===== ghcr.io ---- ===== Login ===== - uses: docker/login-action@v3 ---- ===== Push ===== docker push ghcr.io/company/api docker push ghcr.io/company/web ---- ====== Étape 4-G.14 — Release Automation ====== ===== Fichier ===== .github/workflows/release.yml ---- ===== Déclencheur ===== on: push: tags: - 'v*' ---- ===== Exemple ===== v1.0.0 v1.1.0 v2.0.0 ---- ===== Génération ===== Release Notes Docker Images Artifacts ---- ====== Étape 4-G.15 — Artifacts ====== ===== Upload ===== - uses: actions/upload-artifact ---- ===== Artifacts ===== OpenAPI Coverage Build Migration SQL ---- ====== Étape 4-G.16 — Badges ====== ===== README ===== ![CI] ![Coverage] ![Docker] ![Security] ---- ====== Étape 4-G.17 — Branch Protection ====== ===== Main ===== Configurer GitHub : Require Pull Request Require CI Require Reviews Require Status Checks ---- ===== Interdictions ===== Push direct main Merge sans review Merge sans CI ---- ====== Étape 4-G.18 — Dependabot ====== ===== Fichier ===== .github/dependabot.yml ---- ===== Exemple ===== version: 2 updates: - package-ecosystem: npm directory: "/" schedule: interval: weekly ---- ====== Étape 4-G.19 — Renovate (optionnel) ====== ===== Alternative ===== Renovate Bot pour : NPM Docker GitHub Actions Terraform ---- ====== Étape 4-G.20 — Qualité Enterprise ====== ===== Gates ===== Coverage > 80% 0 erreur ESLint 0 erreur TypeScript 0 migration invalide 0 vulnérabilité critique ---- ====== Arborescence finale ====== .github └── workflows ├── ci.yml ├── quality.yml ├── security.yml ├── docker.yml ├── release.yml └── deploy.yml .github └── dependabot.yml ---- ====== Définition de terminé ====== La Phase 4-G est terminée lorsque : ✓ CI verte ✓ Build automatique ✓ Lint automatique ✓ Tests automatiques ✓ Docker build automatique ✓ OpenAPI validé ✓ Security scan actif ✓ Releases automatisées ---- ====== Livrables ====== .github/workflows/* .github/dependabot.yml README.md Badges CI ---- ====== Phase 4-H — Helm Charts Kubernetes Enterprise ====== ===== Objectif ===== Préparer la plateforme pour un déploiement Cloud Native Enterprise. Cette phase transforme : Docker Compose ↓ Kubernetes ↓ Helm Charts afin de permettre : AWS EKS Azure AKS Google GKE OVH Managed Kubernetes On-Prem Kubernetes ---- ====== Résultat attendu ====== À l'issue de cette phase : ✓ Helm Charts complets ✓ Déploiement automatisé ✓ Rolling Updates ✓ Autoscaling ✓ Secrets Kubernetes ✓ ConfigMaps ✓ Ingress ✓ Monitoring ---- ====== Architecture Kubernetes ====== Namespace │ ├── web ├── api ├── postgres ├── redis ├── minio ├── ingress ├── monitoring └── jobs ---- ====== Étape 4-H.1 — Structure Helm ====== ===== Créer ===== deploy └── helm └── rental-platform ├── Chart.yaml ├── values.yaml ├── values-dev.yaml ├── values-staging.yaml ├── values-prod.yaml └── templates ---- ====== Étape 4-H.2 — Chart.yaml ====== ===== Fichier ===== deploy/helm/rental-platform/Chart.yaml ---- ===== Contenu ===== apiVersion: v2 name: rental-platform description: Rental Platform Enterprise type: application version: 1.0.0 appVersion: "1.0.0" ---- ====== Étape 4-H.3 — values.yaml ====== ===== Configuration globale ===== global: environment: dev domain: local.dev ---- ===== Images ===== image: api: repository: ghcr.io/company/api tag: latest web: repository: ghcr.io/company/web tag: latest ---- ====== Étape 4-H.4 — Namespace ====== ===== Template ===== templates/namespace.yaml ---- ===== Contenu ===== apiVersion: v1 kind: Namespace metadata: name: rental-platform ---- ====== Étape 4-H.5 — API Deployment ====== ===== Template ===== templates/api-deployment.yaml ---- ===== Deployment ===== apiVersion: apps/v1 kind: Deployment metadata: name: api ---- ===== ReplicaSet ===== spec: replicas: 3 ---- ===== Container ===== containers: - name: api image: "{{ .Values.image.api.repository }}:{{ .Values.image.api.tag }}" ---- ====== Étape 4-H.6 — API Service ====== ===== Template ===== templates/api-service.yaml ---- ===== Service ===== kind: Service spec: type: ClusterIP ports: - port: 3000 ---- ====== Étape 4-H.7 — Web Deployment ====== ===== Template ===== templates/web-deployment.yaml ---- ===== Replicas ===== spec: replicas: 2 ---- ===== Container ===== containers: - name: web ---- ====== Étape 4-H.8 — Web Service ====== ===== Template ===== templates/web-service.yaml ---- ===== Service ===== type: ClusterIP ---- ====== Étape 4-H.9 — PostgreSQL ====== ===== Option 1 ===== Utiliser : Bitnami PostgreSQL ---- ===== Dépendance ===== dependencies: - name: postgresql version: 15.* repository: https://charts.bitnami.com/bitnami ---- ===== Valeurs ===== postgresql: auth: database: rental_platform ---- ====== Étape 4-H.10 — Redis ====== ===== Dépendance ===== dependencies: - name: redis repository: https://charts.bitnami.com/bitnami ---- ===== Valeurs ===== redis: architecture: standalone ---- ====== Étape 4-H.11 — MinIO ====== ===== Dépendance ===== dependencies: - name: minio repository: https://charts.bitnami.com/bitnami ---- ===== Bucket ===== contracts properties documents uploads ---- ====== Étape 4-H.12 — ConfigMap ====== ===== Template ===== templates/configmap.yaml ---- ===== Variables ===== DATABASE_HOST REDIS_HOST MINIO_ENDPOINT NODE_ENV ---- ====== Étape 4-H.13 — Secrets ====== ===== Template ===== templates/secret.yaml ---- ===== Contenu ===== POSTGRES_PASSWORD JWT_SECRET MINIO_SECRET_KEY STRIPE_SECRET_KEY ---- ===== Recommandation ===== Ne jamais stocker les secrets dans Git. Utiliser : External Secrets AWS Secrets Manager Azure Key Vault Hashicorp Vault ---- ====== Étape 4-H.14 — Ingress ====== ===== Template ===== templates/ingress.yaml ---- ===== Domaine ===== api.domain.com app.domain.com ---- ===== Exemple ===== rules: - host: api.domain.com - host: app.domain.com ---- ====== Étape 4-H.15 — TLS ====== ===== Cert Manager ===== cert-manager ---- ===== Issuer ===== Let's Encrypt ---- ===== HTTPS ===== TLS obligatoire ---- ====== Étape 4-H.16 — Horizontal Pod Autoscaler ====== ===== API ===== templates/api-hpa.yaml ---- ===== Configuration ===== minReplicas: 3 maxReplicas: 20 targetCPUUtilizationPercentage: 70 ---- ===== Web ===== minReplicas: 2 maxReplicas: 10 ---- ====== Étape 4-H.17 — Pod Disruption Budget ====== ===== API ===== minAvailable: 2 ---- ===== Web ===== minAvailable: 1 ---- ====== Étape 4-H.18 — Resources ====== ===== API ===== requests: cpu: 500m memory: 512Mi limits: cpu: 2000m memory: 2Gi ---- ===== Web ===== requests: cpu: 250m memory: 256Mi ---- ====== Étape 4-H.19 — Liveness & Readiness ====== ===== API ===== livenessProbe: httpGet: path: /health port: 3000 ---- ===== Readiness ===== readinessProbe: httpGet: path: /health port: 3000 ---- ====== Étape 4-H.20 — Jobs Kubernetes ====== ===== Migrations Prisma ===== templates/job-migration.yaml ---- ===== Commande ===== npx prisma migrate deploy ---- ===== Seed ===== npx prisma db seed ---- ====== Étape 4-H.21 — Monitoring ====== ===== Prometheus ===== kube-prometheus-stack ---- ===== Grafana ===== Dashboards API PostgreSQL Redis Kubernetes ---- ====== Étape 4-H.22 — Logging ====== ===== Stack ===== Loki Promtail Grafana ---- ===== Objectif ===== Centraliser : API Logs Audit Logs Security Logs Business Logs ---- ====== Étape 4-H.23 — Installation ====== ===== Ajouter dépendances ===== helm dependency update ---- ===== Vérifier ===== helm lint deploy/helm/rental-platform ---- ===== Dry Run ===== helm install rental-platform \ deploy/helm/rental-platform \ --dry-run ---- ====== Étape 4-H.24 — Déploiement ====== ===== Dev ===== helm upgrade \ --install rental-platform \ deploy/helm/rental-platform \ -f values-dev.yaml ---- ===== Staging ===== helm upgrade \ --install rental-platform \ -f values-staging.yaml ---- ===== Production ===== helm upgrade \ --install rental-platform \ -f values-prod.yaml ---- ====== Arborescence finale ====== deploy └── helm └── rental-platform ├── Chart.yaml ├── values.yaml ├── values-dev.yaml ├── values-staging.yaml ├── values-prod.yaml └── templates ├── namespace.yaml ├── api-deployment.yaml ├── api-service.yaml ├── web-deployment.yaml ├── web-service.yaml ├── ingress.yaml ├── configmap.yaml ├── secret.yaml ├── api-hpa.yaml └── job-migration.yaml ---- ====== Définition de terminé ====== La Phase 4-H est terminée lorsque : ✓ Helm valide ✓ Déploiement Kubernetes valide ✓ HPA opérationnel ✓ TLS opérationnel ✓ Monitoring opérationnel ✓ Logging centralisé ✓ Rolling Update opérationnel ---- ====== Livrables ====== deploy/helm/** Chart.yaml values*.yaml templates/* ---- ====== Phase 4-I — Terraform Infrastructure Enterprise ====== ===== Objectif ===== Décrire l'intégralité de l'infrastructure Cloud sous forme de code. Cette phase transforme : Infrastructure manuelle ↓ Infrastructure as Code (IaC) ↓ Terraform afin d'obtenir : ✓ Infrastructure reproductible ✓ Multi-environnements ✓ Versionnée dans Git ✓ Auditée ✓ Déployable automatiquement ---- ====== Plateforme cible ====== ===== Cloud principal ===== AWS ---- ===== Compatibilité ===== AWS Azure GCP OVH Cloud ---- ===== Architecture cible ===== Internet ↓ Cloudflare ↓ ALB ↓ EKS ├── API ├── WEB ├── Workers ↓ RDS PostgreSQL ↓ Elasticache Redis ↓ S3 ↓ Secrets Manager ↓ CloudWatch ---- ====== Étape 4-I.1 — Structure Terraform ====== ===== Créer ===== deploy └── terraform ├── environments │ ├── dev │ ├── staging │ └── prod │ ├── modules │ ├── network │ ├── eks │ ├── rds │ ├── redis │ ├── s3 │ ├── dns │ ├── monitoring │ └── security │ └── global ---- ====== Étape 4-I.2 — Backend Terraform ====== ===== Objectif ===== Stocker l'état Terraform. ---- ===== Fichier ===== global/backend.tf ---- ===== Exemple AWS ===== terraform { backend "s3" { bucket = "rental-platform-tf-state" key = "prod/terraform.tfstate" region = "eu-west-3" encrypt = true } } ---- ====== Étape 4-I.3 — Provider AWS ====== ===== provider.tf ===== provider "aws" { region = var.aws_region } ---- ===== Variables ===== variable "aws_region" { default = "eu-west-3" } ---- ====== Étape 4-I.4 — Réseau (VPC) ====== ===== Module ===== modules/network ---- ===== Ressources ===== VPC Public Subnets Private Subnets NAT Gateway Internet Gateway Route Tables ---- ===== Exemple ===== resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" } ---- ====== Étape 4-I.5 — Kubernetes EKS ====== ===== Module ===== modules/eks ---- ===== Cluster ===== resource "aws_eks_cluster" "main" { name = "rental-platform" } ---- ===== Node Groups ===== System Application Jobs ---- ===== Sizing ===== Min 3 nodes Max 20 nodes ---- ====== Étape 4-I.6 — PostgreSQL RDS ====== ===== Module ===== modules/rds ---- ===== Ressource ===== resource "aws_db_instance" "postgres" { engine = "postgres" engine_version = "16" } ---- ===== Configuration ===== Multi-AZ Encrypted Automated Backup Point In Time Recovery ---- ===== Taille initiale ===== db.t3.medium ---- ====== Étape 4-I.7 — Redis ====== ===== Module ===== modules/redis ---- ===== Ressource ===== resource "aws_elasticache_replication_group" "redis" { engine = "redis" } ---- ===== Configuration ===== Primary Replica Automatic Failover ---- ====== Étape 4-I.8 — S3 ====== ===== Module ===== modules/s3 ---- ===== Buckets ===== contracts properties documents backups exports ---- ===== Exemple ===== resource "aws_s3_bucket" "documents" { bucket = "rental-platform-documents" } ---- ====== Étape 4-I.9 — DNS ====== ===== Module ===== modules/dns ---- ===== Route53 ===== api.domain.com app.domain.com grafana.domain.com ---- ===== Exemple ===== resource "aws_route53_record" "api" { } ---- ====== Étape 4-I.10 — Certificats SSL ====== ===== ACM ===== resource "aws_acm_certificate" "main" { } ---- ===== Domaines ===== *.domain.com ---- ====== Étape 4-I.11 — Load Balancer ====== ===== ALB ===== resource "aws_lb" "main" { } ---- ===== Routing ===== /api ↓ NestJS ---------------- / ↓ NextJS ---- ====== Étape 4-I.12 — Secrets Manager ====== ===== Module ===== modules/security ---- ===== Secrets ===== DATABASE_URL JWT_SECRET STRIPE_SECRET MINIO_SECRET OPENAI_API_KEY ---- ===== Exemple ===== resource "aws_secretsmanager_secret" "jwt" { } ---- ====== Étape 4-I.13 — Monitoring ====== ===== Module ===== modules/monitoring ---- ===== Services ===== CloudWatch Prometheus Grafana ---- ===== Dashboards ===== API Database Redis Kubernetes Business KPI ---- ====== Étape 4-I.14 — Logging ====== ===== Services ===== CloudWatch Logs Loki ---- ===== Collecte ===== API Logs Audit Logs Security Logs Job Logs ---- ====== Étape 4-I.15 — Alerting ====== ===== Canaux ===== Email Slack Teams PagerDuty ---- ===== Déclencheurs ===== CPU > 80% Memory > 80% API Down Database Down Failed Jobs ---- ====== Étape 4-I.16 — WAF ====== ===== Protection ===== AWS WAF ---- ===== Règles ===== SQL Injection XSS Rate Limit Bots ---- ====== Étape 4-I.17 — CloudFront ====== ===== CDN ===== resource "aws_cloudfront_distribution" "main" { } ---- ===== Accélération ===== Images Documents Frontend Assets ---- ====== Étape 4-I.18 — Environnement DEV ====== ===== Dossier ===== environments/dev ---- ===== Taille ===== 1 node Petite RDS Petit Redis ---- ====== Étape 4-I.19 — Environnement STAGING ====== ===== Dossier ===== environments/staging ---- ===== Taille ===== 2 nodes Replica DB ---- ====== Étape 4-I.20 — Environnement PROD ====== ===== Dossier ===== environments/prod ---- ===== Taille ===== 3+ nodes Multi-AZ Autoscaling HA ---- ====== Étape 4-I.21 — Variables Terraform ====== ===== variables.tf ===== variable "environment" {} variable "domain_name" {} variable "db_instance_class" {} ---- ===== terraform.tfvars ===== environment = "prod" domain_name = "example.com" ---- ====== Étape 4-I.22 — Outputs ====== ===== outputs.tf ===== output "api_url" {} output "web_url" {} output "database_endpoint" {} ---- ====== Étape 4-I.23 — Validation ====== ===== Format ===== terraform fmt ---- ===== Validation ===== terraform validate ---- ===== Plan ===== terraform plan ---- ===== Apply ===== terraform apply ---- ====== Définition de terminé ====== La Phase 4-I est terminée lorsque : ✓ VPC créé ✓ EKS créé ✓ PostgreSQL créé ✓ Redis créé ✓ S3 créé ✓ DNS créé ✓ SSL créé ✓ Monitoring créé ✓ Terraform validé ---- ====== Livrables ====== deploy/terraform modules/network modules/eks modules/rds modules/redis modules/s3 modules/dns modules/security modules/monitoring ---- ====== Phase 4-J — Monorepo Final Enterprise ====== ===== Objectif ===== Assembler l'ensemble des livrables produits depuis la Phase 1 jusqu'à la Phase 4-I dans un dépôt unique, cohérent et exécutable. À l'issue de cette phase : ✓ Monorepo finalisé ✓ Backend NestJS ✓ Frontend NextJS ✓ Prisma ✓ PostgreSQL ✓ Redis ✓ Contracts ✓ SDK ✓ Docker ✓ Helm ✓ Terraform ✓ GitHub Actions ✓ Documentation Le projet devient alors : Release Enterprise 4.0 prête pour le développement métier continu. ---- ====== Vision finale ====== ===== Dépôt Git ===== rental-platform/ ---- ===== Architecture ===== rental-platform ├── apps ├── libs ├── deploy ├── docker ├── docs ├── scripts ├── .github ├── package.json ├── nx.json ├── tsconfig.base.json └── README.md ---- ====== Étape 4-J.1 — Applications ====== ===== Structure ===== apps ├── api └── web ---- ===== API ===== apps/api ├── prisma ├── src ├── test ├── Dockerfile └── project.json ---- ===== WEB ===== apps/web ├── src ├── public ├── Dockerfile └── project.json ---- ====== Étape 4-J.2 — Librairies ====== ===== Structure ===== libs ├── contracts ├── sdk ├── ui ├── config ├── shared ├── testing └── eslint-config ---- ===== contracts ===== DTO Types Enums Zod Schemas ---- ===== sdk ===== OpenAPI Client React Query Hooks API Wrappers ---- ===== ui ===== Design System Layout Components Business Components ---- ====== Étape 4-J.3 — Infrastructure ====== ===== Structure ===== deploy ├── helm └── terraform ---- ===== Helm ===== deploy/helm/rental-platform ---- ===== Terraform ===== deploy/terraform ---- ====== Étape 4-J.4 — Docker ====== ===== Structure ===== docker ├── nginx ├── postgres ├── redis ├── minio ├── prometheus └── grafana ---- ===== Fichier principal ===== docker-compose.yml ---- ====== Étape 4-J.5 — GitHub ====== ===== Structure ===== .github ├── workflows └── dependabot.yml ---- ===== Workflows ===== ci.yml quality.yml security.yml docker.yml release.yml deploy.yml ---- ====== Étape 4-J.6 — Scripts ====== ===== Structure ===== scripts ├── bootstrap.sh ├── migrate.sh ├── seed.sh ├── reset-db.sh ├── generate-sdk.sh ├── generate-openapi.sh └── release.sh ---- ===== bootstrap.sh ===== Objectif : Installation complète développeur ---- ===== Exemple ===== #!/bin/bash npm install docker compose up -d npx prisma migrate dev npx prisma db seed nx run-many --target=build ---- ====== Étape 4-J.7 — Documentation ====== ===== Structure ===== docs ├── architecture ├── api ├── deployment ├── development ├── operations └── decisions ---- ===== Architecture ===== DDD CQRS Hexagonal Multi-Tenant RBAC ---- ===== API ===== OpenAPI Swagger SDK ---- ====== Étape 4-J.8 — README principal ====== ===== Sections ===== Présentation Architecture Prérequis Installation Développement Tests Déploiement Contribution ---- ===== Démarrage rapide ===== git clone ... cd rental-platform npm install docker compose up -d npx prisma migrate dev npx prisma db seed nx serve api nx serve web ---- ====== Étape 4-J.9 — Qualité globale ====== ===== Vérifications ===== nx graph ---- ===== Lint ===== nx run-many \ --target=lint \ --all ---- ===== Tests ===== nx run-many \ --target=test \ --all ---- ===== Build ===== nx run-many \ --target=build \ --all ---- ====== Étape 4-J.10 — Génération OpenAPI ====== ===== Commande ===== npm run swagger:generate ---- ===== Livrable ===== docs/api/openapi.yaml ---- ====== Étape 4-J.11 — Génération SDK ====== ===== Commande ===== npm run sdk:generate ---- ===== Livrable ===== libs/sdk ---- ====== Étape 4-J.12 — Release Enterprise ====== ===== Version ===== v1.0.0 ---- ===== Tag Git ===== git tag v1.0.0 git push origin v1.0.0 ---- ===== Déclenche ===== Release GitHub Build Docker Publication Registry Artifacts ---- ====== Arborescence finale ====== rental-platform ├── apps │ │ ├── api │ └── web │ ├── libs │ │ ├── contracts │ ├── sdk │ ├── ui │ ├── config │ └── shared │ ├── deploy │ │ ├── helm │ └── terraform │ ├── docker │ ├── docs │ ├── scripts │ ├── .github │ ├── docker-compose.yml │ ├── package.json │ ├── nx.json │ └── README.md ---- ====== Définition de terminé ====== La Phase 4-J est terminée lorsque : ✓ Monorepo compilable ✓ API compilable ✓ Frontend compilable ✓ Prisma opérationnel ✓ Docker opérationnel ✓ CI opérationnelle ✓ Helm valide ✓ Terraform valide ✓ OpenAPI généré ✓ SDK généré ✓ Documentation présente ---- ====== Livrables finaux ====== Repository Enterprise complet Backend NestJS Frontend NextJS Prisma Contracts SDK Docker GitHub Actions Helm Terraform Documentation ---- ====== Fin du cycle d'architecture ====== Le projet dispose désormais de : Architecture fonctionnelle Architecture technique Contrat API Modèle de données Infrastructure CI/CD Industrialisation La suite logique n'est plus la conception. La suite logique est : ===== Sprint Développement 1 ===== Implémentation réelle du domaine Authentification Register Login JWT Refresh Token RBAC Swagger Tests sur la base du monorepo désormais entièrement structuré et prêt à exécuter du code métier.