2015 lines
57 KiB
YAML
2015 lines
57 KiB
YAML
openapi: 3.1.0
|
||
info:
|
||
title: Arcadia API
|
||
description: |
|
||
Arcadia API in order to abstract corporate metamodel to a proper and stable implemented API.
|
||
|
||
### ⏱️ Gestion Temporelle & Fuseaux Horaires (RFC 3339 / UTC)
|
||
Tous les horodatages transmis en entrée (ex: paramètre de filtrage `since`) ou restitués dans les réponses JSON (ex: `created_at`, `updated_at`, `timestamp`) sont strictement normalisés au format standard **RFC 3339 / ISO-8601** en temps universel coordonné avec le suffixe `Z` (ex: `2026-08-21T14:30:00Z`).
|
||
contact:
|
||
name: Uwil Engineering Team
|
||
email: digital@ldc.fr
|
||
license:
|
||
name: MIT
|
||
url: https://opensource.org/licenses/MIT
|
||
version: 1.0.0
|
||
|
||
servers:
|
||
- url: http://127.0.0.1:8000/api/v1
|
||
description: Serveur de développement local v1
|
||
|
||
security:
|
||
- HmacClientId: []
|
||
HmacTimestamp: []
|
||
HmacNonce: []
|
||
HmacSignature: []
|
||
|
||
tags:
|
||
- name: System
|
||
description: Points d'entrée système et sondes de disponibilité.
|
||
- name: Employees
|
||
description: Gestion et consultation du référentiel RH des employés.
|
||
- name: Brands
|
||
description: Consultation et référentiel des marques.
|
||
- name: IncoSheets
|
||
description: Consultation et recherche des fiches produits INCO.
|
||
- name: IncoComposition
|
||
description: Consultation des compositions nutritionnelles et détaillées des produits INCO.
|
||
|
||
paths:
|
||
/health:
|
||
get:
|
||
tags:
|
||
- System
|
||
summary: Sonde de santé et de disponibilité du système
|
||
description: |
|
||
Vérifie l'état de fonctionnement et la connectivité de l'ensemble des dépendances d'infrastructure (base de données par défaut, base de données Arcadia, cache et serveur SMTP).
|
||
operationId: checkHealth
|
||
security: []
|
||
responses:
|
||
"200":
|
||
description: Système opérationnel (tous les composants sont fonctionnels).
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: "#/components/schemas/HealthCheckResponse"
|
||
"503":
|
||
description: Système dégradé ou indisponible (au moins un composant est en échec).
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: "#/components/schemas/HealthCheckResponse"
|
||
|
||
/employees:
|
||
get:
|
||
tags:
|
||
- Employees
|
||
summary: Liste paginée des employés
|
||
description: |
|
||
Retourne la liste paginée des employés du système Arcadia.
|
||
Prend en charge le filtrage par date de modification (`since`), code établissement (`establishment`),
|
||
code site (`siteId`), code service (`serviceId`), ainsi que le tri et la pagination HATEOAS.
|
||
operationId: listEmployees
|
||
parameters:
|
||
- $ref: "#/components/parameters/Page"
|
||
- $ref: "#/components/parameters/PageSize"
|
||
- $ref: "#/components/parameters/Offset"
|
||
- $ref: "#/components/parameters/Limit"
|
||
- $ref: "#/components/parameters/Since"
|
||
- $ref: "#/components/parameters/Establishment"
|
||
- $ref: "#/components/parameters/SiteId"
|
||
- $ref: "#/components/parameters/SiteIds"
|
||
- $ref: "#/components/parameters/ServiceId"
|
||
- $ref: "#/components/parameters/SortBy"
|
||
- $ref: "#/components/parameters/SortDirection"
|
||
responses:
|
||
"200":
|
||
description: Page d'employés récupérée avec succès.
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: "#/components/schemas/EmployeeListResponse"
|
||
"400":
|
||
$ref: "#/components/responses/BadRequest"
|
||
"401":
|
||
$ref: "#/components/responses/Unauthorized"
|
||
"403":
|
||
$ref: "#/components/responses/Forbidden"
|
||
"422":
|
||
$ref: "#/components/responses/UnprocessableEntity"
|
||
"429":
|
||
$ref: "#/components/responses/TooManyRequests"
|
||
"500":
|
||
$ref: "#/components/responses/InternalServerError"
|
||
"503":
|
||
$ref: "#/components/responses/ServiceUnavailable"
|
||
|
||
/employees/{employeeId}:
|
||
get:
|
||
tags:
|
||
- Employees
|
||
summary: Détail d'un employé par son identifiant
|
||
description: |
|
||
Retourne la fiche détaillée d'un employé spécifié par son matricule public unique.
|
||
operationId: getEmployee
|
||
parameters:
|
||
- $ref: "#/components/parameters/EmployeeIdPath"
|
||
responses:
|
||
"200":
|
||
description: Fiche employé trouvée.
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: "#/components/schemas/EmployeeItemResponse"
|
||
"400":
|
||
$ref: "#/components/responses/BadRequest"
|
||
"401":
|
||
$ref: "#/components/responses/Unauthorized"
|
||
"403":
|
||
$ref: "#/components/responses/Forbidden"
|
||
"404":
|
||
$ref: "#/components/responses/NotFound"
|
||
"422":
|
||
$ref: "#/components/responses/UnprocessableEntity"
|
||
"429":
|
||
$ref: "#/components/responses/TooManyRequests"
|
||
"500":
|
||
$ref: "#/components/responses/InternalServerError"
|
||
"503":
|
||
$ref: "#/components/responses/ServiceUnavailable"
|
||
|
||
/inco-sheets:
|
||
get:
|
||
tags:
|
||
- IncoSheets
|
||
summary: Liste paginée des fiches produits INCO
|
||
description: |
|
||
Retourne la liste paginée des fiches produits INCO.
|
||
Prend en charge le filtrage par marques (`brands`), la date de modification (`since`), la projection au format court (`short=true`), ainsi que le tri et la pagination.
|
||
operationId: listIncoSheets
|
||
parameters:
|
||
- $ref: "#/components/parameters/Page"
|
||
- $ref: "#/components/parameters/PageSize"
|
||
- $ref: "#/components/parameters/Offset"
|
||
- $ref: "#/components/parameters/Limit"
|
||
- $ref: "#/components/parameters/Since"
|
||
- $ref: "#/components/parameters/Brands"
|
||
- $ref: "#/components/parameters/ShortProjection"
|
||
- $ref: "#/components/parameters/IncoSortBy"
|
||
- $ref: "#/components/parameters/SortDirection"
|
||
responses:
|
||
"200":
|
||
description: Page de fiches INCO récupérée avec succès.
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: "#/components/schemas/IncoListResponse"
|
||
"400":
|
||
$ref: "#/components/responses/BadRequest"
|
||
"401":
|
||
$ref: "#/components/responses/Unauthorized"
|
||
"403":
|
||
$ref: "#/components/responses/Forbidden"
|
||
"422":
|
||
$ref: "#/components/responses/UnprocessableEntity"
|
||
"429":
|
||
$ref: "#/components/responses/TooManyRequests"
|
||
"500":
|
||
$ref: "#/components/responses/InternalServerError"
|
||
"503":
|
||
$ref: "#/components/responses/ServiceUnavailable"
|
||
|
||
/brands:
|
||
get:
|
||
tags:
|
||
- Brands
|
||
summary: Liste de toutes les marques
|
||
description: |
|
||
Retourne la liste de toutes les marques connues du système Arcadia.
|
||
Les marques non encore enregistrées localement sont automatiquement initialisées
|
||
et pourvues d'un code public unique (trigramme + 2 chiffres).
|
||
operationId: listBrands
|
||
parameters:
|
||
- $ref: "#/components/parameters/Page"
|
||
- $ref: "#/components/parameters/PageSize"
|
||
- $ref: "#/components/parameters/Offset"
|
||
- $ref: "#/components/parameters/Limit"
|
||
responses:
|
||
"200":
|
||
description: Liste des marques récupérée avec succès.
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: "#/components/schemas/BrandListResponse"
|
||
"400":
|
||
$ref: "#/components/responses/BadRequest"
|
||
"401":
|
||
$ref: "#/components/responses/Unauthorized"
|
||
"403":
|
||
$ref: "#/components/responses/Forbidden"
|
||
"422":
|
||
$ref: "#/components/responses/UnprocessableEntity"
|
||
"429":
|
||
$ref: "#/components/responses/TooManyRequests"
|
||
"500":
|
||
$ref: "#/components/responses/InternalServerError"
|
||
"503":
|
||
$ref: "#/components/responses/ServiceUnavailable"
|
||
|
||
/brands/{identifier}:
|
||
get:
|
||
tags:
|
||
- Brands
|
||
summary: Détail d'une marque par son identifiant UUID ou code public
|
||
description: |
|
||
Retourne la fiche d'une marque spécifiée soit par son identifiant unique UUID v7,
|
||
soit par son code public (ex: LGL01).
|
||
operationId: getBrand
|
||
parameters:
|
||
- $ref: "#/components/parameters/BrandIdentifierPath"
|
||
responses:
|
||
"200":
|
||
description: Fiche marque trouvée.
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: "#/components/schemas/BrandItemResponse"
|
||
"400":
|
||
$ref: "#/components/responses/BadRequest"
|
||
"401":
|
||
$ref: "#/components/responses/Unauthorized"
|
||
"403":
|
||
$ref: "#/components/responses/Forbidden"
|
||
"404":
|
||
$ref: "#/components/responses/NotFound"
|
||
"422":
|
||
$ref: "#/components/responses/UnprocessableEntity"
|
||
"429":
|
||
$ref: "#/components/responses/TooManyRequests"
|
||
"500":
|
||
$ref: "#/components/responses/InternalServerError"
|
||
"503":
|
||
$ref: "#/components/responses/ServiceUnavailable"
|
||
|
||
/inco-sheets/search:
|
||
get:
|
||
tags:
|
||
- IncoSheets
|
||
summary: Recherche de fiches INCO par identifiant (motif SQL LIKE)
|
||
description: |
|
||
Recherche des fiches INCO dont l'ID correspond à un motif (`incoIdLike`).
|
||
Prend également en charge la projection au format court (`short=true`).
|
||
operationId: searchIncoSheets
|
||
parameters:
|
||
- $ref: "#/components/parameters/IncoIdLike"
|
||
- $ref: "#/components/parameters/Brands"
|
||
- $ref: "#/components/parameters/ShortProjection"
|
||
responses:
|
||
"200":
|
||
description: Résultats de recherche INCO.
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: "#/components/schemas/IncoListResponse"
|
||
"400":
|
||
$ref: "#/components/responses/BadRequest"
|
||
"401":
|
||
$ref: "#/components/responses/Unauthorized"
|
||
"403":
|
||
$ref: "#/components/responses/Forbidden"
|
||
"422":
|
||
$ref: "#/components/responses/UnprocessableEntity"
|
||
"429":
|
||
$ref: "#/components/responses/TooManyRequests"
|
||
"500":
|
||
$ref: "#/components/responses/InternalServerError"
|
||
"503":
|
||
$ref: "#/components/responses/ServiceUnavailable"
|
||
|
||
/inco-sheets/{incoId}:
|
||
get:
|
||
tags:
|
||
- IncoSheets
|
||
summary: Détail d'une fiche produit INCO par son identifiant
|
||
description: |
|
||
Retourne la fiche produit INCO détaillée correspondant à l'identifiant spécifié.
|
||
operationId: getIncoSheet
|
||
parameters:
|
||
- $ref: "#/components/parameters/IncoIdPath"
|
||
responses:
|
||
"200":
|
||
description: Fiche produit INCO trouvée.
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: "#/components/schemas/IncoItemResponse"
|
||
"400":
|
||
$ref: "#/components/responses/BadRequest"
|
||
"401":
|
||
$ref: "#/components/responses/Unauthorized"
|
||
"403":
|
||
$ref: "#/components/responses/Forbidden"
|
||
"404":
|
||
$ref: "#/components/responses/NotFound"
|
||
"422":
|
||
$ref: "#/components/responses/UnprocessableEntity"
|
||
"429":
|
||
$ref: "#/components/responses/TooManyRequests"
|
||
"500":
|
||
$ref: "#/components/responses/InternalServerError"
|
||
"503":
|
||
$ref: "#/components/responses/ServiceUnavailable"
|
||
|
||
/inco-sheets/{incoId}/composition:
|
||
get:
|
||
tags:
|
||
- IncoComposition
|
||
summary: Composition d'un produit par l'identifiant de sa fiche INCO
|
||
description: |
|
||
Retourne le détail de la composition nutritionnelle et des ingrédients liés à une fiche INCO.
|
||
operationId: getIncoCompositionByIncoId
|
||
parameters:
|
||
- $ref: "#/components/parameters/IncoIdPath"
|
||
responses:
|
||
"200":
|
||
description: Composition INCO trouvée.
|
||
content:
|
||
application/json:
|
||
schema:
|
||
$ref: "#/components/schemas/IncoCompoItemResponse"
|
||
"400":
|
||
$ref: "#/components/responses/BadRequest"
|
||
"401":
|
||
$ref: "#/components/responses/Unauthorized"
|
||
"403":
|
||
$ref: "#/components/responses/Forbidden"
|
||
"404":
|
||
$ref: "#/components/responses/NotFound"
|
||
"422":
|
||
$ref: "#/components/responses/UnprocessableEntity"
|
||
"429":
|
||
$ref: "#/components/responses/TooManyRequests"
|
||
"500":
|
||
$ref: "#/components/responses/InternalServerError"
|
||
"503":
|
||
$ref: "#/components/responses/ServiceUnavailable"
|
||
|
||
components:
|
||
securitySchemes:
|
||
HmacClientId:
|
||
type: apiKey
|
||
in: header
|
||
name: X-Client-Id
|
||
description: Identifiant public du client API autorisé.
|
||
HmacTimestamp:
|
||
type: apiKey
|
||
in: header
|
||
name: X-Timestamp
|
||
description: Horodatage au format RFC3339 (tolérance anti-replay +/-5 minutes).
|
||
HmacNonce:
|
||
type: apiKey
|
||
in: header
|
||
name: X-Nonce
|
||
description: Identifiant unique de requête au format UUID (v4 ou v7) pour protection anti-replay.
|
||
HmacSignature:
|
||
type: apiKey
|
||
in: header
|
||
name: X-Signature
|
||
description: Signature HMAC-SHA256 calculée avec la clé secrète partagée.
|
||
|
||
parameters:
|
||
BrandIdentifierPath:
|
||
name: identifier
|
||
in: path
|
||
required: true
|
||
description: Identifiant UUID v7 ou code public (ex. LGL01) de la marque.
|
||
schema:
|
||
type: string
|
||
example: "LGL01"
|
||
|
||
EmployeeIdPath:
|
||
name: employeeId
|
||
in: path
|
||
required: true
|
||
description: Matricule public unique de l'employé (7 ou 8 chiffres).
|
||
schema:
|
||
type: string
|
||
pattern: '^\d{7,8}$'
|
||
example: "01155902"
|
||
|
||
Page:
|
||
name: page
|
||
in: query
|
||
required: false
|
||
description: Numéro de page (1-based). Les valeurs hors bornes sont silencieusement corrigées par l'API.
|
||
schema:
|
||
type: integer
|
||
default: 1
|
||
example: 1
|
||
|
||
PageSize:
|
||
name: pageSize
|
||
in: query
|
||
required: false
|
||
description: Nombre d'éléments par page (max 10000). Les valeurs hors bornes sont silencieusement corrigées par l'API.
|
||
schema:
|
||
type: integer
|
||
maximum: 10000
|
||
default: 25
|
||
example: 25
|
||
|
||
Offset:
|
||
name: offset
|
||
in: query
|
||
required: false
|
||
description: Décalage d'index pour la pagination basée sur l'offset. Les valeurs négatives sont silencieusement corrigées à 0.
|
||
schema:
|
||
type: integer
|
||
minimum: 0
|
||
example: 0
|
||
|
||
Limit:
|
||
name: limit
|
||
in: query
|
||
required: false
|
||
description: Nombre maximal d'enregistrements pour la pagination par offset. Les valeurs hors bornes sont silencieusement corrigées par l'API.
|
||
schema:
|
||
type: integer
|
||
maximum: 10000
|
||
example: 25
|
||
|
||
Since:
|
||
name: since
|
||
in: query
|
||
required: false
|
||
description: Horodatage au format RFC3339 (borne inférieure sur updatedAt).
|
||
schema:
|
||
type: string
|
||
format: date-time
|
||
example: "2026-01-01T00:00:00Z"
|
||
|
||
Establishment:
|
||
name: establishment
|
||
in: query
|
||
required: false
|
||
description: "Filtrer par code établissement (ex: 01, PA, LY)."
|
||
schema:
|
||
type: string
|
||
pattern: '^[\dA-Z]{2,}$'
|
||
example: "01"
|
||
|
||
SiteId:
|
||
name: siteId
|
||
in: query
|
||
required: false
|
||
description: "Filtrer par code site (ex: LDCSER, SLELA)."
|
||
schema:
|
||
type: string
|
||
pattern: "^[A-Z]{2,}$"
|
||
example: "LDCSER"
|
||
|
||
SiteIds:
|
||
name: siteIds
|
||
in: query
|
||
required: false
|
||
description: "Filtrer par un ou plusieurs codes site (ex: siteIds[]=LDCSER&siteIds[]=SLELA)."
|
||
style: form
|
||
explode: true
|
||
schema:
|
||
type: array
|
||
minItems: 1
|
||
items:
|
||
type: string
|
||
pattern: "^[A-Z]{2,}$"
|
||
example: ["LDCSER", "SLELA"]
|
||
|
||
ServiceId:
|
||
name: serviceId
|
||
in: query
|
||
required: false
|
||
description: "Filtrer par identifiant de service (ex: 097, 101)."
|
||
schema:
|
||
type: string
|
||
pattern: '^\d{1,}$'
|
||
example: "097"
|
||
|
||
SortBy:
|
||
name: sortBy
|
||
in: query
|
||
required: false
|
||
description: Champ d'ordonnancement des employés.
|
||
schema:
|
||
type: string
|
||
enum:
|
||
- arcadiaId
|
||
- startDate
|
||
- endDate
|
||
- plannedEndDate
|
||
- createdAt
|
||
- updatedAt
|
||
default: arcadiaId
|
||
example: arcadiaId
|
||
|
||
SortDirection:
|
||
name: sortDirection
|
||
in: query
|
||
required: false
|
||
description: Sens du tri.
|
||
schema:
|
||
type: string
|
||
enum:
|
||
- Ascending
|
||
- Descending
|
||
default: Ascending
|
||
example: Ascending
|
||
|
||
IncoIdPath:
|
||
name: incoId
|
||
in: path
|
||
required: true
|
||
description: Identifiant numérique unique de la fiche INCO.
|
||
schema:
|
||
type: string
|
||
pattern: '^\d{1,}$'
|
||
example: "12345"
|
||
|
||
IncoIdLike:
|
||
name: incoIdLike
|
||
in: query
|
||
required: true
|
||
description: Motif de recherche d'ID (SQL LIKE).
|
||
schema:
|
||
type: string
|
||
example: "123%"
|
||
|
||
Brands:
|
||
name: brands
|
||
in: query
|
||
required: false
|
||
description: Filtrer par un ou plusieurs codes marque.
|
||
style: form
|
||
explode: true
|
||
schema:
|
||
type: array
|
||
minItems: 1
|
||
items:
|
||
type: string
|
||
pattern: '^[A-Z]{3}\d{2}$'
|
||
example: ["LGL01", "MCQ01"]
|
||
|
||
ShortProjection:
|
||
name: short
|
||
in: query
|
||
required: false
|
||
description: Retourne la projection courte si true.
|
||
schema:
|
||
type: boolean
|
||
default: false
|
||
|
||
IncoSortBy:
|
||
name: sortBy
|
||
in: query
|
||
required: false
|
||
description: Champ d'ordonnancement des fiches INCO.
|
||
schema:
|
||
type: string
|
||
enum:
|
||
- incoSheetId
|
||
- createdAt
|
||
- updatedAt
|
||
default: incoSheetId
|
||
example: incoSheetId
|
||
|
||
responses:
|
||
BadRequest:
|
||
description: Erreurs de forme de la requête HTTP (validation FormRequest) (400 Bad Request).
|
||
content:
|
||
application/problem+json:
|
||
schema:
|
||
$ref: "#/components/schemas/ProblemDetails"
|
||
|
||
Unauthorized:
|
||
description: Échec d'authentification HMAC ou signature invalide (401 Unauthorized).
|
||
content:
|
||
application/problem+json:
|
||
schema:
|
||
$ref: "#/components/schemas/ProblemDetails"
|
||
|
||
Forbidden:
|
||
description: Client non autorisé à accéder à cette ressource (403 Forbidden).
|
||
content:
|
||
application/problem+json:
|
||
schema:
|
||
$ref: "#/components/schemas/ProblemDetails"
|
||
|
||
NotFound:
|
||
description: Ressource introuvable (404 Not Found).
|
||
content:
|
||
application/problem+json:
|
||
schema:
|
||
$ref: "#/components/schemas/ProblemDetails"
|
||
|
||
UnprocessableEntity:
|
||
description: Erreur sémantique ou violation des règles du domaine (422 Unprocessable Entity).
|
||
content:
|
||
application/problem+json:
|
||
schema:
|
||
$ref: "#/components/schemas/ValidationErrorProblemDetails"
|
||
|
||
TooManyRequests:
|
||
description: Trop de requêtes envoyées dans un laps de temps donné (429 Too Many Requests).
|
||
content:
|
||
application/problem+json:
|
||
schema:
|
||
$ref: "#/components/schemas/ProblemDetails"
|
||
headers:
|
||
Retry-After:
|
||
description: Le nombre de secondes avant de pouvoir réessayer.
|
||
schema:
|
||
type: integer
|
||
X-RateLimit-Limit:
|
||
description: La limite de requêtes par minute.
|
||
schema:
|
||
type: integer
|
||
X-RateLimit-Remaining:
|
||
description: Le nombre de requêtes restantes avant blocage.
|
||
schema:
|
||
type: integer
|
||
|
||
InternalServerError:
|
||
description: Erreur interne du serveur (500 Internal Server Error).
|
||
content:
|
||
application/problem+json:
|
||
schema:
|
||
$ref: "#/components/schemas/ProblemDetails"
|
||
|
||
ServiceUnavailable:
|
||
description: Service temporairement indisponible (503 Service Unavailable).
|
||
content:
|
||
application/problem+json:
|
||
schema:
|
||
$ref: "#/components/schemas/ProblemDetails"
|
||
|
||
schemas:
|
||
HealthCheckResponse:
|
||
type: object
|
||
description: Résultat de la sonde d'état et de disponibilité des services.
|
||
required:
|
||
- status
|
||
- timestamp
|
||
- checks
|
||
properties:
|
||
status:
|
||
type: string
|
||
enum:
|
||
- healthy
|
||
- unhealthy
|
||
description: État de santé global du système.
|
||
example: "healthy"
|
||
timestamp:
|
||
type: string
|
||
format: date-time
|
||
description: Horodatage de la vérification au format RFC 3339 UTC.
|
||
example: "2026-08-21T14:30:00Z"
|
||
checks:
|
||
type: object
|
||
description: Détails des vérifications par composant.
|
||
additionalProperties:
|
||
type: object
|
||
required:
|
||
- status
|
||
properties:
|
||
status:
|
||
type: string
|
||
enum:
|
||
- up
|
||
- down
|
||
description: État du composant.
|
||
example: "up"
|
||
connection:
|
||
type: string
|
||
description: Nom de la connexion de base de données vérifiée.
|
||
example: "sqlite"
|
||
store:
|
||
type: string
|
||
description: Nom du magasin de cache vérifié.
|
||
example: "database"
|
||
transport:
|
||
type: string
|
||
description: Type de transport mail vérifié.
|
||
example: "smtp"
|
||
message:
|
||
type: string
|
||
nullable: true
|
||
description: Message d'erreur éventuel en cas d'échec.
|
||
|
||
Brand:
|
||
type: object
|
||
description: Représentation canonique d'une marque dans Arcadia API.
|
||
required:
|
||
- id
|
||
- code
|
||
- name
|
||
- arcadiaId
|
||
- createdAt
|
||
properties:
|
||
id:
|
||
type: string
|
||
format: uuid
|
||
description: Identifiant UUID v7 unique de la marque.
|
||
example: "01918a3c-1b77-7000-8000-000000000001"
|
||
code:
|
||
type: string
|
||
pattern: '^[A-Z]{3}\d{2}$'
|
||
description: Code public unique trigramme + 2 chiffres.
|
||
example: "LGL01"
|
||
name:
|
||
type: string
|
||
description: Nom / libellé de la marque.
|
||
example: "Le Gaulois"
|
||
arcadiaId:
|
||
type: string
|
||
pattern: '^[1-9]\d{0,2}$'
|
||
description: Identifiant numérique amont Arcadia.
|
||
example: "1"
|
||
createdAt:
|
||
type: string
|
||
format: date-time
|
||
description: Date et heure de création (ISO 8601).
|
||
example: "2024-01-15T08:00:00Z"
|
||
|
||
BrandListResponse:
|
||
type: object
|
||
description: Enveloppe de réponse pour la liste paginée des marques.
|
||
required:
|
||
- brands
|
||
- pagination
|
||
properties:
|
||
brands:
|
||
type: array
|
||
description: Collection des marques de la page.
|
||
items:
|
||
$ref: "#/components/schemas/Brand"
|
||
pagination:
|
||
$ref: "#/components/schemas/PaginationMeta"
|
||
|
||
BrandItemResponse:
|
||
type: object
|
||
description: Enveloppe de réponse pour le détail d'une marque.
|
||
required:
|
||
- brand
|
||
properties:
|
||
brand:
|
||
$ref: "#/components/schemas/Brand"
|
||
|
||
Employee:
|
||
type: object
|
||
description: Représentation canonique d'un employé dans le métamodèle Arcadia.
|
||
required:
|
||
- id
|
||
- firstName
|
||
- lastName
|
||
- establishment
|
||
- site
|
||
- service
|
||
- startDate
|
||
properties:
|
||
id:
|
||
type: string
|
||
pattern: '^\d{7,8}$'
|
||
description: Matricule public unique de l'employé.
|
||
example: "01155902"
|
||
firstName:
|
||
type: string
|
||
description: Prénom de l'employé.
|
||
example: John
|
||
lastName:
|
||
type: string
|
||
description: Nom de famille de l'employé.
|
||
example: DOE
|
||
establishment:
|
||
type: string
|
||
pattern: '^[\dA-Z]{2,}$'
|
||
description: Code de l'établissement d'affectation.
|
||
example: "01"
|
||
site:
|
||
type: string
|
||
pattern: "^[A-Z]{2,}$"
|
||
description: Code du site géographique.
|
||
example: LDCSER
|
||
service:
|
||
type: string
|
||
pattern: '^\d{1,}$'
|
||
description: Identifiant du service interne.
|
||
example: "097"
|
||
startDate:
|
||
type: string
|
||
format: date
|
||
description: Date de prise de poste (YYYY-MM-DD).
|
||
example: "2024-01-15"
|
||
endDate:
|
||
type:
|
||
- string
|
||
- "null"
|
||
format: date
|
||
description: Date de fin de contrat effective (optionnelle).
|
||
example: null
|
||
plannedEndDate:
|
||
type:
|
||
- string
|
||
- "null"
|
||
format: date
|
||
description: Date de fin de contrat prévue (optionnelle).
|
||
example: null
|
||
createdAt:
|
||
type:
|
||
- string
|
||
- "null"
|
||
format: date-time
|
||
description: Date d'enregistrement dans le système.
|
||
example: "2026-08-11T14:00:00Z"
|
||
updatedAt:
|
||
type:
|
||
- string
|
||
- "null"
|
||
format: date-time
|
||
description: Date de dernière mise à jour.
|
||
example: "2026-08-11T14:00:00Z"
|
||
|
||
PaginationLinks:
|
||
type: object
|
||
description: Liens de navigation HATEOAS pour la pagination.
|
||
required:
|
||
- self
|
||
- first
|
||
- last
|
||
properties:
|
||
self:
|
||
type: string
|
||
format: uri
|
||
description: Lien vers la page courante.
|
||
example: "http://127.0.0.1:8000/api/v1/employees?page=1&pageSize=25"
|
||
first:
|
||
type: string
|
||
format: uri
|
||
description: Lien vers la première page.
|
||
example: "http://127.0.0.1:8000/api/v1/employees?page=1&pageSize=25"
|
||
prev:
|
||
type:
|
||
- string
|
||
- "null"
|
||
format: uri
|
||
description: Lien vers la page précédente (null si première page).
|
||
example: null
|
||
next:
|
||
type:
|
||
- string
|
||
- "null"
|
||
format: uri
|
||
description: Lien vers la page suivante (null si dernière page).
|
||
example: "http://127.0.0.1:8000/api/v1/employees?page=2&pageSize=25"
|
||
last:
|
||
type: string
|
||
format: uri
|
||
description: Lien vers la dernière page.
|
||
example: "http://127.0.0.1:8000/api/v1/employees?page=2&pageSize=25"
|
||
|
||
PaginationMeta:
|
||
type: object
|
||
description: Métadonnées de pagination.
|
||
required:
|
||
- page
|
||
- pageSize
|
||
- totalItems
|
||
- totalPages
|
||
- links
|
||
properties:
|
||
page:
|
||
type: integer
|
||
minimum: 1
|
||
description: Index de la page courante (1-based).
|
||
example: 1
|
||
pageSize:
|
||
type: integer
|
||
minimum: 1
|
||
description: Nombre d'éléments par page.
|
||
example: 25
|
||
totalItems:
|
||
type: integer
|
||
minimum: 0
|
||
description: Nombre total d'éléments correspondant aux filtres.
|
||
example: 42
|
||
totalPages:
|
||
type: integer
|
||
minimum: 0
|
||
description: Nombre total de pages disponibles.
|
||
example: 2
|
||
links:
|
||
$ref: "#/components/schemas/PaginationLinks"
|
||
|
||
EmployeeListResponse:
|
||
type: object
|
||
description: Enveloppe de réponse pour la liste paginée des employés.
|
||
required:
|
||
- employees
|
||
- pagination
|
||
properties:
|
||
employees:
|
||
type: array
|
||
description: Collection des employés de la page.
|
||
items:
|
||
$ref: "#/components/schemas/Employee"
|
||
pagination:
|
||
$ref: "#/components/schemas/PaginationMeta"
|
||
|
||
EmployeeItemResponse:
|
||
type: object
|
||
description: Enveloppe de réponse pour le détail d'un employé.
|
||
required:
|
||
- employee
|
||
properties:
|
||
employee:
|
||
$ref: "#/components/schemas/Employee"
|
||
|
||
IncoBrand:
|
||
type: object
|
||
description: Marque associée à la fiche produit INCO.
|
||
required: [code, label]
|
||
properties:
|
||
code:
|
||
type: string
|
||
pattern: '^[A-Z]{3}\d{2}$'
|
||
example: "LGL01"
|
||
label:
|
||
type: string
|
||
example: "Le Gaulois"
|
||
|
||
Inco:
|
||
type: object
|
||
description: Fiche produit INCO complète.
|
||
required:
|
||
- id
|
||
- name
|
||
- label
|
||
- description
|
||
- allegations
|
||
- sellArguments
|
||
- preparationAdvices
|
||
- ingredients
|
||
- allergens
|
||
- brand
|
||
- isSeasonal
|
||
- additives
|
||
properties:
|
||
id:
|
||
type: string
|
||
pattern: '^\d{1,}$'
|
||
example: "12345"
|
||
name:
|
||
type: string
|
||
example: Poulet Rôti 1kg
|
||
label:
|
||
type: string
|
||
example: Poulet Rôti Classe A
|
||
description:
|
||
type: string
|
||
example: Poulet prêt à cuire élevé en France
|
||
allegations:
|
||
$ref: "#/components/schemas/IncoAllegations"
|
||
sellArguments:
|
||
type: string
|
||
preparationAdvices:
|
||
type: string
|
||
tips:
|
||
type:
|
||
- string
|
||
- "null"
|
||
example: Servir chaud
|
||
sellFamilly:
|
||
type:
|
||
- string
|
||
- "null"
|
||
example: Volaille
|
||
ingredients:
|
||
$ref: "#/components/schemas/IncoIngredients"
|
||
portions:
|
||
oneOf:
|
||
- $ref: "#/components/schemas/IncoPortionAmount"
|
||
- type: "null"
|
||
allergens:
|
||
type: array
|
||
items:
|
||
$ref: "#/components/schemas/IncoAllergen"
|
||
brand:
|
||
$ref: "#/components/schemas/IncoBrand"
|
||
isSeasonal:
|
||
type: boolean
|
||
weight:
|
||
oneOf:
|
||
- $ref: "#/components/schemas/IncoWeight"
|
||
- type: "null"
|
||
nutriscore:
|
||
oneOf:
|
||
- $ref: "#/components/schemas/IncoNutriscore"
|
||
- type: "null"
|
||
storageCondition:
|
||
oneOf:
|
||
- $ref: "#/components/schemas/IncoStorageCondition"
|
||
- type: "null"
|
||
additives:
|
||
type: array
|
||
items:
|
||
$ref: "#/components/schemas/IncoAdditive"
|
||
compo:
|
||
type:
|
||
- string
|
||
- "null"
|
||
pattern: '^\d{1,}$'
|
||
createdAt:
|
||
type:
|
||
- string
|
||
- "null"
|
||
format: date-time
|
||
updatedAt:
|
||
type:
|
||
- string
|
||
- "null"
|
||
format: date-time
|
||
|
||
IncoWeight:
|
||
type: object
|
||
description: Poids du produit en grammes.
|
||
required:
|
||
- netWeight
|
||
- grossWeight
|
||
- theoreticalAverage
|
||
properties:
|
||
netWeight:
|
||
type: integer
|
||
description: Poids net UVC (g).
|
||
example: 100
|
||
grossWeight:
|
||
type: integer
|
||
description: Poids brut UVC (g).
|
||
example: 120
|
||
theoreticalAverage:
|
||
type: integer
|
||
description: Moyenne théorique du poids (g).
|
||
example: 110
|
||
|
||
IncoAllegations:
|
||
type: object
|
||
description: Allégations associées au produit (santé, nutrition, etc.).
|
||
required:
|
||
- allegations
|
||
- health
|
||
- nutrition
|
||
- other
|
||
properties:
|
||
allegations:
|
||
type: array
|
||
items:
|
||
type: string
|
||
example: ["Volaille française"]
|
||
health:
|
||
type: array
|
||
items:
|
||
type: string
|
||
example: ["Riche en protéines"]
|
||
nutrition:
|
||
type: array
|
||
items:
|
||
type: string
|
||
example: ["Faible en matière grasse"]
|
||
other:
|
||
type: array
|
||
items:
|
||
type: string
|
||
example: []
|
||
|
||
IncoIngredients:
|
||
type: object
|
||
description: Liste structurée des ingrédients groupés par section.
|
||
additionalProperties:
|
||
type: array
|
||
items:
|
||
type: string
|
||
example:
|
||
Ingrédients: ["Viande de dinde (66%)", "Gras de dinde", "Persil", "Sel"]
|
||
Traces: ["Aucun allergène"]
|
||
|
||
IncoPortionAmount:
|
||
type: object
|
||
description: Informations de quantité par portion.
|
||
required:
|
||
- lowPart
|
||
- highPart
|
||
- approximative
|
||
properties:
|
||
lowPart:
|
||
type: integer
|
||
description: Valeur minimale ou exacte (en centièmes ou grammes).
|
||
example: 150
|
||
highPart:
|
||
type: integer
|
||
description: Valeur maximale.
|
||
example: 150
|
||
approximative:
|
||
type: boolean
|
||
description: Indique si la portion est approximative.
|
||
example: false
|
||
|
||
IncoAllergen:
|
||
type: object
|
||
description: Allergène présent ou en trace dans la recette.
|
||
required:
|
||
- code
|
||
- label
|
||
properties:
|
||
code:
|
||
type: integer
|
||
example: 21
|
||
label:
|
||
type: string
|
||
example: Aucun allergène
|
||
|
||
IncoNutriscore:
|
||
type: object
|
||
description: Note Nutri-Score affichée sur l'emballage.
|
||
required:
|
||
- grade
|
||
properties:
|
||
grade:
|
||
type: string
|
||
enum: [A, B, C, D, E]
|
||
example: D
|
||
|
||
IncoStorageCondition:
|
||
type: object
|
||
description: Conditions de conservation du produit.
|
||
required:
|
||
- instructions
|
||
properties:
|
||
instructions:
|
||
type: string
|
||
example: A conserver entre 0°C et +4°C
|
||
|
||
IncoAdditive:
|
||
type: object
|
||
description: Additif alimentaire (code E-number et libellé).
|
||
required:
|
||
- code
|
||
- label
|
||
properties:
|
||
code:
|
||
type: string
|
||
example: E300
|
||
label:
|
||
type: string
|
||
example: Acide ascorbique
|
||
|
||
IncoShort:
|
||
type: object
|
||
description: Fiche produit INCO projetée en format court.
|
||
required:
|
||
- id
|
||
- name
|
||
- label
|
||
properties:
|
||
id:
|
||
type: string
|
||
pattern: '^\d{1,}$'
|
||
example: "12345"
|
||
name:
|
||
type: string
|
||
example: Poulet Rôti 1kg
|
||
label:
|
||
type: string
|
||
example: Poulet Rôti Classe A
|
||
createdAt:
|
||
type:
|
||
- string
|
||
- "null"
|
||
format: date-time
|
||
updatedAt:
|
||
type:
|
||
- string
|
||
- "null"
|
||
format: date-time
|
||
|
||
IncoCompo:
|
||
type: object
|
||
description: Composition nutritionnelle détaillée d'une fiche INCO.
|
||
required:
|
||
- id
|
||
- incoId
|
||
- identification
|
||
- energy
|
||
- referenceMacronutrients
|
||
- portionMacronutrients
|
||
- freshProduceAndNuts
|
||
- referenceIntakes
|
||
- nutriScore
|
||
- nutriScorePoints
|
||
- minerals
|
||
- vitamins
|
||
- carbohydratesDetail
|
||
- fattyAcids
|
||
- aminoAcids
|
||
- specialCompounds
|
||
properties:
|
||
id:
|
||
type: string
|
||
pattern: '^\d{1,}$'
|
||
example: "67890"
|
||
incoId:
|
||
type: string
|
||
pattern: '^\d{1,}$'
|
||
example: "12345"
|
||
identification:
|
||
$ref: "#/components/schemas/IncoCompositionIdentification"
|
||
energy:
|
||
$ref: "#/components/schemas/IncoCompoEnergy"
|
||
referenceMacronutrients:
|
||
$ref: "#/components/schemas/IncoCompoReferenceMacronutrients"
|
||
portionMacronutrients:
|
||
$ref: "#/components/schemas/IncoCompoPortionMacronutrients"
|
||
freshProduceAndNuts:
|
||
$ref: "#/components/schemas/IncoCompoFreshProduceAndNuts"
|
||
referenceIntakes:
|
||
$ref: "#/components/schemas/IncoCompoReferenceIntakes"
|
||
nutriScore:
|
||
$ref: "#/components/schemas/IncoCompoNutriScore"
|
||
nutriScorePoints:
|
||
$ref: "#/components/schemas/IncoCompoNutriScorePoints"
|
||
minerals:
|
||
$ref: "#/components/schemas/IncoCompoMinerals"
|
||
vitamins:
|
||
$ref: "#/components/schemas/IncoCompoVitamins"
|
||
carbohydratesDetail:
|
||
$ref: "#/components/schemas/IncoCompoCarbohydratesDetail"
|
||
fattyAcids:
|
||
$ref: "#/components/schemas/IncoCompoFattyAcids"
|
||
aminoAcids:
|
||
$ref: "#/components/schemas/IncoCompoAminoAcids"
|
||
specialCompounds:
|
||
$ref: "#/components/schemas/IncoCompoSpecialCompounds"
|
||
|
||
NutrientValue:
|
||
type: object
|
||
description: Valeur d'un nutriment avec quantité et précision facultative.
|
||
properties:
|
||
amount:
|
||
type: string
|
||
example: "12.5"
|
||
precision:
|
||
type:
|
||
- string
|
||
- "null"
|
||
example: "="
|
||
|
||
PercentageValue:
|
||
type: object
|
||
description: Valeur sous forme de pourcentage (0-100%).
|
||
properties:
|
||
value:
|
||
type: string
|
||
example: "45.5"
|
||
|
||
EnergyValues:
|
||
type: object
|
||
description: Quantités d'énergie (portion ou référence).
|
||
properties:
|
||
size:
|
||
type: string
|
||
example: "100"
|
||
energyKj:
|
||
type: string
|
||
example: "850"
|
||
energyKcal:
|
||
type: string
|
||
example: "203"
|
||
|
||
FruitAndNutAmount:
|
||
type: object
|
||
description: Quantités de fruits, noix et FNL.
|
||
properties:
|
||
fruits:
|
||
type: string
|
||
example: "0"
|
||
nuts:
|
||
type: string
|
||
example: "0"
|
||
freshFnl:
|
||
type: string
|
||
example: "0"
|
||
|
||
IncoCompositionIdentification:
|
||
type: object
|
||
description: Informations d'identification de la composition INCO.
|
||
properties:
|
||
name:
|
||
type: string
|
||
example: Poulet Rôti 1kg
|
||
number:
|
||
type: string
|
||
example: "12345"
|
||
source:
|
||
type: string
|
||
example: LDC
|
||
|
||
IncoCompoEnergy:
|
||
type: object
|
||
description: Valeurs énergétiques.
|
||
properties:
|
||
reference:
|
||
$ref: "#/components/schemas/EnergyValues"
|
||
portion:
|
||
$ref: "#/components/schemas/EnergyValues"
|
||
|
||
IncoCompoReferenceMacronutrients:
|
||
type: object
|
||
description: Macronutriments de référence pour 100g/ml.
|
||
properties:
|
||
fat:
|
||
$ref: "#/components/schemas/NutrientValue"
|
||
saturatedFat:
|
||
$ref: "#/components/schemas/NutrientValue"
|
||
carbohydrates:
|
||
$ref: "#/components/schemas/NutrientValue"
|
||
sugars:
|
||
$ref: "#/components/schemas/NutrientValue"
|
||
fiber:
|
||
$ref: "#/components/schemas/NutrientValue"
|
||
protein:
|
||
$ref: "#/components/schemas/NutrientValue"
|
||
salt:
|
||
$ref: "#/components/schemas/NutrientValue"
|
||
sodium:
|
||
type: string
|
||
example: "480"
|
||
|
||
IncoCompoPortionMacronutrients:
|
||
type: object
|
||
description: Macronutriments par portion.
|
||
properties:
|
||
fat:
|
||
$ref: "#/components/schemas/NutrientValue"
|
||
saturatedFat:
|
||
$ref: "#/components/schemas/NutrientValue"
|
||
carbohydrates:
|
||
$ref: "#/components/schemas/NutrientValue"
|
||
sugars:
|
||
$ref: "#/components/schemas/NutrientValue"
|
||
fiber:
|
||
$ref: "#/components/schemas/NutrientValue"
|
||
protein:
|
||
$ref: "#/components/schemas/NutrientValue"
|
||
salt:
|
||
$ref: "#/components/schemas/NutrientValue"
|
||
sodium:
|
||
type: string
|
||
example: "720"
|
||
|
||
IncoCompoFreshProduceAndNuts:
|
||
type: object
|
||
description: Teneur en fruits, légumes et noix (FNL).
|
||
properties:
|
||
reference:
|
||
$ref: "#/components/schemas/FruitAndNutAmount"
|
||
portion:
|
||
$ref: "#/components/schemas/FruitAndNutAmount"
|
||
freshFnlPercentage:
|
||
$ref: "#/components/schemas/PercentageValue"
|
||
fruitsPercentage:
|
||
$ref: "#/components/schemas/PercentageValue"
|
||
|
||
IncoCompoReferenceIntakes:
|
||
type: object
|
||
description: Pourcentages des apports de référence (AR / ARIC).
|
||
properties:
|
||
energyE14:
|
||
$ref: "#/components/schemas/PercentageValue"
|
||
energyKj:
|
||
$ref: "#/components/schemas/PercentageValue"
|
||
fat:
|
||
$ref: "#/components/schemas/PercentageValue"
|
||
saturatedFat:
|
||
$ref: "#/components/schemas/PercentageValue"
|
||
carbohydrates:
|
||
$ref: "#/components/schemas/PercentageValue"
|
||
sugars:
|
||
$ref: "#/components/schemas/PercentageValue"
|
||
protein:
|
||
$ref: "#/components/schemas/PercentageValue"
|
||
salt:
|
||
$ref: "#/components/schemas/PercentageValue"
|
||
portionAmount:
|
||
type: string
|
||
example: "150"
|
||
proteinToLipidRatio:
|
||
type:
|
||
- string
|
||
- "null"
|
||
example: "1.76"
|
||
|
||
IncoCompoNutriScore:
|
||
type: object
|
||
description: Détail des composantes et classement Nutri-Score.
|
||
properties:
|
||
negativeComponent:
|
||
type: string
|
||
example: "3"
|
||
negativeComponent2022:
|
||
type: string
|
||
example: "3"
|
||
positiveComponent:
|
||
type: string
|
||
example: "5"
|
||
positiveComponent2022:
|
||
type: string
|
||
example: "5"
|
||
score:
|
||
type: string
|
||
example: "-2"
|
||
score2022:
|
||
type: string
|
||
example: "-2"
|
||
grade:
|
||
type: string
|
||
example: A
|
||
grade2022:
|
||
type: string
|
||
example: A
|
||
isGradeAArticle:
|
||
type: string
|
||
example: "1"
|
||
isRedMeat:
|
||
type: string
|
||
example: "0"
|
||
|
||
IncoCompoNutriScorePoints:
|
||
type: object
|
||
description: Points élémentaires du calcul Nutri-Score.
|
||
properties:
|
||
energyPoints:
|
||
type: string
|
||
example: "2"
|
||
saturatedFatPoints:
|
||
type: string
|
||
example: "3"
|
||
sugarsPoints:
|
||
type: string
|
||
example: "0"
|
||
saltPoints:
|
||
type: string
|
||
example: "2"
|
||
fiberPoints:
|
||
type: string
|
||
example: "0"
|
||
proteinPoints:
|
||
type: string
|
||
example: "5"
|
||
freshFnlPoints:
|
||
type: string
|
||
example: "0"
|
||
|
||
IncoCompoMinerals:
|
||
type: object
|
||
description: Teneur détaillée en minéraux et oligo-éléments.
|
||
properties:
|
||
calcium:
|
||
type: string
|
||
example: "12.0"
|
||
magnesium:
|
||
type: string
|
||
example: "24.0"
|
||
potassium:
|
||
type: string
|
||
example: "350.0"
|
||
phosphorus:
|
||
type: string
|
||
example: "210.0"
|
||
chloride:
|
||
type: string
|
||
example: "0.0"
|
||
iron:
|
||
type: string
|
||
example: "1.1"
|
||
zinc:
|
||
type: string
|
||
example: "1.8"
|
||
copper:
|
||
type: string
|
||
example: "0.08"
|
||
manganese:
|
||
type: string
|
||
example: "0.02"
|
||
selenium:
|
||
type: string
|
||
example: "18.5"
|
||
iodine:
|
||
type: string
|
||
example: "4.2"
|
||
chromium:
|
||
type: string
|
||
example: "0.0"
|
||
molybdenum:
|
||
type: string
|
||
example: "0.0"
|
||
sulfur:
|
||
type: string
|
||
example: "0.0"
|
||
nitrates:
|
||
type: string
|
||
example: "0.0"
|
||
|
||
IncoCompoVitamins:
|
||
type: object
|
||
description: Teneur détaillée en vitamines.
|
||
properties:
|
||
vitaminA:
|
||
type: string
|
||
example: "30.0"
|
||
vitaminB6:
|
||
type: string
|
||
example: "0.4"
|
||
vitaminB12:
|
||
type: string
|
||
example: "0.3"
|
||
vitaminC:
|
||
type: string
|
||
example: "0.0"
|
||
vitaminD:
|
||
type: string
|
||
example: "0.1"
|
||
vitaminE:
|
||
type: string
|
||
example: "0.3"
|
||
vitaminK:
|
||
type: string
|
||
example: "1.2"
|
||
cholecalciferol:
|
||
type: string
|
||
example: "0.1"
|
||
niacin:
|
||
type: string
|
||
example: "8.5"
|
||
|
||
IncoCompoCarbohydratesDetail:
|
||
type: object
|
||
description: Composition détaillée des glucides et fibres.
|
||
properties:
|
||
starch:
|
||
type: string
|
||
example: "0.0"
|
||
maltodextrin:
|
||
type: string
|
||
example: "0.0"
|
||
sucrose:
|
||
type: string
|
||
example: "0.2"
|
||
glucose:
|
||
type: string
|
||
example: "0.0"
|
||
lactose:
|
||
type: string
|
||
example: "0.0"
|
||
maltose:
|
||
type: string
|
||
example: "0.0"
|
||
galactose:
|
||
type: string
|
||
example: "0.0"
|
||
carbohydrateHydrates:
|
||
type: string
|
||
example: "0.5"
|
||
boundFructose:
|
||
type: string
|
||
example: "0.0"
|
||
freeFructose:
|
||
type: string
|
||
example: "0.0"
|
||
oligosaccharides:
|
||
type: string
|
||
example: "0.0"
|
||
polyols:
|
||
type: string
|
||
example: "0.0"
|
||
solubleFiber:
|
||
type: string
|
||
example: "0.0"
|
||
inositol:
|
||
type: string
|
||
example: "0.0"
|
||
|
||
IncoCompoFattyAcids:
|
||
type: object
|
||
description: Teneur détaillée en acides gras (AGS, AGMI, AGPI).
|
||
properties:
|
||
nutFd:
|
||
type: string
|
||
description: Lipides totaux (g/100g).
|
||
example: "12.5"
|
||
nutChol:
|
||
type: string
|
||
description: Cholestérol (mg/100g).
|
||
example: "75.0"
|
||
nutAgt:
|
||
type: string
|
||
description: Acides gras trans (g/100g).
|
||
example: "0.1"
|
||
nutFformiq:
|
||
type: string
|
||
description: Acide formique (C1:0).
|
||
example: "0.0"
|
||
nutFacetiq:
|
||
type: string
|
||
description: Acide acétique (C2:0).
|
||
example: "0.0"
|
||
nutFpropioniq:
|
||
type: string
|
||
description: Acide propionique (C3:0).
|
||
example: "0.0"
|
||
nutFbutyriq:
|
||
type: string
|
||
description: Acide butyrique (C4:0).
|
||
example: "0.0"
|
||
nutFvaleriq:
|
||
type: string
|
||
description: Acide valérique (C5:0).
|
||
example: "0.0"
|
||
nutFcaproiq:
|
||
type: string
|
||
description: Acide caproïque (C6:0).
|
||
example: "0.0"
|
||
nutFenatiq:
|
||
type: string
|
||
description: Acide énanthique (C7:0).
|
||
example: "0.0"
|
||
nutFcapryliq:
|
||
type: string
|
||
description: Acide caprylique (C8:0).
|
||
example: "0.0"
|
||
nutFpelargoniq:
|
||
type: string
|
||
description: Acide pélargonique (C9:0).
|
||
example: "0.0"
|
||
nutFcapriq:
|
||
type: string
|
||
description: Acide caprique (C10:0).
|
||
example: "0.0"
|
||
nutFundecyliq:
|
||
type: string
|
||
description: Acide undécylique (C11:0).
|
||
example: "0.0"
|
||
nutFlauriq:
|
||
type: string
|
||
description: Acide laurique (C12:0).
|
||
example: "0.0"
|
||
nutFtridecyliq:
|
||
type: string
|
||
description: Acide tridécylique (C13:0).
|
||
example: "0.0"
|
||
nutFmyristiq:
|
||
type: string
|
||
description: Acide myristique (C14:0).
|
||
example: "0.1"
|
||
nutFpentadecyliq:
|
||
type: string
|
||
description: Acide pentadécylique (C15:0).
|
||
example: "0.0"
|
||
nutF16d0:
|
||
type: string
|
||
description: Acide palmitique (C16:0).
|
||
example: "2.5"
|
||
nutFmargariq:
|
||
type: string
|
||
description: Acide margarique (C17:0).
|
||
example: "0.0"
|
||
nutFsteariq:
|
||
type: string
|
||
description: Acide stéarique (C18:0).
|
||
example: "0.6"
|
||
nutFarachidiq:
|
||
type: string
|
||
description: Acide arachidique (C20:0).
|
||
example: "0.0"
|
||
nutFheneicosyliq:
|
||
type: string
|
||
description: Acide héneicosylique (C21:0).
|
||
example: "0.0"
|
||
nutFbeheniq:
|
||
type: string
|
||
description: Acide béhénique (C22:0).
|
||
example: "0.0"
|
||
nutFtricosiliq:
|
||
type: string
|
||
description: Acide tétracosanoïque (C23:0).
|
||
example: "0.0"
|
||
nutFlignoceriq:
|
||
type: string
|
||
description: Acide lignocérique (C24:0).
|
||
example: "0.0"
|
||
nutFcarboceriq:
|
||
type: string
|
||
description: Acide carbocérique (C26:0).
|
||
example: "0.0"
|
||
nutFcerotiq:
|
||
type: string
|
||
description: Acide cérotique (C26:0 alt.).
|
||
example: "0.0"
|
||
nutFceroplastiq:
|
||
type: string
|
||
description: Acide céroplastique.
|
||
example: "0.0"
|
||
nutFmontaniq:
|
||
type: string
|
||
description: Acide montanique (C28:0).
|
||
example: "0.0"
|
||
nutFnonacosyliq:
|
||
type: string
|
||
description: Acide nonacosylique (C29:0).
|
||
example: "0.0"
|
||
nutFmelissiq:
|
||
type: string
|
||
description: Acide mélissique (C30:0).
|
||
example: "0.0"
|
||
nutFlaceroiq:
|
||
type: string
|
||
description: Acide lacéroïque (C32:0).
|
||
example: "0.0"
|
||
nutFhentriacontyliq:
|
||
type: string
|
||
description: Acide hentriacontylique (C31:0).
|
||
example: "0.0"
|
||
nutFhextriacontyliq:
|
||
type: string
|
||
description: Acide hexatriacontylique (C36:0).
|
||
example: "0.0"
|
||
nutFheptatriacontyliq:
|
||
type: string
|
||
description: Acide heptatriacontylique (C37:0).
|
||
example: "0.0"
|
||
nutFoctatriacontyliq:
|
||
type: string
|
||
description: Acide octariacontylique (C38:0).
|
||
example: "0.0"
|
||
nutFnonadylique:
|
||
type: string
|
||
description: Acide nonadylique.
|
||
example: "0.0"
|
||
nutFpsylliq:
|
||
type: string
|
||
description: Acide psyllique.
|
||
example: "0.0"
|
||
nutFpalm:
|
||
type: string
|
||
description: Acide palmitoléique (C16:1).
|
||
example: "0.8"
|
||
nutFoleiq:
|
||
type: string
|
||
description: Acide oléique (C18:1 ω-9).
|
||
example: "4.5"
|
||
nutF18d:
|
||
type: string
|
||
description: C18 insaturé (générique).
|
||
example: "0.0"
|
||
nutF19d:
|
||
type: string
|
||
description: C19 insaturé.
|
||
example: "0.0"
|
||
nutF11eico:
|
||
type: string
|
||
description: Acide gondoïque (C20:1).
|
||
example: "0.1"
|
||
nutFgeddiq:
|
||
type: string
|
||
description: Acide geddique (C20:1 alt.).
|
||
example: "0.0"
|
||
nutFeruciq:
|
||
type: string
|
||
description: Acide érucique (C22:1).
|
||
example: "0.0"
|
||
nutFnervoniq:
|
||
type: string
|
||
description: Acide nervonique (C24:1).
|
||
example: "0.0"
|
||
nutFhyeniq:
|
||
type: string
|
||
description: Acide hyénique.
|
||
example: "0.0"
|
||
nutFamscis:
|
||
type: string
|
||
description: AG monoinsaturés cis (total).
|
||
example: "5.4"
|
||
nutF18d2cn6:
|
||
type: string
|
||
description: Acide linoléique (C18:2 ω-6).
|
||
example: "2.1"
|
||
nutF18d3n3:
|
||
type: string
|
||
description: Acide α-linolénique (C18:3 ω-3).
|
||
example: "0.3"
|
||
nutF20d4:
|
||
type: string
|
||
description: Acide arachidonique (C20:4).
|
||
example: "0.1"
|
||
nutF20d5n3:
|
||
type: string
|
||
description: EPA (C20:5 ω-3).
|
||
example: "0.0"
|
||
nutF22d6n3:
|
||
type: string
|
||
description: DHA (C22:6 ω-3).
|
||
example: "0.0"
|
||
nutFapun3:
|
||
type: string
|
||
description: AGPI ω-3 (total).
|
||
example: "0.3"
|
||
nutFapun6:
|
||
type: string
|
||
description: AGPI ω-6 (total).
|
||
example: "2.2"
|
||
nutFapun9:
|
||
type: string
|
||
description: AGPI ω-9 (total).
|
||
example: "0.0"
|
||
nutFapucis:
|
||
type: string
|
||
description: AGPI cis (total).
|
||
example: "2.5"
|
||
nutFapulc:
|
||
type: string
|
||
description: AGPI longue chaîne (total).
|
||
example: "0.1"
|
||
|
||
IncoCompoAminoAcids:
|
||
type: object
|
||
description: Teneur en acides aminés et protéines de lait.
|
||
properties:
|
||
essentialAminoAcids:
|
||
type: string
|
||
description: Acides aminés essentiels (total g/100g).
|
||
example: "8.5"
|
||
caseins:
|
||
type: string
|
||
description: Caséines (g/100g).
|
||
example: "0.0"
|
||
wheyProtein:
|
||
type: string
|
||
description: Protéines de lactosérum (g/100g).
|
||
example: "0.0"
|
||
|
||
IncoCompoSpecialCompounds:
|
||
type: object
|
||
description: Composés spéciaux (Choline, Carnitine, Taurine, Nucléotides).
|
||
properties:
|
||
choline:
|
||
type: string
|
||
description: Choline (mg/100g).
|
||
example: "65.0"
|
||
carnitine:
|
||
type: string
|
||
description: Carnitine (mg/100g).
|
||
example: "8.2"
|
||
taurine:
|
||
type: string
|
||
description: Taurine (mg/100g).
|
||
example: "12.0"
|
||
nucleotides:
|
||
type: string
|
||
description: Nucléotides (mg/100g).
|
||
example: "0.0"
|
||
|
||
IncoListResponse:
|
||
type: object
|
||
description: Enveloppe de réponse pour la liste des fiches INCO.
|
||
required:
|
||
- incoSheets
|
||
- pagination
|
||
properties:
|
||
incoSheets:
|
||
type: array
|
||
description: Collection des fiches INCO (format complet ou court).
|
||
items:
|
||
anyOf:
|
||
- $ref: "#/components/schemas/Inco"
|
||
- $ref: "#/components/schemas/IncoShort"
|
||
pagination:
|
||
$ref: "#/components/schemas/PaginationMeta"
|
||
|
||
IncoShortListResponse:
|
||
type: object
|
||
description: Enveloppe de réponse pour la liste courte des fiches INCO.
|
||
required:
|
||
- incoSheets
|
||
- pagination
|
||
properties:
|
||
incoSheets:
|
||
type: array
|
||
items:
|
||
$ref: "#/components/schemas/IncoShort"
|
||
pagination:
|
||
$ref: "#/components/schemas/PaginationMeta"
|
||
|
||
IncoItemResponse:
|
||
type: object
|
||
description: Enveloppe de réponse pour le détail d'une fiche INCO.
|
||
required:
|
||
- incoSheet
|
||
properties:
|
||
incoSheet:
|
||
$ref: "#/components/schemas/Inco"
|
||
|
||
IncoCompoItemResponse:
|
||
type: object
|
||
description: Enveloppe de réponse pour le détail d'une composition INCO.
|
||
required:
|
||
- composition
|
||
properties:
|
||
composition:
|
||
$ref: "#/components/schemas/IncoCompo"
|
||
|
||
ProblemDetails:
|
||
type: object
|
||
description: Format d'erreur standardisé RFC 7807 (Problem Details for HTTP APIs).
|
||
required:
|
||
- type
|
||
- title
|
||
- status
|
||
- detail
|
||
properties:
|
||
type:
|
||
type: string
|
||
format: uri
|
||
description: URI identifiant le type de problème.
|
||
example: "http://127.0.0.1:8000/errors/not-found"
|
||
title:
|
||
type: string
|
||
description: Titre court lisible résumant le problème.
|
||
example: "Resource Not Found"
|
||
status:
|
||
type: integer
|
||
description: Code statut HTTP.
|
||
example: 404
|
||
detail:
|
||
type: string
|
||
description: Explication humaine détaillée de l'erreur.
|
||
example: "Employee '9999999' not found."
|
||
instance:
|
||
type:
|
||
- string
|
||
- "null"
|
||
format: uri-reference
|
||
description: URI de l'endpoint ayant généré l'erreur.
|
||
example: "/api/v1/employees/9999999"
|
||
|
||
InvalidParamItem:
|
||
type: object
|
||
description: Détail d'une erreur de validation sur un paramètre.
|
||
required:
|
||
- name
|
||
- reason
|
||
properties:
|
||
name:
|
||
type: string
|
||
description: Nom du champ ou paramètre invalide.
|
||
example: employeeId
|
||
reason:
|
||
type: string
|
||
description: Raison du rejet de validation.
|
||
example: "The employeeId pattern must be 7 or 8 digits."
|
||
|
||
ValidationErrorProblemDetails:
|
||
type: object
|
||
description: Format RFC 7807 pour les erreurs de validation HTTP (422 Unprocessable Entity).
|
||
required:
|
||
- type
|
||
- title
|
||
- status
|
||
- detail
|
||
- invalidParams
|
||
properties:
|
||
type:
|
||
type: string
|
||
format: uri
|
||
description: URI identifiant l'erreur de validation.
|
||
example: "http://127.0.0.1:8000/errors/validation-error"
|
||
title:
|
||
type: string
|
||
description: Titre de l'erreur.
|
||
example: "Unprocessable Entity"
|
||
status:
|
||
type: integer
|
||
description: Code HTTP (422).
|
||
example: 422
|
||
detail:
|
||
type: string
|
||
description: Message d'ensemble.
|
||
example: "The given data was invalid."
|
||
invalidParams:
|
||
type: array
|
||
description: Liste des paramètres invalides et motifs.
|
||
items:
|
||
$ref: "#/components/schemas/InvalidParamItem"
|