API Produits et utilisateurs d'une coopérative agricole

mars 2025 - avr. 2025
API
APIJavaJakartaEEGlassfish

Présentation de l'API Produits et utilisateurs de la coopérative Anarchy Acres (mars - avril 2025)

Contexte

Dans le cadre d'un projet en R4.01 Architecture logicielle, nous devions réaliser chacun une partie d'un site web selon l'architecture suivante :

Schéma de l'architecture à implémenter

Schéma de l'architecture à implémenter. Chaque BD est séparée, et chaque API aussi.

J'étais chargé d'implémenter l'API produits et utilisateurs. Le site web portait sur une coopérative agricole qui souhaitait mettre en vente direct ses produits via une plateforme disponible sur Internet.

L'API implémentée est en JakartaEE Glassfish. Elle repose sur une architecture en couches stricte. La Couche Resource (JAX-RS) expose les endpoints REST et délègue les traitements à la Couche Service, qui contient la logique métier. Les données sont persistées via la Couche Repository (JDBC) qui communique avec la base de données MariaDB, en utilisant des entités définies dans la Couche Model (Produit, Type, Unite, Utilisateur).

Implémentation

Appels JSON simple

L'API permet de gérer l'intégralité du catalogue produits via des échanges de flux JSON standards. Voici les principales fonctionnalités implémentées :

DomaineFonctionnalitésDétails techniques
ConsultationLecture des donnéesRécupération des listes de produits, types de produits et unités de mesure, ou récupération par ID unique.
RechercheFiltrage dynamiqueRecherche textuelle de produits par leur nom via query parameter.
ÉditionCréation et ModificationAjout de nouveaux produits/types (POST) et mise à jour des existants (PUT) avec validation des données.
SuppressionNettoyageSuppression d'entrées en base de données via la méthode DELETE.
EnrichissementData MappingLes objets "Produit" sont automatiquement enrichis avec les objets complets "Type" et "Unite" lors de la sérialisation.

Déploiement en distant

J'ai déployé mon API sur un VPS afin de disposer d'une entière flexibilité concernant celle-ci. J'ai utilisé un VPS Oracle à cet effet, en le configurant de A à Z.

Pour les besoins de cette mise en ligne, une sécurité a été ajoutée et seuls les appels GET sont utilisables. Veillez à ne pas surutiliser mon API s'il vous plaît !

Renvoi d'images

Permis par le déploiement en distant, la gestion des images ne passe pas par la base de données (stockage sous forme de BLOB) mais par le système de fichiers du serveur pour optimiser les performances.

  1. Réception : Le contrôleur ImageResource intercepte la requête GET ciblant l'ID d'un produit.
  2. Métadonnées : Le service interroge d'abord la base de données pour valider l'existence du produit et récupérer son nom normalisé.
  3. Résolution : Le système construit le chemin du fichier sur le disque du VPS (ex: /var/coop-images/ID_NOM.jpg).
  4. Fallback : Si le fichier spécifique est introuvable, le service tente de servir une image générique par défaut avant de renvoyer une erreur.
  5. Streaming : Le fichier binaire est renvoyé avec le MIME type approprié (ex: image/jpeg).

Tableau d'appels possibles

Voici la liste exhaustive des endpoints exposés par l'API sur le serveur de production.

MéthodeURL ComplèteDescriptionRetour attendu
GEThttps://79.72.25.28:8080/api/produitsListe tous les produitsJSON Array (Produits)
GEThttps://79.72.25.28:8080/api/produits/{id}Détail d'un produit spécifiqueJSON Object (Produit)
GEThttps://79.72.25.28:8080/api/produits/search?nom={x}Recherche par nomJSON Array (Produits)
GEThttps://79.72.25.28:8080/api/typesListe tous les types (catégories)JSON Array (Types)
GEThttps://79.72.25.28:8080/api/types/{id}Détail d'un typeJSON Object (Type)
GEThttps://79.72.25.28:8080/api/unitesListe toutes les unités de mesureJSON Array (Unités)
GEThttps://79.72.25.28:8080/api/images/produit/{id}Télécharge l'image du produitBinary (Image/JPEG)
POSThttps://79.72.25.28:8080/api/produitsAjout d'un produit (Body JSON)201 Created
PUThttps://79.72.25.28:8080/api/produits/{id}Modification d'un produit200 OK
DELETEhttps://79.72.25.28:8080/api/produits/{id}Suppression d'un produit204 No Content
POSThttps://79.72.25.28:8080/api/images/produit/{id}Upload d'une image (Binaire)200 OK / 201 Created

Exemples d'appels GET

Voici une liste d'URL directes pour tester les endpoints de lecture disponibles sur le serveur de production :

Produits

Types (Catégories)

Unités de mesure

Images