Aller au contenu principal

Référence complète de l'API Référentiel UBSI

Vue d'ensemble

L'API Référentiel UBSI expose les données de référence (produits, fournisseurs, entrepôts, magasins) pour l'écosystème Fnac/Darty.

URLs et Environnements

Authentification

  • Routes publiques (/api/publique/*): Aucune authentification requise pour le moment
  • Routes privées (/api/privee/*): Réservées aux outils internes
  • Production: Kong API Gateway avec clés API (configuration via KONG_API_GATEWAY, KONG_API_KEY)

Conventions générales

Formats de données

  • Format de réponse: JSON UTF-8
  • Dates: ISO 8601 format string (2025-09-27T12:34:56.000Z)
  • Prix: Stockés en centimes d'euros (entier)
  • IDs: Entiers positifs (bigint)

Champs système automatiques

Tous les objets incluent automatiquement :

  • id: Identifiant unique auto-incrémenté
  • createdAt: Date de création (ISO 8601)
  • updatedAt: Date de dernière modification (ISO 8601)

⚠️ Le champ deletedAt existe en interne pour le soft-delete mais n'est jamais exposé dans l'API publique.

Soft-delete

Toutes les suppressions sont logiques (soft-delete) :

  • Les entités supprimées ne sont plus visibles via l'API
  • Elles sont marquées avec deletedAt en base mais ce champ n'apparaît pas dans les réponses
  • Pas de suppression physique de données

Pagination et filtrage

Pagination standard

Tous les endpoints GET principaux supportent la pagination :

Paramètres:

  • page (optionnel): Numéro de page (≥1, ≤1000). Défaut: 1
  • limit (optionnel): Éléments par page (1-100). Défaut: 20

Réponse paginée (si page ou limit fourni):

{
"rows": [...], // Données de la page courante
"total": 1234, // Nombre total d'éléments
"page": 1, // Page courante
"limit": 20, // Éléments par page
"totalPages": 62 // Nombre total de pages
}

Réponse simple (sans pagination):

[...]  // Tableau simple de tous les éléments

Tri (sorting)

Paramètres:

  • sort: Champ(s) de tri, séparés par virgule. Préfixer par - pour ordre décroissant
    • Exemple simple: nom
    • Exemple multiple: nom,-prixDeVenteCents (nom croissant, puis prix décroissant)
  • order: asc ou desc (utilisé avec un seul critère de tri)

Recherche textuelle

Paramètre:

  • search: Recherche dans les champs principaux (nom, description, etc.)
    • Exemple: search=samsung tv 4k

Sélection de champs

Paramètre:

  • fields: Liste des champs à retourner, séparés par virgules
    • Exemple: fields=id,nom,ean,prixDeVenteCents
    • Réduit la taille des réponses et améliore les performances

Filtrage par IDs

Paramètre:

  • ids: Liste d'IDs à récupérer, séparés par virgules (max 500)
    • Exemple: ids=123,456,789,1011

Filtres avancés (MUI DataGrid)

Paramètre:

  • filters: Filtres JSON structurés compatibles MUI DataGrid

Format:

filters = JSON.stringify([
{ field: 'champ', operator: 'opérateur', value: 'valeur' },
]);

Opérateurs supportés:

  • Texte: contains, equals, startsWith, endsWith, isEmpty, isNotEmpty, isAnyOf
  • Nombres: =, !=, >, >=, <, <=

Exemples:

// Recherche TV Samsung > 500€
filters = JSON.stringify([
{ field: 'nom', operator: 'contains', value: 'TV' },
{ field: 'marque', operator: 'equals', value: 'Samsung' },
{ field: 'prixDeVenteCents', operator: '>', value: 50000 },
]);

// Produits actifs dans plusieurs catégories
filters = JSON.stringify([
{ field: 'statutProduit', operator: 'equals', value: 'actif' },
{
field: 'categories',
operator: 'isAnyOf',
value: ['informatique', 'telephonie'],
},
]);

Extension de données (include)

Paramètre:

  • include: Charge les relations associées

Valeurs possibles:

  • Sur /produits/:id: include=fournisseurs → Inclut la liste des fournisseurs
  • Sur /fournisseurs/:id: include=produits → Inclut la liste des produits

Endpoints Produits

Base: /api/publique/produits

GET /api/publique/produits

Liste tous les produits avec pagination, tri, recherche et filtrage optionnels.

Query Parameters:

  • Pagination: page, limit
  • Tri: sort, order
  • Recherche: search (nom, description)
  • Sélection: fields, ids
  • Filtres: filters (JSON MUI DataGrid)
  • Include: include=fournisseurs (inclut relations)
  • Filtres métier:
    • marque: Filtrer par marque
    • categories: Filtrer par catégorie (voir enums)
    • statutProduit: actif, inactif, discontinue, en_developpement, obsolete
    • ean: Filtrer par EAN spécifique

Réponse: ProduitDto[] ou PaginatedProduitsDto

Exemple:

GET /api/publique/produits?page=1&limit=20&search=samsung&sort=-prixDeVenteCents
GET /api/publique/produits?categories=informatique&statutProduit=actif
GET /api/publique/produits?ids=1,2,3,4,5

GET /api/publique/produits/:id

Récupère un produit par son ID.

Path Parameters:

  • id (required): ID du produit (entier)

Query Parameters:

  • include: fournisseurs pour inclure la liste des fournisseurs

Réponse: ProduitDto

Codes de statut:

  • 200: Succès
  • 400: ID invalide
  • 404: Produit non trouvé

POST /api/publique/produits

Crée un nouveau produit.

Body: CreateProduitDto

{
"ean": "1234567890123", // OBLIGATOIRE - Unique
"nom": "Samsung Galaxy S24", // OBLIGATOIRE
"prixDeVenteCents": 89900, // OBLIGATOIRE (en centimes)
"description": "Smartphone flagship 2024", // Optionnel
"photosUrls": ["https://cdn.example.com/s24.jpg"], // Optionnel
"categories": "telephonie", // Optionnel (défaut: "accessoires")
"marque": "Samsung", // Optionnel
"poids": "168g", // Optionnel
"couleurs": "Noir, Violet, Jaune", // Optionnel
"dimensions": "147x71x7.6mm", // Optionnel
"caracteristiquesTechniques": "Snapdragon 8 Gen 3, 8GB RAM", // Optionnel
"dureeGarantie": 730, // Optionnel (en jours)
"statutProduit": "actif", // Optionnel (défaut: "actif")
"documentationUrl": "https://docs.samsung.com/s24", // Optionnel
"dateFinReapprovisionnement": "2025-12-31", // Optionnel (ISO 8601)
"dateFinDeVie": "2027-12-31", // Optionnel (ISO 8601)
"produitsComplementairesIds": [45, 67, 89] // Optionnel (IDs de produits actifs)
}

Réponse: ProduitDto (201 Created)

Codes de statut:

  • 201: Produit créé avec succès
  • 400: Données invalides
  • 422: Violation de contraintes métier (EAN dupliqué, etc.)

PATCH /api/publique/produits/:id

Met à jour un produit existant.

Path Parameters:

  • id (required): ID du produit

Body: UpdateProduitDto (tous les champs optionnels)

{
"nom": "Samsung Galaxy S24 Ultra",
"prixDeVenteCents": 129900,
"statutProduit": "actif"
}

Réponse: ProduitDto (200 OK)

PATCH /api/publique/produits

Mise à jour en lot (batch update).

Body: BatchUpdateProduitDto

{
"produits": [
{
"id": 1,
"prixDeVenteCents": 79900,
"statutProduit": "actif"
},
{
"id": 2,
"nom": "Nouveau nom",
"prixDeVenteCents": 89900
}
]
}

Limites:

  • Minimum: 1 produit
  • Maximum: 500 produits par requête

Réponse: BatchUpdateResponseDto

{
"succes": true,
"modifies": 2,
"resultats": [
{
"index": 0,
"id": 1,
"ean": "1234567890123",
"statut": "ok"
},
{
"index": 1,
"id": 2,
"ean": "2345678901234",
"statut": "ok"
}
]
}

DELETE /api/publique/produits/:id

Supprime logiquement un produit (soft-delete).

Path Parameters:

  • id (required): ID du produit

Réponse: 200 OK (pas de body)

DELETE /api/publique/produits

Suppression en lot (bulk delete).

Body:

{
"ids": [1, 2, 3, 4, 5]
}

Limites:

  • Minimum: 1 ID
  • Maximum: 500 IDs par requête

Réponse: BulkResponseDto

{
"succes": true,
"supprimes": 5,
"resultats": [...]
}

Codes de statut:

  • 200: Tous les IDs supprimés avec succès
  • 400: Certains IDs non trouvés (suppression partielle)
  • 404: Aucun des IDs n'existe

GET /api/publique/produits/:id/fournisseurs

Liste les fournisseurs d'un produit avec pagination.

Path Parameters:

  • id (required): ID du produit

Query Parameters:

  • Pagination: page, limit
  • Tri: sort, order
  • Champs triables: prixFournisseurCents, delaiLivraisonJours, referenceFournisseur, statutRelation

Réponse: PaginatedProduitFournisseursDto

POST /api/publique/produits/:id/fournisseurs

Ajoute un fournisseur à un produit.

Path Parameters:

  • id (required): ID du produit

Body: CreateProduitFournisseurDto

{
"fournisseurId": 1, // OBLIGATOIRE
"prixFournisseurCents": 15000, // Optionnel (prix d'achat)
"delaiLivraisonJours": 7, // Optionnel
"quantiteMinimaleCommande": 10, // Optionnel
"referenceFournisseur": "REF-123", // Optionnel
"packaging": 24, // Optionnel (unités par carton)
"statutRelation": "actif" // Optionnel (défaut: "actif")
}

Réponse: Relation créée (201 Created)

PATCH /api/publique/produits/:id/fournisseurs/:fournisseurId

Met à jour la relation entre un produit et un fournisseur.

Path Parameters:

  • id (required): ID du produit
  • fournisseurId (required): ID du fournisseur

Body: UpdateProduitFournisseurDto

{
"prixFournisseurCents": 14500,
"delaiLivraisonJours": 5,
"statutRelation": "prefere"
}

Réponse: Relation mise à jour (200 OK)

POST /api/publique/produits/import

Importe des produits via fichier JSON.

Content-Type: multipart/form-data

Form Data:

  • file: Fichier JSON (voir structure dans section Import)

Réponse: ImportResultDto

{
"succes": true,
"created": 150,
"failed": 2,
"errors": [
{ "line": 5, "error": "EAN déjà existant" },
{ "line": 12, "error": "Prix invalide" }
]
}

POST /api/publique/produits/fournisseurs/import

Importe des relations produit-fournisseur via fichier JSON.

Content-Type: multipart/form-data

Form Data:

  • file: Fichier JSON avec relations (voir section Import)

Réponse: ImportResultDto


Endpoints Fournisseurs

Base: /api/publique/fournisseurs

GET /api/publique/fournisseurs

Liste tous les fournisseurs avec pagination, tri et filtrage.

Query Parameters:

  • Pagination: page, limit
  • Tri: sort, order
  • Recherche: search (nomLegal, adresse)
  • Sélection: fields, ids
  • Filtres: filters (JSON)
  • Include: include=produits
  • Filtres métier:
    • codeFournisseur: Code unique du fournisseur
    • statut: actif, inactif, suspendu, bloque, en_validation
    • statutContractuel: valide, expire, en_negociation, resilie, suspendu
    • adresse: Recherche partielle dans l'adresse

Réponse: FournisseurDto[] ou PaginatedFournisseursDto

GET /api/publique/fournisseurs/:id

Récupère un fournisseur par son ID.

Query Parameters:

  • include: produits pour inclure la liste des produits associés

Réponse: FournisseurDto

POST /api/publique/fournisseurs

Crée un nouveau fournisseur.

Body: CreateFournisseurDto

{
"nomLegal": "Samsung Electronics France", // OBLIGATOIRE
"codeFournisseur": "SAMS001", // OBLIGATOIRE - Unique
"siret": "12345678901234", // Optionnel
"adresse": "12 rue de Séoul, 75001 Paris", // Optionnel
"email": "contact@samsung.fr", // Optionnel
"telephone": "+33123456789", // Optionnel
"interlocuteurs": ["Jean Dupont", "Marie Martin"], // Optionnel
"documentsContractuelUrls": ["https://contrats/samsung.pdf"], // Optionnel
"statut": "actif", // Optionnel (défaut: "en_validation")
"statutContractuel": "valide" // Optionnel (défaut: "en_negociation")
}

Réponse: FournisseurDto (201 Created)

PATCH /api/publique/fournisseurs/:id

Met à jour un fournisseur.

Body: UpdateFournisseurDto (tous champs optionnels)

PATCH /api/publique/fournisseurs

Mise à jour en lot.

Body:

{
"fournisseurs": [
{
"id": 1,
"statut": "actif",
"email": "nouveau@email.com"
}
]
}

Limite: 1-500 fournisseurs

DELETE /api/publique/fournisseurs/:id

Suppression logique d'un fournisseur.

DELETE /api/publique/fournisseurs

Suppression en lot.

Body:

{
"ids": [1, 2, 3]
}

GET /api/publique/fournisseurs/:id/produits

Liste les produits d'un fournisseur avec pagination.

Query Parameters:

  • Pagination: page, limit
  • Tri: sort, order
  • Champs triables: ean, nom, statutProduit, prixFournisseurCents, delaiLivraisonJours

Réponse: PaginatedFournisseurProduitsDto

POST /api/publique/fournisseurs/import

Importe des fournisseurs via fichier JSON.

Content-Type: multipart/form-data


Endpoints Entrepôts

Base: /api/publique/entrepots

GET /api/publique/entrepots

Liste tous les entrepôts avec pagination et filtrage.

Query Parameters:

  • Pagination: page, limit
  • Tri: sort, order
  • Recherche: search (nom, adresse)
  • Sélection: fields, ids
  • Filtres: filters (JSON)
  • Filtres métier:
    • statut: operationnel, maintenance, ferme, en_construction
    • typeEntrepot: informatique, electromenager, accessoires, multimedia, generaliste
    • estGrosVolume: true ou false (infrastructure pour produits volumineux)

Réponse: EntrepotDto[] ou PaginatedEntrepotsDto

GET /api/publique/entrepots/:id

Récupère un entrepôt par son ID.

POST /api/publique/entrepots

Crée un nouvel entrepôt.

Body: CreateEntrepotDto

{
"nom": "Entrepôt Sud-Est", // OBLIGATOIRE
"adresse": "Zone industrielle Lyon Sud", // OBLIGATOIRE
"statut": "operationnel", // Optionnel (défaut: "operationnel")
"typeEntrepot": "electromenager", // Optionnel (défaut: "generaliste")
"estGrosVolume": true, // Optionnel (défaut: false)
"horaires": "08h-18h", // Optionnel
"capaciteStockage": 50000, // Optionnel (en unités)
"capaciteLogistique": 20000, // Optionnel
"rolesLogistiques": ["Stockage", "Préparation commandes"], // Optionnel
"zoneGeographiqueDesservie": "Auvergne-Rhône-Alpes", // Optionnel
"responsableLogistique": "Pierre Martin" // Optionnel
}

Champs importants:

  • typeEntrepot: Spécialisation de l'entrepôt
  • estGrosVolume: Indique si l'entrepôt peut gérer les produits volumineux (gros électroménager, TV grand format)

Réponse: EntrepotDto (201 Created)

PATCH /api/publique/entrepots/:id

Met à jour un entrepôt.

PATCH /api/publique/entrepots

Mise à jour en lot (1-500 entrepôts).

DELETE /api/publique/entrepots/:id

Suppression logique.

DELETE /api/publique/entrepots

Suppression en lot.

POST /api/publique/entrepots/import

Importe des entrepôts via fichier JSON.


Endpoints Magasins

Base: /api/publique/magasins

GET /api/publique/magasins

Liste tous les magasins avec pagination et filtrage.

Query Parameters:

  • Pagination: page, limit
  • Tri: sort, order
  • Recherche: search (nom, adresse)
  • Sélection: fields, ids
  • Filtres: filters (JSON)
  • Filtres métier:
    • statut: ouvert, ferme, renovation, fermeture_temporaire
    • type: megastore, magasin_centre_ville, magasin_centre_commercial, magasin_peripherie, concept_store, corner, drive, showroom
    • servicesDisponibles: Filtrer par service disponible

Réponse: MagasinDto[] ou PaginatedMagasinsDto

GET /api/publique/magasins/:id

Récupère un magasin par son ID.

POST /api/publique/magasins

Crée un nouveau magasin.

Body: CreateMagasinDto

{
"nom": "Fnac Lyon Part-Dieu", // OBLIGATOIRE
"adresse": "Centre Commercial La Part-Dieu, Lyon", // OBLIGATOIRE
"statut": "ouvert", // Optionnel (défaut: "ouvert")
"type": "megastore", // Optionnel (défaut: "magasin_centre_ville")
"servicesDisponibles": ["click_collect", "installation", "reparation"], // Optionnel (défaut: ["click_collect"])
"horaires": "10h-20h", // Optionnel
"responsable": "Sophie Durand", // Optionnel
"surfaceVente": 3500, // Optionnel (m²)
"capaciteDAccueil": 500 // Optionnel (personnes)
}

Services disponibles:

  • click_collect: Retrait en magasin
  • livraison_domicile: Livraison à domicile
  • installation: Service d'installation
  • reparation: Service après-vente/réparation
  • reprise: Reprise ancien matériel
  • financement: Solutions de financement
  • extension_garantie: Extensions de garantie
  • formation: Formation/prise en main
  • location: Location de matériel
  • maintenance: Contrats de maintenance

Réponse: MagasinDto (201 Created)

PATCH /api/publique/magasins/:id

Met à jour un magasin.

PATCH /api/publique/magasins

Mise à jour en lot (1-500 magasins).

DELETE /api/publique/magasins/:id

Suppression logique.

DELETE /api/publique/magasins

Suppression en lot.

POST /api/publique/magasins/import

Importe des magasins via fichier JSON.


Endpoints Relations Fournisseur-Produits

Base: /api/privee/fournisseur-produits ⚠️ API Privée (usage interne)

GET /api/privee/fournisseur-produits

Liste toutes les relations avec pagination et filtrage.

Query Parameters:

  • Pagination: page, limit
  • Tri: sort, order
  • Filtres: filters (JSON)
  • Filtres métier:
    • produitId: Filtrer par ID produit
    • fournisseurId: Filtrer par ID fournisseur

Réponse: FournisseurProduitRowDto[] ou PaginatedFournisseurProduitsDto


Endpoints Système

GET /health

Health check du serveur.

Réponse: 200 OK si le serveur est opérationnel et peut communiquer avec la base de données.

GET /ready

Readiness check (Kubernetes).

Réponse: 200 OK si le serveur est prêt à accepter du trafic.


Endpoints Clock (SSE)

GET /api/clock/update-sse

Subscribe to clock updates via Server-Sent Events.

Protocole: Server-Sent Events (SSE)

Réponse (stream):

data: {"time": "2025-01-25T14:30:00.000Z", "multiplier": 1}

Usage:

const eventSource = new EventSource('/api/clock/update-sse');
eventSource.onmessage = (event) => {
const { time, multiplier } = JSON.parse(event.data);
console.log('Clock update:', time, multiplier);
};

Import de données (JSON)

Tous les endpoints d'import utilisent multipart/form-data avec un fichier JSON.

Format général

Content-Type: multipart/form-data

Form Data:

  • file: Fichier JSON (array d'objets)

Import Produits

Endpoint: POST /api/publique/produits/import

Structure du fichier (produits.json):

[
{
"ean": "1234567890123",
"nom": "Nom du produit",
"prixDeVenteCents": 15000,
"description": "Description optionnelle",
"photosUrls": ["url1.jpg", "url2.jpg"],
"categories": "informatique",
"marque": "Samsung",
"poids": "2.5kg",
"couleurs": "Noir, Blanc",
"dimensions": "15x10x5cm",
"caracteristiquesTechniques": "Spec technique",
"dureeGarantie": 730,
"statutProduit": "actif",
"documentationUrl": "https://docs.example.com",
"dateFinReapprovisionnement": "2025-12-31",
"dateFinDeVie": "2026-12-31",
"produitsComplementairesIds": [2, 5, 12]
}
]

Champs obligatoires: ean, nom, prixDeVenteCents

Import Fournisseurs

Endpoint: POST /api/publique/fournisseurs/import

Structure (fournisseurs.json):

[
{
"nomLegal": "Samsung Electronics France",
"codeFournisseur": "SAMS001",
"siret": "12345678901234",
"adresse": "12 rue de Séoul, Paris",
"email": "contact@samsung.com",
"telephone": "+33123456789",
"interlocuteurs": ["Jean Dupont"],
"documentsContractuelUrls": ["https://contrats/samsung.pdf"],
"statut": "actif",
"statutContractuel": "valide"
}
]

Champs obligatoires: nomLegal, codeFournisseur

Import Entrepôts

Endpoint: POST /api/publique/entrepots/import

Structure (entrepots.json):

[
{
"nom": "Entrepôt Central Paris",
"adresse": "Zone Industrielle, 93170 Bagnolet",
"statut": "operationnel",
"typeEntrepot": "generaliste",
"estGrosVolume": false,
"horaires": "7h-19h du lundi au vendredi",
"capaciteStockage": 50000,
"capaciteLogistique": 1000,
"rolesLogistiques": ["stockage", "expedition", "reception"],
"zoneGeographiqueDesservie": "Île-de-France",
"responsableLogistique": "Pierre Martin"
}
]

Champs obligatoires: nom, adresse

Import Magasins

Endpoint: POST /api/publique/magasins/import

Structure (magasins.json):

[
{
"nom": "Fnac Paris Châtelet",
"adresse": "1 Rue Pierre Lescot, 75001 Paris",
"statut": "ouvert",
"servicesDisponibles": ["click_collect", "installation"],
"horaires": "10h-20h du lundi au samedi",
"responsable": "Sophie Durand",
"type": "megastore",
"surfaceVente": 3500,
"capaciteDAccueil": 500
}
]

Champs obligatoires: nom, adresse

Import Relations Produit-Fournisseur

Endpoint: POST /api/publique/produits/fournisseurs/import

Structure (relations.json):

[
{
"produitId": 123,
"fournisseurId": 1,
"prixFournisseurCents": 15000,
"delaiLivraisonJours": 7,
"quantiteMinimaleCommande": 10,
"referenceFournisseur": "REF-SUP-123",
"packaging": 24,
"statutRelation": "actif"
}
]

Champs obligatoires: produitId, fournisseurId

Note: Les produits et fournisseurs doivent exister au préalable.


Gestion des erreurs

Codes de statut HTTP

  • 200 OK: Succès
  • 201 Created: Ressource créée avec succès
  • 400 Bad Request: Paramètres invalides, données mal formées
  • 404 Not Found: Ressource non trouvée
  • 422 Unprocessable Entity: Violation de contraintes métier (duplicata, références invalides, etc.)
  • 500 Internal Server Error: Erreur serveur inattendue

Format des erreurs

{
"statusCode": 400,
"message": "Le numéro de page doit être un entier entre 1 et 1000",
"error": "Bad Request"
}

Erreurs spécifiques

Suppression en lot:

  • 200: Tous les IDs supprimés
  • 400: Certains IDs non trouvés (suppression partielle) → Message: IDs non trouvés: 999, 1001
  • 404: Aucun des IDs n'existe → Message: Aucun des IDs fournis n'existe: 998, 999, 1000

Import de fichiers:

  • 200: Import réussi (avec détails des échecs éventuels dans la réponse)
  • 400: Fichier invalide ou format JSON incorrect
  • 500: Erreur serveur

Limites et quotas

  • Pagination: Max 100 éléments par page, max 1000 pages
  • Batch operations: 1-500 items par requête (update/delete en lot)
  • IDs filter: Max 500 IDs
  • Import: Pas de limite stricte mais recommandé < 10 000 items par fichier

Exemples d'utilisation

Recherche de produits Samsung actifs

GET /api/publique/produits?marque=Samsung&statutProduit=actif&page=1&limit=20

Mise à jour de prix en masse

PATCH /api/publique/produits
Content-Type: application/json

{
"produits": [
{"id": 1, "prixDeVenteCents": 79900},
{"id": 2, "prixDeVenteCents": 89900},
{"id": 3, "prixDeVenteCents": 99900}
]
}

Import de nouveaux produits

POST /api/publique/produits/import
Content-Type: multipart/form-data

file: produits.json

Récupération d'un produit avec ses fournisseurs

GET /api/publique/produits/123?include=fournisseurs

Filtrage avancé avec MUI DataGrid

const filters = JSON.stringify([
{
field: 'categories',
operator: 'isAnyOf',
value: ['informatique', 'gaming'],
},
{ field: 'prixDeVenteCents', operator: '<=', value: 100000 },
{ field: 'statutProduit', operator: 'equals', value: 'actif' },
]);

fetch(
`/api/publique/produits?filters=${encodeURIComponent(filters)}&page=1&limit=20`
)
.then((res) => res.json())
.then((data) => console.log(data));

Notes importantes

  • Les champs dépréciés (préfixés deprecated* dans le schéma) ne doivent plus être utilisés. Ils seront supprimés dans une version future.
  • Toutes les dates de cycle de vie (dateFinReapprovisionnement, dateFinDeVie) sont optionnelles et au format ISO 8601.
  • Les relations fournisseur-produits sont gérées via la table de jointure optimisée fournisseur_produits.
  • Le soft-delete garantit l'intégrité des données historiques.