====== Spécification OpenAPI 3.1 ====== ===== Objectif ===== Cette spécification constitue le contrat officiel entre : * Frontend NextJS * Backend NestJS * Applications mobiles futures * SDK partenaires * Intégrations externes Elle permet : * Génération Swagger * Génération SDK TypeScript * Génération SDK Java * Génération SDK PHP * Génération SDK Flutter * Génération automatique des DTO ---- ====== Convention API ====== ===== Base URL ===== https://api.location-platform.com/api/v1 ---- ===== Format ===== application/json ---- ===== Encodage ===== UTF-8 ---- ===== Versionning ===== /api/v1 /api/v2 ---- ====== Authentification ====== ===== JWT ===== Header obligatoire : Authorization: Bearer ---- ===== Schéma OpenAPI ===== components: securitySchemes: bearerAuth: type: http scheme: bearer bearerFormat: JWT ---- ====== Structure des réponses ====== ===== Succès ===== { "success": true, "data": {}, "meta": {}, "links": {} } ---- ===== Erreur ===== { "success": false, "error": { "code": "PROPERTY_NOT_FOUND", "message": "Property not found" } } ---- ====== Pagination ====== ===== Paramètres ===== ?page=1 ?pageSize=20 ---- ===== Réponse ===== { "success": true, "data": [], "meta": { "page": 1, "pageSize": 20, "total": 245, "pages": 13 } } ---- ====== Tri ====== ===== Paramètres ===== ?sort=createdAt ?sort=-createdAt ?sort=price ?sort=-price ---- ====== Filtrage ====== ===== Exemple ===== GET /properties ?city=Montpellier &status=PUBLISHED &minPrice=100 &maxPrice=300 ---- ====== DTO Standards ====== ===== UUID ===== Uuid: type: string format: uuid ---- ===== Money ===== Money: type: number format: double ---- ===== Date ===== Date: type: string format: date ---- ===== DateTime ===== DateTime: type: string format: date-time ---- ====== Module Auth ====== ===== Login ===== ==== Request ===== POST /auth/login Body : { "email": "john@example.com", "password": "secret" } ---- ==== Response ===== { "success": true, "data": { "accessToken": "...", "refreshToken": "...", "expiresIn": 3600 } } ---- ===== Register ===== POST /auth/register ---- ===== Refresh Token ===== POST /auth/refresh ---- ===== Logout ===== POST /auth/logout ---- ====== Module Users ====== ===== User DTO ===== User: type: object properties: id: $ref: '#/components/schemas/Uuid' email: type: string status: type: string profile: $ref: '#/components/schemas/UserProfile' ---- ===== UserProfile DTO ===== UserProfile: type: object properties: firstName: type: string lastName: type: string phone: type: string ---- ===== Endpoints ===== GET /users/me PUT /users/me GET /users/{id} GET /users DELETE /users/{id} ---- ====== Module Properties ====== ===== Property DTO ===== Property: type: object properties: id: type: string code: type: string title: type: string status: type: string surface: type: number roomCount: type: integer bedroomCount: type: integer bathroomCount: type: integer capacity: type: integer address: $ref: '#/components/schemas/PropertyAddress' ---- ===== PropertyAddress DTO ===== PropertyAddress: type: object properties: address1: type: string city: type: string postalCode: type: string country: type: string latitude: type: number longitude: type: number ---- ===== Recherche de biens ===== GET /properties Paramètres : city status minPrice maxPrice bedrooms bathrooms capacity page pageSize sort ---- ===== Création ===== POST /properties ---- ===== Consultation ===== GET /properties/{id} ---- ===== Modification ===== PUT /properties/{id} ---- ===== Suppression ===== DELETE /properties/{id} ---- ====== Module Reservations ====== ===== Reservation DTO ===== Reservation: type: object properties: id: type: string reservationNumber: type: string status: type: string startDate: type: string endDate: type: string totalAmount: type: number ---- ===== Création réservation ===== POST /reservations Body : { "propertyId": "uuid", "startDate": "2026-07-01", "endDate": "2026-07-15", "guestCount": 4 } ---- ===== Consultation ===== GET /reservations/{id} ---- ===== Modification ===== PUT /reservations/{id} ---- ===== Annulation ===== POST /reservations/{id}/cancel ---- ====== Module Contracts ====== ===== Contract DTO ===== Contract: type: object properties: id: type: string contractNumber: type: string status: type: string signedAt: type: string ---- ===== Génération ===== POST /contracts/generate ---- ===== Signature ===== POST /contracts/{id}/sign ---- ===== Téléchargement ===== GET /contracts/{id}/download ---- ====== Module Payments ====== ===== Payment DTO ===== Payment: type: object properties: id: type: string amount: type: number status: type: string paymentDate: type: string ---- ===== Paiement ===== POST /payments ---- ===== Historique ===== GET /payments GET /payments/{id} ---- ===== Remboursement ===== POST /payments/{id}/refund ---- ====== Module CRM ====== ===== Leads ===== GET /crm/leads POST /crm/leads PUT /crm/leads/{id} DELETE /crm/leads/{id} ---- ===== Activités ===== GET /crm/activities POST /crm/activities ---- ====== Module Messaging ====== ===== Conversations ===== GET /conversations POST /conversations GET /conversations/{id} ---- ===== Messages ===== GET /conversations/{id}/messages POST /conversations/{id}/messages ---- ====== Module Reporting ====== ===== Dashboard ===== GET /reports/dashboard ---- ===== KPI ===== GET /reports/kpis ---- ===== Export ===== POST /reports/export ---- ====== Validation métier ====== ===== Property ===== title: minLength: 5 maxLength: 255 surface: minimum: 1 capacity: minimum: 1 ---- ===== Reservation ===== startDate: required: true endDate: required: true guestCount: minimum: 1 ---- ===== Payment ===== amount: minimum: 0.01 ---- ====== Codes erreurs ====== ^ Code ^ HTTP ^ Description ^ | VALIDATION_ERROR | 400 | Données invalides | | UNAUTHORIZED | 401 | Authentification requise | | FORBIDDEN | 403 | Accès refusé | | NOT_FOUND | 404 | Ressource inexistante | | CONFLICT | 409 | Conflit métier | | INTERNAL_ERROR | 500 | Erreur serveur | ---- ====== Swagger ====== ===== Configuration NestJS ===== const config = new DocumentBuilder() .setTitle('Rental API') .setDescription('Rental Platform API') .setVersion('1.0') .addBearerAuth() .build(); ---- ===== URL Swagger ===== https://api.location-platform.com/docs ---- ====== Volume estimé ====== ^ Domaine ^ Endpoints ^ | Auth | 15 | | Users | 20 | | Owners | 20 | | Properties | 40 | | Reservations | 35 | | Contracts | 15 | | Payments | 20 | | CRM | 25 | | Messaging | 15 | | Reporting | 20 | | Administration | 25 | Total estimé : environ 250 endpoints REST. ---- ====== Livrables générés ====== * Contrat OpenAPI 3.1 * Swagger UI * DTO TypeScript * SDK Frontend * SDK Mobile * Validation JSON Schema * Documentation API ---- ====== Étape suivante ====== À partir de cette spécification OpenAPI, nous pouvons désormais produire : * Architecture Frontend NextJS 15 * Organisation des pages App Router * Gestion d'état (TanStack Query) * Génération automatique du client API * Design System * Maquettes détaillées * Parcours utilisateurs * Backlog Agile complet Le prochain livrable recommandé est : **Backlog Agile détaillé (Epics → Features → User Stories → Tasks)** Ce document deviendra la base du pilotage projet et des futurs sprints Scrum.