Skip to content
Snippets Groups Projects
Commit 63c278ec authored by anviton's avatar anviton
Browse files

US1 : Ajout de commentaires et de documentations

parent 75f2ec0a
Branches
Tags TP1_US1_v1
No related merge requests found
Showing
with 183 additions and 20 deletions
......@@ -2,8 +2,7 @@ package application;
import com.google.inject.Guice;
import com.google.inject.Injector;
import handler.MainHandler;
import handler.ProductService;
import handler.ProductHandler;
import java.util.Scanner;
......@@ -11,15 +10,15 @@ public class Application {
public static void main(String[] args) {
Injector injector = Guice.createInjector(new OpenFoodFactsModule());
ProductService productService = injector.getInstance(ProductService.class);
ProductHandler productHandler = injector.getInstance(ProductHandler.class);
Scanner scanner = new Scanner(System.in);
System.out.println("Enter a product barcode:");
String barcode = scanner.nextLine();
productService.fetchAndDisplayProduct(barcode);
productHandler.fetchAndDisplayProduct(barcode);
System.out.println("\n----------------\n");
productService.displayNutriScore(barcode);
productHandler.displayNutriScore(barcode);
}
}
\ No newline at end of file
......@@ -3,7 +3,17 @@ package application;
import com.google.inject.AbstractModule;
import services.OpenFoodFactsClient;
/**
* Classe OpenFoodFactsModule
* Module de configuration pour Google Guice
* Permet de lier les dépendances nécessaires pour l'application, notamment le client {@link OpenFoodFactsClient}.
* Ce module gère l'injection des dépendances
*/
public class OpenFoodFactsModule extends AbstractModule {
/**
* Configure les liaisons des dépendances pour Google Guice.
* Lie l'instance de {@link OpenFoodFactsClient} afin qu'elle soit injectée
*/
@Override
protected void configure() {
bind(OpenFoodFactsClient.class).toInstance(new OpenFoodFactsClient());
......
......@@ -4,15 +4,32 @@ import ihm.AppInterface;
import javax.inject.Inject;
/**
* Class MainHandler
* Classe principale responsable de la gestion des interactions entre l'application et l'utilisateur
* Cette classe utilise une interface {@link AppInterface} pour récupérer les entrées utilisateur
* et afficher les résultats
*/
public class MainHandler {
AppInterface app;
/**
* Constructeur de la classe MainHandler
* Initialise la classe avec une implémentation de {@link AppInterface} injectée via Google Guice
*
* @param app Une instance d'implémentation de {@link AppInterface} permettant d'interagir avec l'utilisateur.
*/
@Inject
public MainHandler(AppInterface app) {
this.app = app;
}
/**
* Lance le gestionnaire principal
* Affiche un message de démarrage, récupère une entrée utilisateur via l'interface {@link AppInterface}
* et affiche le résultat dans la console
*/
public void launch(){
System.out.printf("lets go !");
String result = app.getInput();
......
......@@ -6,14 +6,31 @@ import model.Product;
import services.OpenFoodFactsClient;
import utils.NutriScoreCalculator;
public class ProductService {
/**
* Class ProductHandler
* Gère la récupération et l'affichage des informations des produits
* Cette classe utilise un client {@link OpenFoodFactsClient} pour interagir avec l'API Open Food Facts,
* effectuer des calculs nutritionnels et afficher les résultats
*/
public class ProductHandler {
private final OpenFoodFactsClient client;
/**
* Constructeur de la classe ProductService
* Initialise le service avec un client {@link OpenFoodFactsClient} injecté via Google Guice
*
* @param client Une instance d'OpenFoodFactsClient permettant d'interagir avec l'API Open Food Facts
*/
@Inject
public ProductService(OpenFoodFactsClient client) {
public ProductHandler(OpenFoodFactsClient client) {
this.client = client;
}
/**
* Récupère les informations d'un produit à partir de son code-barres
* @param barcode Le code-barres du produit à rechercher
* @return Un objet {@link Product} contenant les informations du produit, ou null en cas d'erreur
*/
public Product fetchProduct(String barcode){
Product product = null;
try {
......@@ -24,6 +41,10 @@ public class ProductService {
return product;
}
/**
* Récupère et affiche les informations d'un produit (nom, marque, Nutri-Score et nutriments)
* @param barcode Le code-barres du produit à rechercher
*/
public void fetchAndDisplayProduct(String barcode) {
Product product = fetchProduct(barcode);
if (product != null && product.getNutriments() != null) {
......@@ -43,6 +64,10 @@ public class ProductService {
}
}
/**
* Calcule et affiche le Nutri-Score d'un produit à partir de son code-barres
* @param barcode Le code-barres du produit dont on veut le Nutri-Score
*/
public void displayNutriScore(String barcode){
Product product = fetchProduct(barcode);
try{
......
......@@ -13,7 +13,7 @@ public class CommandLine implements AppInterface{
String result = "";
System.out.printf("Entrez le code barre du produit ");
if (scanner.hasNext()) { // If the user entered something
if (scanner.hasNext()) {
result = scanner.next();
}
......
......@@ -2,7 +2,10 @@ package model;
import com.google.gson.annotations.SerializedName;
/**
* Class Product
* stocke les informations d'un produit
*/
public class Product {
@SerializedName("product_name")
......@@ -33,6 +36,10 @@ public class Product {
return nutriments;
}
/**
* Class Nutriments
* Stocke les informations sur les nutriments d'un produit
*/
public static class Nutriments {
@SerializedName("energy_100g")
......
......@@ -2,6 +2,10 @@ package model;
import com.google.gson.annotations.SerializedName;
/**
* Class ProductResponse
* Encapsule un produit
*/
public class ProductResponse {
@SerializedName("product")
......
......@@ -5,7 +5,18 @@ import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;
/**
* Interface OpenFoodFactsApi
* Interface pour interagir avec l'API Open Food Facts
* Permet de récupérer les informations nutritionnelles d'un produit en fonction de son code-barres
*/
public interface OpenFoodFactsApi {
/**
* Récupère les informations d'un produit à partir de son code-barres
* @param barcode Le code-barres du produit à rechercher
* @return Un objet {@link Call} contenant une réponse encapsulée dans {@link ProductResponse}
* La réponse contient les informations sur le produit correspondant au code-barres
*/
@GET("api/v0/produit/{barcode}.json")
Call<ProductResponse> getProductByBarcode(@Path("barcode") String barcode);
}
......
......@@ -5,11 +5,19 @@ import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import model.Product;
/**
* Client pour interagir avec l'API Open Food Facts
* Cette classe utilise Retrofit pour effectuer des requêtes HTTP vers l'API et récupérer les données des produits
*/
public class OpenFoodFactsClient {
private static final String BASE_URL = "https://fr.openfoodfacts.org/";
private final OpenFoodFactsApi api;
/**
* Constructeur de la classe OpenFoodFactsClient
* Initialise Retrofit et configure l'API pour interagir avec Open Food Facts
*/
public OpenFoodFactsClient() {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
......@@ -19,6 +27,12 @@ public class OpenFoodFactsClient {
this.api = retrofit.create(OpenFoodFactsApi.class);
}
/**
* Récupérer le produit dont on spécifie le code-barres
* @param barcode code-barres du produit dont on souhaite récupérer les informations
* @return le produit recherché
* @throws Exception en cas de problème avec le code-barre
*/
public Product fetchProduct(String barcode) throws Exception {
ProductResponse response = api.getProductByBarcode(barcode).execute().body();
return response != null ? response.getProduct() : null;
......
......@@ -2,21 +2,33 @@ package utils;
import model.Product;
/**
* Classe utilitaire pour le calcul du Nutri-Score d'un produit.
* Utilise les sous-composantes N (négatives) et P (positives) pour calculer le score nutritionnel
* en se basant sur les nutriments d'un produit
*/
public class NutriScoreCalculator {
/**
* Calcule le Nutri-Score d'un produit à partir de ses informations nutritionnelles
* Stroutraction la somme des points négatifs à la somme des points positifs
* @param nutriments Un objet {@link Product.Nutriments} contenant les informations nutritionnelles du produit
* (énergie, graisses saturées, sucres, sodium, fibres, protéines)
* @return Le Nutri-Score calculé
*/
public static int calculateNutriScore(Product.Nutriments nutriments) {
// Calcul des points négatifs
int energyPoints = NutriScoreCalculatorCompoN.calculateEnergyPoints(nutriments.getEnergy());
int saturatedFatPoints = NutriScoreCalculatorCompoN.calculateSaturatedFatPoints(nutriments.getSaturatedFat());
int sugarsPoints = NutriScoreCalculatorCompoN.calculateSugarsPoints(nutriments.getSugars());
int sodiumPoints = NutriScoreCalculatorCompoN.calculateSodiumPoints(nutriments.getSodium());
// Calcul des points positifs
int fiberPoints = NutriScoreCalculatorCompoP.calculateFiberPoints(nutriments.getFiber());
int proteinPoints = NutriScoreCalculatorCompoP.calculateProteinPoints(nutriments.getProteins());
// Calcul du Nutri-Score
int totalNegativePoints = energyPoints + saturatedFatPoints + sugarsPoints + sodiumPoints;
int totalPositivePoints = fiberPoints + proteinPoints;
return totalNegativePoints - totalPositivePoints;
}
......
package utils;
/**
* Classe NutriScoreCalculatorCompoN
* Classe utilitaire pour le calcul des points de la composante négative du Nutri-Score.
* Les points négatifs sont calculés en fonction de :
* - La densité énergétique
* - Les graisses saturées
* - Les sucres simples
* - Le sodium
* Cette classe fournit des méthodes pour calculer ces points en fonction des seuils définis
*/
public class NutriScoreCalculatorCompoN {
/**
* Calcule les points négatifs basés sur la densité énergétique
* @param energy La densité énergétique
* @return Les points associés à la densité énergétique
*/
public static int calculateEnergyPoints(float energy) {
if (energy <= 335) return 0;
if (energy <= 670) return 1;
......@@ -16,6 +31,11 @@ public class NutriScoreCalculatorCompoN {
return 10;
}
/**
* Calcule les points négatifs basés sur les graisses saturées
* @param saturatedFat La teneur en graisses saturées
* @return Les points associés aux graisses saturées
*/
public static int calculateSaturatedFatPoints(float saturatedFat) {
if (saturatedFat <= 1) return 0;
if (saturatedFat <= 2) return 1;
......@@ -30,6 +50,11 @@ public class NutriScoreCalculatorCompoN {
return 10;
}
/**
* Calcule les points négatifs basés sur la teneur en sucres simples
* @param sugars La teneur en sucres simples
* @return Les points associés aux sucres simples
*/
public static int calculateSugarsPoints(float sugars) {
if (sugars <= 4.5) return 0;
if (sugars <= 9) return 1;
......@@ -44,6 +69,11 @@ public class NutriScoreCalculatorCompoN {
return 10;
}
/**
* Calcule les points négatifs basés sur la teneur en sodium
* @param sodium La teneur en sodium
* @return Les points associés au sodium
*/
public static int calculateSodiumPoints(float sodium) {
if (sodium <= 90) return 0;
if (sodium <= 180) return 1;
......
package utils;
/**
* Classe utilitaire pour le calcul des points de la composante positive (P) du Nutri-Score
* Les points positifs sont calculés en fonction de :
* - La teneur en fibres
* - La teneur en protéines
* Cette classe fournit des méthodes pour calculer ces points en fonction des seuils définis
*/
public class NutriScoreCalculatorCompoP {
/**
* Calcule les points positifs basés sur la teneur en fibres
* @param fiber La teneur en fibres
* @return Les points associés aux fibres
*/
public static int calculateFiberPoints(float fiber) {
if (fiber <= 0.9) return 0;
if (fiber <= 1.9) return 1;
......@@ -10,6 +22,11 @@ public class NutriScoreCalculatorCompoP {
return 5;
}
/**
* Calcule les points positifs basés sur la teneur en protéines
* @param proteins La teneur en protéines
* @return Les points associés aux protéines
*/
public static int calculateProteinPoints(float proteins) {
if (proteins <= 1.6) return 0;
if (proteins <= 3.2) return 1;
......
......@@ -3,21 +3,38 @@ package us;
import application.OpenFoodFactsModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import handler.ProductService;
import handler.ProductHandler;
import model.Product;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
/**
* Class Us1Test
* Vérifie le bon fonctionnement du User Story 1
* Vérifie le bon focntionnement de la récupération d'un produit et de ses informations à l'aide
* de l'API Open Food Facts
*
*/
public class Us1Test {
private final ProductService productService;
private final ProductHandler productHandler;
/**
* Constructeur de la classe Us1Test
* Initialise Google Guice avec le module {@link OpenFoodFactsModule} et récupère
* une instance de {@link ProductHandler}
*/
public Us1Test() {
Injector injector = Guice.createInjector(new OpenFoodFactsModule());
productService = injector.getInstance(ProductService.class);
productHandler = injector.getInstance(ProductHandler.class);
}
@Test
/**
* Test pour vérifier que les informations retournées par l'API Open Food Facts pour un produit
* récupéré grâce à son son code-barres correspondent aux valeurs attendues
*/
public void testFetchProductWithExpectedValues() {
// Code-barre du Nutella
String barcode = "3017620425035";
......@@ -33,7 +50,7 @@ public class Us1Test {
Float expectedFiber = null;
Float expectedProteins = 6.3f;
Product product = productService.fetchProduct(barcode);
Product product = productHandler.fetchProduct(barcode);
assertNotNull(product, "Le produit ne doit pas être null");
......
......@@ -3,7 +3,7 @@ package us;
import application.OpenFoodFactsModule;
import com.google.inject.Guice;
import com.google.inject.Injector;
import handler.ProductService;
import handler.ProductHandler;
import model.Product;
import org.junit.jupiter.api.Test;
import utils.NutriScoreCalculator;
......@@ -12,16 +12,16 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
public class Us2Test {
private final ProductService productService;
private final ProductHandler productHandler;
public Us2Test() {
Injector injector = Guice.createInjector(new OpenFoodFactsModule());
productService = injector.getInstance(ProductService.class);
productHandler = injector.getInstance(ProductHandler.class);
}
@Test
public void testNutriScoreCalculationWithAProductOnOpenFoodFact() {
Product product = productService.fetchProduct("7622210449283");
Product product = productHandler.fetchProduct("7622210449283");
if (product != null && product.getNutriments() != null) {
Product.Nutriments nutriments = product.getNutriments();
int nutriScore = NutriScoreCalculator.calculateNutriScore(nutriments);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment