====== OpenAPI YAML Complet ======
===== Préambule =====
Avant de générer le fichier OpenAPI complet, il faut préciser une contrainte importante :
Le contrat OpenAPI complet correspondant à ce projet représente environ :
* 250 endpoints
* 150 à 250 schémas DTO
* 8000 à 15000 lignes YAML
* 1 à 2 Mo de spécification
Il est impossible de produire l'intégralité du fichier dans une seule page wiki ou dans une seule réponse.
La bonne pratique consiste à structurer la spécification comme un projet OpenAPI modulaire.
----
====== Structure OpenAPI recommandée ======
docs/openapi/
openapi.yaml
components/
├── schemas
│
├── parameters
│
├── responses
│
├── requestBodies
│
└── securitySchemes
paths/
├── auth.yaml
├── users.yaml
├── owners.yaml
├── properties.yaml
├── reservations.yaml
├── contracts.yaml
├── payments.yaml
├── crm.yaml
├── messaging.yaml
├── reporting.yaml
└── administration.yaml
----
====== Fichier racine ======
===== openapi.yaml =====
openapi: 3.1.0
info:
title: Rental Platform API
version: 1.0.0
description: >
Property Rental Management Platform
servers:
- url: https://api.production.com/api/v1
- url: https://api.staging.com/api/v1
security:
- bearerAuth: []
tags:
- name: Auth
- name: Users
- name: Owners
- name: Properties
- name: Reservations
- name: Contracts
- name: Payments
- name: CRM
- name: Messaging
- name: Reporting
paths:
/auth/login:
$ref: './paths/auth.yaml#/login'
/properties:
$ref: './paths/properties.yaml#/properties'
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT
----
====== Module Auth ======
===== POST /auth/login =====
login:
post:
tags:
- Auth
summary: Login
operationId: login
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/LoginRequest'
responses:
'200':
description: Login success
content:
application/json:
schema:
$ref: '#/components/schemas/LoginResponse'
'401':
description: Invalid credentials
----
===== LoginRequest =====
LoginRequest:
type: object
required:
- email
- password
properties:
email:
type: string
format: email
password:
type: string
minLength: 8
----
===== LoginResponse =====
LoginResponse:
type: object
properties:
accessToken:
type: string
refreshToken:
type: string
expiresIn:
type: integer
----
====== Module Properties ======
===== Property =====
Property:
type: object
required:
- id
- title
- status
properties:
id:
type: string
format: uuid
code:
type: string
title:
type: string
minLength: 5
maxLength: 255
status:
$ref: '#/components/schemas/PropertyStatus'
surface:
type: number
roomCount:
type: integer
bedroomCount:
type: integer
bathroomCount:
type: integer
capacity:
type: integer
createdAt:
type: string
format: date-time
----
===== PropertyStatus =====
PropertyStatus:
type: string
enum:
- DRAFT
- PUBLISHED
- RENTED
- MAINTENANCE
- ARCHIVED
----
===== GET /properties =====
properties:
get:
tags:
- Properties
summary: Search properties
operationId: searchProperties
parameters:
- $ref: '#/components/parameters/Page'
- $ref: '#/components/parameters/PageSize'
- name: city
in: query
schema:
type: string
- name: minPrice
in: query
schema:
type: number
- name: maxPrice
in: query
schema:
type: number
responses:
'200':
description: Property list
content:
application/json:
schema:
$ref: '#/components/schemas/PaginatedProperties'
----
===== POST /properties =====
post:
tags:
- Properties
summary: Create property
operationId: createProperty
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreatePropertyRequest'
responses:
'201':
description: Property created
content:
application/json:
schema:
$ref: '#/components/schemas/Property'
----
====== Module Reservations ======
===== Reservation =====
Reservation:
type: object
properties:
id:
type: string
format: uuid
reservationNumber:
type: string
startDate:
type: string
format: date
endDate:
type: string
format: date
totalAmount:
type: number
status:
$ref: '#/components/schemas/ReservationStatus'
----
===== ReservationStatus =====
ReservationStatus:
type: string
enum:
- PENDING
- CONFIRMED
- SIGNED
- COMPLETED
- CANCELLED
----
===== POST /reservations =====
post:
tags:
- Reservations
summary: Create reservation
operationId: createReservation
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateReservationRequest'
responses:
'201':
description: Reservation created
content:
application/json:
schema:
$ref: '#/components/schemas/Reservation'
----
====== Module Payments ======
===== Payment =====
Payment:
type: object
properties:
id:
type: string
format: uuid
amount:
type: number
status:
$ref: '#/components/schemas/PaymentStatus'
paymentDate:
type: string
format: date-time
----
===== PaymentStatus =====
PaymentStatus:
type: string
enum:
- PENDING
- AUTHORIZED
- PAID
- FAILED
- REFUNDED
----
====== Pagination standard ======
===== Paramètres =====
Page:
name: page
in: query
schema:
type: integer
minimum: 1
----
PageSize:
name: pageSize
in: query
schema:
type: integer
minimum: 1
maximum: 100
----
===== Réponse =====
PaginationMeta:
type: object
properties:
page:
type: integer
pageSize:
type: integer
total:
type: integer
pages:
type: integer
----
====== Gestion des erreurs ======
===== ErrorResponse =====
ErrorResponse:
type: object
properties:
success:
type: boolean
example: false
error:
type: object
properties:
code:
type: string
message:
type: string
----
===== Codes =====
VALIDATION_ERROR
UNAUTHORIZED
FORBIDDEN
NOT_FOUND
CONFLICT
INTERNAL_ERROR
----
====== Validation ======
===== UUID =====
type: string
format: uuid
----
===== Email =====
type: string
format: email
----
===== Date =====
type: string
format: date
----
===== DateTime =====
type: string
format: date-time
----
====== Génération automatique ======
À partir de cette spécification, génération :
===== Backend =====
DTO NestJS
Swagger
Validation
Tests contractuels
----
===== Frontend =====
SDK TypeScript
Hooks TanStack Query
Schemas Zod
Types TypeScript
----
===== Mobile =====
SDK Flutter
SDK React Native
----
====== Livrables OpenAPI ======
Le projet complet nécessitera :
^ Élément ^ Volume ^
| Modules API | 11 |
| Endpoints | ~250 |
| DTO | ~200 |
| Schémas | ~150 |
| Lignes YAML | 8 000 à 15 000 |
----
====== Recommandation finale ======
La prochaine étape réellement productive n'est plus documentaire mais générative.
À partir de tout ce qui a été produit, il devient pertinent de générer automatiquement :
* Prisma Schema complet
* Entités NestJS
* DTO NestJS
* SDK Frontend TypeScript
* Structure Monorepo
* Docker Compose
* GitHub Actions
* Helm Charts
afin d'obtenir le premier socle de code exécutable du projet.
C'est généralement à ce stade que démarre effectivement le développement logiciel.