CuisineWeek – Documentation Technique

Application Android · Kotlin · Room · MVVM · BTS SIO SLAM 2025–2026

📱 Android 8.0+ (API 28)
🔤 Kotlin 2.1.0
🗄️ Room 2.6.1
🏗️ Architecture MVVM
📅 Mai 2026

📋 Table des matières

  1. Présentation du projet
  2. Architecture MVVM
  3. Classes
  4. Modèle Logique de Données (MLD)
  5. Diagramme de cas d'utilisation
  6. Intégration API OpenFoodFacts
  7. Stack technique
1. Présentation du projet

Contexte et objectifs de l'application CuisineWeek

CuisineWeek est une application mobile Android développée en Kotlin dans le cadre du BTS SIO option SLAM. Elle permet à l'utilisateur de consulter des recettes de cuisine, de planifier ses repas à la semaine et de générer automatiquement une liste de courses à partir du menu planifié.

Fonctionnalités principales

ModuleFonctionnalitéStatut
CatalogueAffichage de la liste des recettes avec RecyclerView✅ Implémenté
CatalogueRecherche et filtrage des recettes🔄 Prévu Sprint 5
Menu semaineNavigation jour par jour avec DatePicker✅ Implémenté
Menu semaineAjout / suppression de repas (Midi, Soir, Matin)✅ Implémenté
Liste coursesScan code-barre via OpenFoodFacts✅ Implémenté
Liste coursesCases à cocher et partage✅ Implémenté
Recettes persoCréation de recettes personnalisées🔄 Prévu Sprint 5
2. Architecture MVVM

Model – View – ViewModel : séparation des responsabilités

L'application suit le pattern architectural MVVM (Model-View-ViewModel) recommandé par Google pour les applications Android. Ce pattern garantit une séparation claire entre la logique métier et l'interface utilisateur.

🖥️ VIEW — Couche présentation
MainActivity
RecettesFragment
SemaineFragment
CoursesFragment
SelectionRecetteDialog
RecetteAdapter
ArticleCoursesAdapter
⬆️ observe LiveData    ⬇️ appelle fonctions
🧠 VIEWMODEL — Couche logique
RecetteViewModel
MenuViewModel
CoursesViewModel
⬆️ LiveData    ⬇️ appelle fonctions suspend
📦 REPOSITORY — Couche d'accès aux données
RecetteRepository
RetrofitClient (OpenFoodFacts)
⬆️ entités    ⬇️ requêtes SQL / HTTP
🗄️ DATA — Couche données
AppDatabase (Room)
RecetteDao
MenuDao
ArticleCoursesDao
OpenFoodFactsApi (Retrofit)
DatabaseSeeder

Principes appliqués

PrincipeApplication dans CuisineWeek
Séparation des responsabilitésChaque couche a un rôle unique et ne connaît pas les détails des autres
Réactivité (LiveData)L'UI se met à jour automatiquement quand les données changent en BDD
Asynchronisme (Coroutines)Toutes les opérations BDD et réseau s'exécutent en arrière-plan (Dispatchers.IO)
Singleton (AppDatabase)Une seule instance de la BDD dans toute l'application (pattern @Volatile + synchronized)
Injection de dépendancesLes DAOs sont injectés dans les ViewModels via AppDatabase.getDatabase()
3. Classes

Représentation UML des classes principales et leurs relations

Entités (data/entity)

«Entity» Recette
PK id : Int
+ nom : String
+ description : String
+ tempsPrep : Int
+ tempsCuisson : Int
+ nbPersonnes : Int
+ difficulte : String
FK categorieId : Int?
+ imageUri : String?
+ estPersonnalisee : Boolean
«Entity» Categorie
PK id : Int
+ nom : String
+ icone : String
«Entity» Ingredient
PK id : Int
+ nom : String
+ uniteDefaut : String
+ categorieCourses : String
«Entity» RecetteIngredient
PK/FK recetteId : Int
PK/FK ingredientId : Int
+ quantite : Double
+ unite : String
«Entity» MenuSemaine
PK id : Int
+ semaineDu : String
+ nbPersonnes : Int
«Entity» MenuRecette
PK/FK menuId : Int
PK/FK recetteId : Int
PK jour : String
PK typeRepas : String
«Entity» ArticleCourses
PK id : Int
+ nom : String
+ quantite : String
+ codeBarres : String
+ coche : Boolean

DAOs (data/dao)

«interface» RecetteDao
getAllRecettes() : LiveData<List<Recette>>
searchRecettes(q) : LiveData<List<Recette>>
getRecetteById(id) : Recette?
getCount() : Int
insert(recette) : Long
update(recette)
delete(recette)
«interface» MenuDao
getMenuBySemaine(s) : MenuSemaine?
insertMenu(menu) : Long
insertMenuRecette(mr)
deleteMenuRecette(id,j,t)
getRecetteIdPourRepas() : Int?
getRecettesDuJour() : LiveData
«interface» ArticleCoursesDao
getAllArticles() : LiveData<List>
insert(article)
update(article)
delete(article)
deleteAll()

ViewModels (viewmodel)

RecetteViewModel
- repository : RecetteRepository
+ toutesLesRecettes : LiveData
rechercherRecettes(q)
inserer(recette)
supprimer(recette)
MenuViewModel
- menuDao : MenuDao
- recetteDao : RecetteDao
+ jourActuel : LiveData<LocalDate>
+ recetteMidi : LiveData<Recette?>
+ recetteSoir : LiveData<Recette?>
+ recetteMatin : LiveData<Recette?>
jourSuivant()
jourPrecedent()
allerALaDate(date)
ajouterRecette(id, type)
supprimerRepas(type)
chargerMenuDuJour()
CoursesViewModel
- dao : ArticleCoursesDao
+ articles : LiveData<List>
ajouterDepuisScan(barcode)
toggleCoche(article)
supprimer(article)
toutEffacer()
5. Modèle Logique de Données (MLD)

Traduction du modèle conceptuel en tables relationnelles pour la base de données CuisineWeek

-- Tables relationnelles de la base CuisineWeek CATEGORIE ( id, nom ) RECETTE ( id, nom, description, tempsPrep, tempsCuisson, nbPersonnes, difficulte, #categorieId → CATEGORIE.id ) INGREDIENT ( id, nom, unite ) RECETTE_INGREDIENT ( id, #recetteId → RECETTE.id, #ingredientId → INGREDIENT.id, quantite ) MENU_SEMAINE ( id, semaine, dateDebut, dateFin ) MENU_RECETTE ( id, #menuId → MENU_SEMAINE.id, #recetteId → RECETTE.id, jour, momentRepas ) ARTICLE_COURSES ( id, nom, quantite, coche, #menuId → MENU_SEMAINE.id ) -- Conventions : -- Souligné = clé primaire -- # = clé étrangère

Contraintes d'intégrité

Table Contrainte Comportement
RECETTE categorieId → CATEGORIE.id SET NULL si catégorie supprimée
RECETTE_INGREDIENT recetteId → RECETTE.id CASCADE DELETE
RECETTE_INGREDIENT ingredientId → INGREDIENT.id RESTRICT
MENU_RECETTE menuId → MENU_SEMAINE.id CASCADE DELETE
MENU_RECETTE recetteId → RECETTE.id RESTRICT
ARTICLE_COURSES menuId → MENU_SEMAINE.id CASCADE DELETE

Relations principales

CATEGORIE 1 -------- N RECETTE RECETTE N -------- N via RECETTE_INGREDIENT INGREDIENT MENU_SEMAINE 1 -------- N MENU_RECETTE N | 1 RECETTE MENU_SEMAINE 1 -------- N ARTICLE_COURSES
5. Diagramme de cas d'utilisation

Actions disponibles pour l'utilisateur (acteur unique — pas de gestion de comptes)

🍳 Module Recettes

  • Consulter la liste des recettes
  • Rechercher une recette par nom
  • Filtrer par catégorie
  • Consulter le détail d'une recette
  • Créer une recette personnalisée
  • Modifier une recette personnalisée
  • Supprimer une recette personnalisée

📅 Module Menu Semaine

  • Naviguer entre les jours
  • Sélectionner une date via DatePicker
  • Ajouter une recette au midi
  • Ajouter une recette au soir
  • Ajouter une recette au matin
  • Changer une recette planifiée
  • Supprimer un repas planifié

🛒 Module Courses

  • Scanner un code-barre produit
  • Ajouter un produit à la liste
  • Cocher un article acheté
9. Intégration API OpenFoodFacts

Documentation de l'intégration de l'API externe

Endpoint utilisé

GET https://world.openfoodfacts.org/api/v0/product/{barcode}.json -- Exemple : GET https://world.openfoodfacts.org/api/v0/product/3017620422003.json

Réponse JSON (extraite)

{ "status": 1, // 1 = trouvé, 0 = non trouvé "product": { "product_name": "Nutella", "quantity": "400g", "nutrition_grades": "e" } }

Modèles de données Kotlin

Classe KotlinChamp JSONTypeDescription
OpenFoodFactsResponse.statusstatusInt1=trouvé, 0=introuvable
OpenFoodFactsResponse.productproductProduct?Objet produit (nullable)
Product.nomproduct_nameString?Nom du produit
Product.quantitequantityString?Quantité (ex: "400g")
Product.nutriscorenutrition_gradesString?Lettre A→E

Gestion des erreurs réseau

try { val response = RetrofitClient.api.getProduct(barcode) if (response.status == 1 && response.product != null) { // Produit trouvé → insertion en BDD } } catch (e: Exception) { // Pas de connexion, timeout, serveur indisponible // L'app ne crashe pas — l'erreur est loggée silencieusement e.printStackTrace() }
10. Stack technique

Toutes les technologies et bibliothèques utilisées

CatégorieTechnologieVersionRôle
LangageKotlin2.1.0Langage principal Android
IDEAndroid StudioMeerkat 2024.3Environnement de développement
BuildGradle8.11.1Gestion des dépendances et compilation
BuildAndroid Gradle Plugin8.9.1Plugin Android pour Gradle
BuildKSP2.1.0-1.0.29Génération de code Room à la compilation
BDD localeRoom2.6.1ORM SQLite Android (Jetpack)
ArchitectureViewModel2.7.0Survie aux rotations d'écran
ArchitectureLiveData2.7.0Données observables réactives
ArchitectureCoroutines1.7.3Asynchronisme (Dispatchers.IO)
UIRecyclerView1.3.2Listes scrollables performantes
UICardView1.0.0Cartes avec ombres et coins arrondis
UIMaterial Design1.11.0BottomNavigationView, FAB
UIConstraintLayout2.1.4Layouts flexibles et contraints
RéseauRetrofit2.9.0Client HTTP pour l'API REST
RéseauGson Converter2.9.0Désérialisation JSON → Kotlin
ScannerZXing Android Embedded4.3.0Scan code-barre via caméra
API externeOpenFoodFactsv0Base de données produits alimentaires
NavigationFragment + FragmentManager1.6.2Navigation entre les écrans
CuisineWeek · Documentation Technique v1.0 · BTS SIO SLAM 2025–2026