# đŸ—ș Roadmap Application Legacy BricoLoc **Objectif** : CrĂ©er une rĂ©plique simplifiĂ©e mais fidĂšle de l'architecture monolithique existante de BricoLoc (2013-2025) pour dĂ©montrer les problĂ©matiques techniques et architecturales. **DurĂ©e** : 2 semaines (Semaines 3-4 du projet global) **Effort** : 40 heures **Stack technique** : Node.js, Express.js, EJS, SQLite, Sessions --- ## ïżœ État d'Avancement **DerniĂšre mise Ă  jour** : 28 Octobre 2025 | Phase | Statut | Progression | Temps estimĂ© | |-------|--------|-------------|--------------| | **Jour 1 - Setup Initial** | ✅ ComplĂ©tĂ© | 100% | 4h | | **Jour 2 - Authentification** | ✅ ComplĂ©tĂ© | 100% | 4h | | **Jour 3 - Catalogue** | ✅ ComplĂ©tĂ© | 100% | 4h | | **Jour 4 - RĂ©servations** | đŸ”Č Non commencĂ© | 0% | 4h | | **Jour 5 - Administration** | đŸ”Č Non commencĂ© | 0% | 4h | | **Jour 6 - UI/UX** | đŸ”Č Non commencĂ© | 0% | 4h | | **Jour 7 - Gestion Stocks** | đŸ”Č Non commencĂ© | 0% | 4h | | **Jour 8 - Calendrier** | đŸ”Č Non commencĂ© | 0% | 4h | | **Jour 9 - Features Secondaires** | đŸ”Č Non commencĂ© | 0% | 4h | | **Jour 10 - Tests & Docs** | đŸ”Č Non commencĂ© | 0% | 4h | **Progression globale** : đŸŸ©đŸŸ©đŸŸ©đŸŸ©đŸŸ©đŸŸ©âŹœâŹœâŹœâŹœ 30% (3/10 jours complĂ©tĂ©s) ### ✅ Ce qui est fait (Jours 1-3) **Jour 1 - Infrastructure** : - ✅ Structure complĂšte du projet (16 fichiers créés) - ✅ Configuration package.json et dĂ©pendances installĂ©es - ✅ Base de donnĂ©es SQLite initialisĂ©e (6 tables) - ✅ Scripts d'initialisation et de seeding fonctionnels - ✅ Templates EJS de base (layout, index, partials/messages) - ✅ CSS legacy old-school - ✅ Module database.js avec fonctions utilitaires - ✅ 2 utilisateurs de test créés (admin + standard) **Jour 2 - Authentification** : - ✅ Routes : `/login`, `/register`, `/logout` - ✅ Templates : `login.ejs`, `register.ejs` - ✅ Logique d'authentification avec sessions - ✅ Middleware `requireAuth` - ✅ **Bugs intentionnels** : mot de passe en clair, pas de CSRF, validation email **Jour 3 - Catalogue** : - ✅ 20 outils créés avec catĂ©gories, marques, descriptions - ✅ 10 entrepĂŽts dans diffĂ©rentes villes - ✅ 12 catĂ©gories d'outils - ✅ Stocks gĂ©nĂ©rĂ©s pour chaque outil/entrepĂŽt - ✅ Routes GET `/outils` et GET `/outils/:id` - ✅ Filtres : catĂ©gorie, recherche, prix min/max - ✅ Templates `outils.ejs` et `outil-detail.ejs` - ✅ CSS complet pour grille d'outils et fiches dĂ©tail - ✅ Partials header/footer rĂ©utilisables - ✅ **Bugs intentionnels** : SQL injection (BUG-003), N+1 queries (BUG-012), pas de pagination DB (BUG-011), logique dans templates (BUG-017) ### 🎯 Prochaine Ă©tape (Jour 4) **ImplĂ©menter le systĂšme de rĂ©servations** : - Routes : `/login`, `/register`, `/logout` - Templates : `login.ejs`, `register.ejs` - Logique d'authentification avec sessions - Middleware `requireAuth` - **Bugs intentionnels** : mot de passe en clair, pas de CSRF, validation email --- ## ïżœđŸ“‹ Contexte et Objectifs ### SystĂšme Actuel BricoLoc (Architecture ComplĂšte) **Architecture technique historique** : - **Frontend** : Java Spring Framework 5, Tomcat 8.5, services web SOAP - **Backend** : Java EE 6 (EJB, JPA), WebLogic Server 12c R1 - **Base de donnĂ©es** : Oracle 11g R2 (bricolocDB), MySQL 5 (cache) - **ÉcosystĂšme SI** : - ERP SAP Business One 9.X - Comparateur de prix SaaS (API REST) - Batch Java de synchronisation CSV nocturne - Client lourd C# pour gestion stocks entrepĂŽts - Power BI pour analytics - Outils Python d'analyse - **ProblĂšmes identifiĂ©s** : - "Grande boule de boue" (monolithe chaotique) - Logique mĂ©tier Ă©parpillĂ©e (backend, PL/SQL, frontend) - AccĂšs direct Ă  la DB depuis le frontend (contournement du backend) - Tables avec >150 colonnes - DĂ©rives architecturales depuis 2013 - Bugs et problĂšmes de performance - IncohĂ©rences majeures sur la gestion des stocks ### PĂ©rimĂštre de la RĂ©plique Legacy (Phase 1) > **🎯 Focus** : Application web B2C uniquement (MVP en 2 semaines) CrĂ©er une application **Node.js/Express** qui : 1. ✅ Reproduit les fonctionnalitĂ©s principales (catalogue, rĂ©servations, admin) 2. ✅ IntĂšgre **intentionnellement** les anti-patterns et bugs typiques 3. ✅ DĂ©montre les limites d'une architecture monolithique mal maintenue 4. ✅ Sert de point de comparaison avec l'application moderne **Ce qui EST inclus (Phase 1)** : - ✅ Application web B2C (frontend + backend monolithique) - ✅ Authentification et gestion utilisateurs - ✅ Catalogue d'outils avec filtres - ✅ SystĂšme de rĂ©servations - ✅ Gestion des stocks (simplifiĂ©e) - ✅ Interface admin (CRUD outils, stocks) - ✅ Architecture monolithique avec bugs intentionnels **Ce qui N'EST PAS inclus (Extensions futures)** : - ⏞ Backend sĂ©parĂ© avec services SOAP/REST - ⏞ Cache MySQL sĂ©parĂ© - ⏞ ProcĂ©dures PL/SQL (logique dans la DB) - ⏞ IntĂ©gration ERP (SAP Business One simulĂ©) - ⏞ Comparateur de prix externe (API) - ⏞ Batch de synchronisation CSV/Java - ⏞ Client lourd C# pour stocks entrepĂŽts - ⏞ Power BI / Analytics dashboard - ⏞ Vraie intĂ©gration Stripe (paiement) - ⏞ Chat support temps rĂ©el **Simplifications acceptĂ©es** : - Node.js au lieu de Java (plus accessible pour la dĂ©mo) - SQLite au lieu d'Oracle (simplicitĂ© de dĂ©ploiement) - Monolithe unique au lieu de frontend/backend sĂ©parĂ©s - Pas de services SOAP (architecture simplifiĂ©e) - Pas de cache MySQL sĂ©parĂ© (inutile pour la dĂ©mo) --- ## 🎯 FonctionnalitĂ©s Ă  ImplĂ©menter ### PĂ©rimĂštre Fonctionnel (MVP) | Module | FonctionnalitĂ©s | PrioritĂ© | |--------|-----------------|----------| | **Authentification** | Inscription, Connexion, Sessions | 🔮 Critique | | **Catalogue** | Liste des outils, DĂ©tails outil, Filtres basiques | 🔮 Critique | | **RĂ©servations** | CrĂ©er rĂ©servation, Voir mes rĂ©servations, Annuler | 🔮 Critique | | **Administration** | CRUD outils, Gestion stocks, Liste rĂ©servations | 🟠 Important | | **Chat Support** | Simulacre de chat (messages statiques) | 🟱 Nice-to-have | ### User Stories (7 US Principales) #### US-L01 : Inscription Utilisateur **En tant que** visiteur **Je veux** crĂ©er un compte **Afin de** pouvoir rĂ©server des outils **CritĂšres d'acceptation** : - ✅ Formulaire avec email, mot de passe, nom, prĂ©nom - ❌ **BUG** : Pas de validation format email - ❌ **BUG** : Mot de passe stockĂ© en clair dans la DB - ❌ **BUG** : Pas de confirmation de mot de passe - ✅ Redirection vers `/login` aprĂšs inscription #### US-L02 : Connexion Utilisateur **En tant que** utilisateur enregistrĂ© **Je veux** me connecter **Afin de** accĂ©der Ă  mon espace client **CritĂšres d'acceptation** : - ✅ Formulaire avec email et mot de passe - ✅ Session persistante (cookie) - ❌ **BUG** : Pas de protection CSRF - ❌ **BUG** : Messages d'erreur trop dĂ©taillĂ©s (fuite d'info) - ✅ Redirection vers `/outils` aprĂšs connexion #### US-L03 : Consulter le Catalogue **En tant que** visiteur ou utilisateur **Je veux** voir la liste des outils disponibles **Afin de** choisir un outil Ă  louer **CritĂšres d'acceptation** : - ✅ Liste paginĂ©e des outils (20 par page) - ✅ Filtres : catĂ©gorie, prix min/max, disponibilitĂ© - ❌ **BUG** : Pas de pagination cĂŽtĂ© serveur (tout chargĂ© en mĂ©moire) - ❌ **BUG** : RequĂȘte SQL vulnĂ©rable aux injections (filtres) - ✅ Affichage : nom, prix/jour, catĂ©gorie, image #### US-L04 : Consulter DĂ©tails d'un Outil **En tant que** visiteur ou utilisateur **Je veux** voir les dĂ©tails d'un outil **Afin de** dĂ©cider si je veux le rĂ©server **CritĂšres d'acceptation** : - ✅ Description complĂšte, prix, caractĂ©ristiques - ✅ Images de l'outil - ✅ Calendrier de disponibilitĂ© (si connectĂ©) - ❌ **BUG** : Calendrier n'affiche pas toutes les rĂ©servations (bug de calcul de dates) - ❌ **BUG** : Prix affichĂ© peut ĂȘtre incohĂ©rent avec le calcul final #### US-L05 : CrĂ©er une RĂ©servation **En tant que** utilisateur connectĂ© **Je veux** rĂ©server un outil pour des dates prĂ©cises **Afin de** l'utiliser pour mon projet **CritĂšres d'acceptation** : - ✅ Formulaire : date dĂ©but, date fin, entrepĂŽt de retrait - ✅ Calcul automatique du prix total - ❌ **BUG** : Pas de vĂ©rification de disponibilitĂ© rĂ©elle (race condition) - ❌ **BUG** : Double-booking possible - ❌ **BUG** : Prix calculĂ© cĂŽtĂ© client (manipulable) - ✅ Confirmation de rĂ©servation affichĂ©e #### US-L06 : Voir Mes RĂ©servations **En tant que** utilisateur connectĂ© **Je veux** voir l'historique de mes rĂ©servations **Afin de** suivre mes locations en cours et passĂ©es **CritĂšres d'acceptation** : - ✅ Liste des rĂ©servations (en cours, passĂ©es, annulĂ©es) - ✅ DĂ©tails : outil, dates, prix, statut, entrepĂŽt - ✅ Bouton "Annuler" (si rĂ©servation Ă  venir) - ❌ **BUG** : Annulation ne libĂšre pas le stock immĂ©diatement - ❌ **BUG** : Dates affichĂ©es avec timezone incorrect #### US-L07 : Administration des Outils (Admin) **En tant qu'** administrateur **Je veux** gĂ©rer le catalogue d'outils **Afin de** maintenir l'inventaire Ă  jour **CritĂšres d'acceptation** : - ✅ CRUD complet : CrĂ©er, Modifier, Supprimer des outils - ✅ Gestion des stocks par entrepĂŽt - ✅ Upload d'images - ❌ **BUG** : Pas de vĂ©rification des permissions (n'importe qui peut devenir admin) - ❌ **BUG** : Suppression d'outil ne vĂ©rifie pas les rĂ©servations actives - ❌ **BUG** : Interface admin accessible via URL directe sans authentification forte --- ## đŸ—ïž Architecture Technique DĂ©taillĂ©e ### Stack Technique ```yaml Runtime: Node.js 20+ Framework Web: Express.js 4.x Template Engine: EJS (Embedded JavaScript) Base de donnĂ©es: SQLite 3 Gestion de sessions: express-session + SQLite store Upload fichiers: multer SĂ©curitĂ©: AUCUNE (volontairement) Tests: AUCUN (volontairement) ``` ### Structure du Projet ``` apps/legacy-app/ ├── src/ │ ├── server.js # Point d'entrĂ©e, TOUT le code backend │ ├── database.js # Connexion SQLite + requĂȘtes │ ├── views/ # Templates EJS │ │ ├── layout.ejs # Layout principal │ │ ├── index.ejs # Page d'accueil │ │ ├── login.ejs # Connexion │ │ ├── register.ejs # Inscription │ │ ├── outils.ejs # Liste des outils │ │ ├── outil-detail.ejs # DĂ©tails d'un outil │ │ ├── reservations.ejs # Mes rĂ©servations │ │ ├── nouvelle-reservation.ejs # Formulaire rĂ©servation │ │ ├── admin/ │ │ │ ├── dashboard.ejs # Dashboard admin │ │ │ ├── outils.ejs # Gestion outils │ │ │ ├── stocks.ejs # Gestion stocks │ │ │ └── reservations.ejs # Liste rĂ©servations │ │ └── partials/ │ │ ├── header.ejs │ │ ├── footer.ejs │ │ └── messages.ejs # Flash messages │ ├── public/ # Assets statiques │ │ ├── css/ │ │ │ └── styles.css # CSS global (minimal, old-school) │ │ ├── js/ │ │ │ └── main.js # JavaScript client (jQuery style) │ │ └── images/ │ │ ├── logo.png │ │ └── outils/ # Images des outils │ └── uploads/ # Uploads dynamiques ├── docs/ │ ├── ROADMAP_LEGACY.md # Ce fichier │ ├── BUGS.md # Liste exhaustive des bugs │ └── ARCHITECTURE.md # SchĂ©ma de l'architecture ├── data/ │ ├── bricoloc.db # Base SQLite │ └── seeds/ │ ├── entrepots.sql │ ├── categories.sql │ ├── outils.sql │ └── users.sql ├── package.json └── README.md ``` ### ModĂšle de DonnĂ©es (SQLite) #### Table `users` ```sql CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, email TEXT NOT NULL UNIQUE, password TEXT NOT NULL, -- ❌ En clair ! nom TEXT NOT NULL, prenom TEXT NOT NULL, telephone TEXT, adresse TEXT, code_postal TEXT, ville TEXT, is_admin INTEGER DEFAULT 0, -- ❌ Pas de gestion de rĂŽles created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); ``` #### Table `categories` ```sql CREATE TABLE categories ( id INTEGER PRIMARY KEY AUTOINCREMENT, nom TEXT NOT NULL, description TEXT, slug TEXT UNIQUE ); ``` #### Table `entrepots` ```sql CREATE TABLE entrepots ( id INTEGER PRIMARY KEY AUTOINCREMENT, nom TEXT NOT NULL, ville TEXT NOT NULL, code_postal TEXT, adresse TEXT, telephone TEXT, email TEXT ); ``` #### Table `outils` ```sql CREATE TABLE outils ( id INTEGER PRIMARY KEY AUTOINCREMENT, nom TEXT NOT NULL, description TEXT, categorie_id INTEGER, prix_jour REAL NOT NULL, caution REAL, marque TEXT, modele TEXT, annee INTEGER, poids REAL, dimensions TEXT, puissance TEXT, image_url TEXT, restrictions_pro INTEGER DEFAULT 0, livraison_possible INTEGER DEFAULT 1, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (categorie_id) REFERENCES categories(id) ); ``` #### Table `stocks` (Anti-pattern : donnĂ©es dĂ©normalisĂ©es) ```sql CREATE TABLE stocks ( id INTEGER PRIMARY KEY AUTOINCREMENT, outil_id INTEGER NOT NULL, entrepot_id INTEGER NOT NULL, quantite_totale INTEGER NOT NULL, quantite_disponible INTEGER NOT NULL, -- ❌ CalculĂ© manuellement, source de bugs last_updated DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (outil_id) REFERENCES outils(id), FOREIGN KEY (entrepot_id) REFERENCES entrepots(id) ); ``` #### Table `reservations` ```sql CREATE TABLE reservations ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, outil_id INTEGER NOT NULL, entrepot_id INTEGER NOT NULL, date_debut DATE NOT NULL, date_fin DATE NOT NULL, prix_total REAL NOT NULL, -- ❌ CalculĂ© cĂŽtĂ© client statut TEXT DEFAULT 'en_attente', -- en_attente, confirmee, annulee, terminee mode_paiement TEXT, -- en_ligne, entrepot paiement_effectue INTEGER DEFAULT 0, notes TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(id), FOREIGN KEY (outil_id) REFERENCES outils(id), FOREIGN KEY (entrepot_id) REFERENCES entrepots(id) ); ``` --- ## 🐛 Bugs et Anti-Patterns Intentionnels ### Liste des 15+ Bugs Ă  ImplĂ©menter | ID | CatĂ©gorie | Description | Impact | Fichier | |----|-----------|-------------|--------|---------| | **BUG-001** | SĂ©curitĂ© | Mot de passe en clair dans DB | 🔮 Critique | `database.js` | | **BUG-002** | SĂ©curitĂ© | Pas de protection CSRF | 🔮 Critique | `server.js` | | **BUG-003** | SĂ©curitĂ© | SQL Injection sur filtres | 🔮 Critique | `server.js` (route `/outils`) | | **BUG-004** | SĂ©curitĂ© | Admin accessible sans auth forte | 🔮 Critique | `server.js` (middleware) | | **BUG-005** | SĂ©curitĂ© | Upload fichiers non sĂ©curisĂ© | 🟠 ÉlevĂ© | `server.js` (multer) | | **BUG-006** | Validation | Pas de validation format email | 🟠 ÉlevĂ© | `server.js` (POST `/register`) | | **BUG-007** | Validation | Prix calculĂ© cĂŽtĂ© client | 🔮 Critique | `nouvelle-reservation.ejs` | | **BUG-008** | Logique | Race condition sur rĂ©servations | 🔮 Critique | `server.js` (POST `/reservations`) | | **BUG-009** | Logique | Double-booking possible | 🔮 Critique | `server.js` (vĂ©rification dispo) | | **BUG-010** | Logique | Annulation ne libĂšre pas le stock | 🟠 ÉlevĂ© | `server.js` (DELETE `/reservations/:id`) | | **BUG-011** | Performance | Pas de pagination DB | 🟠 ÉlevĂ© | `server.js` (GET `/outils`) | | **BUG-012** | Performance | RequĂȘtes N+1 | 🟠 ÉlevĂ© | `server.js` (boucles imbriquĂ©es) | | **BUG-013** | UX | Messages d'erreur trop dĂ©taillĂ©s | 🟡 Moyen | `login.ejs` | | **BUG-014** | UX | Dates avec timezone incorrect | 🟡 Moyen | `reservations.ejs` | | **BUG-015** | Code | Code dupliquĂ© partout | 🟠 ÉlevĂ© | `server.js` (>1000 lignes) | | **BUG-016** | Code | Pas de gestion d'erreurs try/catch | 🟠 ÉlevĂ© | `server.js` (global) | | **BUG-017** | Architecture | Logique mĂ©tier dans les vues EJS | 🔮 Critique | `outils.ejs`, `reservations.ejs` | | **BUG-018** | Architecture | Tout dans un seul fichier | 🔮 Critique | `server.js` (monolithe) | **Documentation complĂšte** : Voir [`BUGS.md`](./BUGS.md) --- ## 📅 Planning DĂ©taillĂ© (2 Semaines) ### Semaine 3 : Backend + FonctionnalitĂ©s Principales (20h) #### ✅ Jour 1 (Lundi) - Setup Initial (4h) - COMPLÉTÉ **TĂąches** : 1. ✅ Initialiser le projet Node.js ```bash cd apps/legacy-app npm init -y npm install express ejs express-session sqlite3 multer express-flash connect-sqlite3 ``` 2. ✅ CrĂ©er la structure de fichiers ```bash mkdir -p src/views/{admin,partials} src/public/{css,js,images/outils} src/uploads data/seeds docs ``` 3. ✅ Configurer `server.js` (fichier principal monolithique) - ✅ Setup Express + EJS - ✅ Configuration sessions (cookie-based, pas de JWT) - ✅ Middleware basique (body-parser, static) - **BUG-002** : Pas de helmet, pas de CSRF protection 4. ✅ CrĂ©er `database.js` - ✅ Connexion SQLite - ✅ Fonctions utilitaires (query, run, all) - ✅ **BUG-001** : Fonction `createUser()` stocke mot de passe en clair 5. ✅ CrĂ©er le schĂ©ma de base de donnĂ©es ```bash npm run db:init # Script créé et fonctionnel npm run db:seed # 2 utilisateurs de test créés ``` **Livrables** : - ✅ Serveur Express structure créée (server.js placeholder) - ✅ Base SQLite initialisĂ©e avec schĂ©ma complet (6 tables) - ✅ Structure de fichiers complĂšte (16 fichiers créés) - ✅ Templates EJS : layout.ejs, index.ejs, partials/messages.ejs - ✅ CSS legacy old-school (styles.css) - ✅ Scripts d'initialisation DB fonctionnels **Statut** : ✅ **JOUR 1 COMPLÉTÉ** - Structure complĂšte opĂ©rationnelle **Prochaine Ă©tape** : Jour 2 - ImplĂ©menter l'authentification complĂšte (routes + logique) --- #### ✅ Jour 2 (Mardi) - Authentification (4h) - COMPLÉTÉ **User Stories** : US-L01, US-L02 **TĂąches** : 1. ✅ CrĂ©er les routes d'authentification ```javascript // server.js app.get('/login', (req, res) => { ... }); app.post('/login', (req, res) => { ... }); app.get('/register', (req, res) => { ... }); app.post('/register', (req, res) => { ... }); app.get('/logout', (req, res) => { ... }); ``` 2. ✅ CrĂ©er les templates EJS - ✅ `views/login.ejs` : formulaire de connexion avec layout complet - ✅ `views/register.ejs` : formulaire d'inscription avec tous les champs - ✅ `views/layout.ejs` : layout principal (dĂ©jĂ  créé) - ✅ `views/index.ejs` : mise Ă  jour avec layout complet - ✅ Navigation dynamique selon statut login 3. ✅ ImplĂ©menter la logique d'authentification - ✅ VĂ©rification email/password (en clair) - ✅ CrĂ©ation de session (stockage user_id dans SQLite store) - ✅ **BUG-006** : Pas de validation format email - ✅ **BUG-013** : Messages d'erreur dĂ©taillĂ©s ("Email introuvable" vs "Mot de passe incorrect") 4. ✅ CrĂ©er le middleware d'authentification ```javascript function requireAuth(req, res, next) { if (!req.session.userId) { return res.redirect('/login'); } next(); } // ❌ BUG-004 : Pas de middleware requireAdmin sĂ©parĂ© ``` **Livrables** : - ✅ Inscription fonctionnelle (avec bugs intentionnels) - ✅ Connexion fonctionnelle (avec bugs intentionnels) - ✅ Sessions persistantes avec SQLite store - ✅ Logout qui dĂ©truit la session - ✅ Menu de navigation dynamique (connectĂ©/non connectĂ©) - ✅ Lien "Administration" visible pour les admins **Tests manuels effectuĂ©s** : - ✅ CrĂ©er un compte test@test.com → ✅ Inscrit correctement - ✅ Se connecter avec admin@bricoloc.fr → ✅ Session créée - ✅ VĂ©rifier menu admin → ✅ Lien "Administration" visible - ✅ VĂ©rifier DB → ✅ Mot de passe en clair confirmĂ© (BUG-001) - ✅ Session persiste entre les requĂȘtes → ✅ Cookie valide 7 jours **Statut** : ✅ **JOUR 2 COMPLÉTÉ** - Authentification fonctionnelle avec bugs intentionnels **Prochaine Ă©tape** : Jour 3 - ImplĂ©menter le catalogue d'outils avec filtres --- #### đŸ”Č Jour 3 (Mercredi) - Catalogue d'outils (4h) - À FAIRE **Statut** : ⏞ **À FAIRE** - Prochaine Ă©tape du dĂ©veloppement --- #### đŸ”Č Jour 3 (Mercredi) - Catalogue (4h) - NON COMMENCÉ **User Stories** : US-L03, US-L04 **TĂąches** : 1. đŸ”Č Seeder les donnĂ©es de test ```bash sqlite3 data/bricoloc.db < data/seeds/entrepots.sql sqlite3 data/bricoloc.db < data/seeds/categories.sql sqlite3 data/bricoloc.db < data/seeds/outils.sql ``` 2. ✅ CrĂ©er les routes catalogue ```javascript app.get('/outils', (req, res) => { ... }); // Liste app.get('/outils/:id', (req, res) => { ... }); // DĂ©tails ``` 3. ✅ ImplĂ©menter la liste des outils - Query SQL avec JOIN categories - Filtres : catĂ©gorie, prix min/max, disponibilitĂ© - **BUG-003** : SQL Injection via paramĂštres de filtre - **BUG-011** : Pas de pagination, tout chargĂ© en mĂ©moire - **BUG-012** : RequĂȘte N+1 pour les stocks 4. ✅ CrĂ©er les templates - `views/outils.ejs` : grille d'outils - `views/outil-detail.ejs` : fiche dĂ©taillĂ©e - **BUG-017** : Calculs de disponibilitĂ© dans le template EJS 5. ✅ CSS basique old-school - `public/css/styles.css` : styles annĂ©es 2010 - Pas de responsive design - Tables pour layout (anti-pattern) **Livrables** : - ✅ Page catalogue fonctionnelle - ✅ Page dĂ©tail outil avec images - ✅ Filtres fonctionnels (mais vulnĂ©rables) **Tests manuels** : - [ ] Injecter SQL dans filtre catĂ©gorie : `?categorie=1' OR '1'='1` → ✅ Fonctionne - [ ] Charger 500+ outils → ✅ Lenteur visible --- #### Jour 4 (Jeudi) - RĂ©servations (4h) **User Stories** : US-L05, US-L06 **TĂąches** : 1. ✅ CrĂ©er les routes rĂ©servations ```javascript app.get('/outils/:id/reserver', requireAuth, (req, res) => { ... }); app.post('/reservations', requireAuth, (req, res) => { ... }); app.get('/mes-reservations', requireAuth, (req, res) => { ... }); app.post('/reservations/:id/annuler', requireAuth, (req, res) => { ... }); ``` 2. ✅ ImplĂ©menter la crĂ©ation de rĂ©servation - Formulaire : dates, entrepĂŽt - **BUG-007** : Prix total calculĂ© cĂŽtĂ© client (JavaScript) - **BUG-008** : Pas de transaction SQL (race condition) - **BUG-009** : VĂ©rification de disponibilitĂ© incomplĂšte 3. ✅ ImplĂ©menter la liste des rĂ©servations - Query avec JOIN outils, entrepots - **BUG-012** : RequĂȘte N+1 encore - **BUG-014** : Dates affichĂ©es avec mauvais timezone 4. ✅ ImplĂ©menter l'annulation - Update statut = 'annulee' - **BUG-010** : Ne met pas Ă  jour `stocks.quantite_disponible` 5. ✅ CrĂ©er les templates - `views/nouvelle-reservation.ejs` : formulaire avec calendrier - `views/reservations.ejs` : liste des rĂ©servations **Livrables** : - ✅ RĂ©servation fonctionnelle - ✅ Historique des rĂ©servations - ✅ Annulation fonctionnelle (mais buguĂ©e) **Tests manuels** : - [ ] CrĂ©er 2 rĂ©servations simultanĂ©es pour le mĂȘme outil → ✅ Double-booking - [ ] Annuler une rĂ©servation → ✅ Stock pas libĂ©rĂ© - [ ] Modifier le prix total dans le formulaire (DevTools) → ✅ AcceptĂ© --- #### Jour 5 (Vendredi) - Administration Basique (4h) **User Stories** : US-L07 (partiel) **TĂąches** : 1. ✅ CrĂ©er les routes admin ```javascript app.get('/admin', requireAuth, (req, res) => { ... }); app.get('/admin/outils', requireAuth, (req, res) => { ... }); app.post('/admin/outils', requireAuth, (req, res) => { ... }); app.post('/admin/outils/:id/supprimer', requireAuth, (req, res) => { ... }); ``` 2. ✅ ImplĂ©menter CRUD outils - Formulaire crĂ©ation/Ă©dition - Upload d'image (multer) - **BUG-005** : Pas de validation du type de fichier - **BUG-004** : Pas de vĂ©rification `is_admin` 3. ✅ CrĂ©er les templates admin - `views/admin/dashboard.ejs` : page d'accueil admin - `views/admin/outils.ejs` : gestion des outils 4. ✅ Seed un utilisateur admin ```sql INSERT INTO users (email, password, nom, prenom, is_admin) VALUES ('admin@bricoloc.fr', 'admin123', 'Admin', 'BricoLoc', 1); ``` **Livrables** : - ✅ Interface admin accessible (sans protection) - ✅ CRUD outils fonctionnel - ✅ Upload d'images fonctionnel (non sĂ©curisĂ©) **Tests manuels** : - [ ] AccĂ©der Ă  `/admin` sans ĂȘtre admin → ✅ AccĂšs autorisĂ© - [ ] Uploader un fichier `.php` → ✅ AcceptĂ© - [ ] Supprimer un outil avec rĂ©servations actives → ✅ Pas de vĂ©rification --- ### Semaine 4 : Frontend, Gestion Stocks, Finitions (20h) #### Jour 6 (Lundi) - AmĂ©lioration UI/UX (4h) **TĂąches** : 1. ✅ CrĂ©er le CSS "old-school" ```css /* public/css/styles.css */ body { font-family: Arial, sans-serif; background: #f0f0f0; } table { width: 100%; border-collapse: collapse; } /* ❌ Pas de responsive, pas de flexbox/grid */ ``` 2. ✅ Ajouter JavaScript cĂŽtĂ© client (jQuery-style) ```javascript // public/js/main.js $(document).ready(function() { // Calcul prix rĂ©servation (BUG-007) $('#date_debut, #date_fin').change(function() { var prixJour = parseFloat($('#prix_jour').val()); var nbJours = calculerNbJours(); $('#prix_total').val(prixJour * nbJours); // ❌ Manipulable }); }); ``` 3. ✅ AmĂ©liorer les templates existants - Ajouter flash messages (succĂšs, erreurs) - Menu de navigation avec Ă©tat connectĂ©/dĂ©connectĂ© - Breadcrumb basique 4. ✅ CrĂ©er la page d'accueil - `views/index.ejs` : landing page simple - Liste des catĂ©gories populaires - Section "Comment ça marche" **Livrables** : - ✅ Interface utilisateur basique mais complĂšte - ✅ Page d'accueil informative - ✅ Navigation cohĂ©rente --- #### Jour 7 (Mardi) - Gestion Stocks (4h) **User Stories** : US-L07 (complet) **TĂąches** : 1. ✅ CrĂ©er les routes gestion stocks ```javascript app.get('/admin/stocks', requireAuth, (req, res) => { ... }); app.post('/admin/stocks/:id/update', requireAuth, (req, res) => { ... }); ``` 2. ✅ ImplĂ©menter la logique de stocks - Affichage stocks par entrepĂŽt - Modification manuelle des quantitĂ©s - **BUG-010** : IncohĂ©rence avec les rĂ©servations actives 3. ✅ CrĂ©er le template - `views/admin/stocks.ejs` : tableau de gestion - Formulaire de modification en ligne 4. ✅ ImplĂ©menter la vĂ©rification de disponibilitĂ© ```javascript function checkAvailability(outilId, dateDebut, dateFin, entrepotId) { // ❌ BUG-009 : Logique incomplĂšte, ne vĂ©rifie pas toutes les conditions const query = ` SELECT quantite_disponible FROM stocks WHERE outil_id = ? AND entrepot_id = ? `; // Ne prend pas en compte les rĂ©servations en conflit } ``` **Livrables** : - ✅ Interface de gestion des stocks - ✅ Mise Ă  jour manuelle des quantitĂ©s - ✅ VĂ©rification de disponibilitĂ© (buguĂ©e) --- #### Jour 8 (Mercredi) - Calendrier DisponibilitĂ©s (4h) **TĂąches** : 1. ✅ ImplĂ©menter le calendrier sur la page dĂ©tail outil - Affichage des dates dĂ©jĂ  rĂ©servĂ©es - SĂ©lection de plage de dates - **BUG-014** : ProblĂšmes de timezone 2. ✅ Ajouter bibliothĂšque de calendrier (ex: flatpickr) ```html ``` 3. ✅ JavaScript pour bloquer les dates indisponibles ```javascript flatpickr("#date_debut", { disable: reservedDates, // ❌ BUG : Liste incomplĂšte minDate: "today" }); ``` 4. ✅ AmĂ©liorer le formulaire de rĂ©servation - SĂ©lection entrepĂŽt - Calcul prix dynamique (cĂŽtĂ© client, BUG-007) - RĂ©capitulatif avant validation **Livrables** : - ✅ Calendrier de rĂ©servation fonctionnel - ✅ ExpĂ©rience utilisateur amĂ©liorĂ©e - ✅ Bugs de dates documentĂ©s --- #### Jour 9 (Jeudi) - Features Secondaires (4h) **TĂąches** : 1. ✅ ImplĂ©menter la recherche d'outils ```javascript app.get('/recherche', (req, res) => { const q = req.query.q; // ❌ BUG-003 : SQL Injection possible const query = `SELECT * FROM outils WHERE nom LIKE '%${q}%'`; }); ``` 2. ✅ Ajouter pagination (cĂŽtĂ© client seulement) ```javascript // ❌ BUG-011 : Tout chargĂ© en mĂ©moire puis paginĂ© en JS const allOutils = await db.all('SELECT * FROM outils'); res.render('outils', { outils: allOutils }); // Pas de LIMIT ``` 3. ✅ CrĂ©er une page "Mes informations" - Affichage des donnĂ©es utilisateur - Formulaire de modification (non fonctionnel) 4. ✅ Ajouter un simulacre de chat support - Messages statiques prĂ©dĂ©finis - Formulaire de contact (ne fait rien) **Livrables** : - ✅ Recherche fonctionnelle (vulnĂ©rable) - ✅ Pagination cĂŽtĂ© client - ✅ Pages secondaires complĂštes --- #### Jour 10 (Vendredi) - Tests Manuels & Documentation (4h) **TĂąches** : 1. ✅ Tests manuels exhaustifs - Parcourir tous les scĂ©narios utilisateur - Reproduire tous les bugs identifiĂ©s - Documenter les comportements anormaux 2. ✅ RĂ©diger `docs/BUGS.md` - Liste exhaustive des 18+ bugs - Instructions de reproduction - Captures d'Ă©cran si nĂ©cessaire - Explications des impacts 3. ✅ RĂ©diger `docs/ARCHITECTURE.md` - SchĂ©ma de l'architecture monolithique - Flux de donnĂ©es - Points de friction identifiĂ©s 4. ✅ Mettre Ă  jour `README.md` - Instructions d'installation - Commandes de lancement - Comptes de test (admin + utilisateur standard) - Liste des fonctionnalitĂ©s 5. ✅ CrĂ©er un seed complet ```bash npm run seed # Script qui remplit la DB avec donnĂ©es de test ``` **Livrables** : - ✅ Application testĂ©e manuellement - ✅ Documentation complĂšte (BUGS.md, ARCHITECTURE.md) - ✅ README.md Ă  jour - ✅ DonnĂ©es de test complĂštes --- ## 📊 MĂ©triques Cibles (Application Legacy) ### MĂ©triques de QualitĂ© (Volontairement Basses) | MĂ©trique | Cible | MĂ©thode de Mesure | |----------|-------|-------------------| | **Lighthouse Performance** | < 60 | Chrome DevTools | | **Lighthouse Best Practices** | < 70 | Chrome DevTools | | **Lighthouse SEO** | < 80 | Chrome DevTools | | **Tests Coverage** | 0% | Aucun test | | **ComplexitĂ© Cyclomatique** | > 20 | ESLint plugin | | **Code Duplication** | > 30% | jscpd | | **Lignes de code (server.js)** | > 1000 | wc -l | | **Nombre de bugs identifiĂ©s** | > 15 | Documentation manuelle | | **Time to Interactive (TTI)** | > 5s | Lighthouse | ### MĂ©triques Fonctionnelles (SuccĂšs) | MĂ©trique | Cible | |----------|-------| | **User Stories implĂ©mentĂ©es** | 7/7 | | **FonctionnalitĂ©s principales** | 100% | | **Pages créées** | 12+ | | **Templates EJS** | 15+ | | **Routes Express** | 20+ | --- ## 🎯 CritĂšres de SuccĂšs ### CritĂšres de ComplĂ©tion - ✅ **7 User Stories** complĂštement implĂ©mentĂ©es et fonctionnelles - ✅ **18+ bugs** identifiĂ©s, implĂ©mentĂ©s et documentĂ©s - ✅ **Application dĂ©ployable** localement sans erreur - ✅ **Documentation complĂšte** (BUGS.md, ARCHITECTURE.md, README.md) - ✅ **DonnĂ©es de test** (seed complet avec 50+ outils, 10 entrepĂŽts, 5 utilisateurs) - ✅ **UI old-school** mais cohĂ©rente et navigable ### CritĂšres de QualitĂ© (Intentionnellement Bas) - ✅ **Aucun test** automatisĂ© - ✅ **Fichier monolithique** server.js > 1000 lignes - ✅ **VulnĂ©rabilitĂ©s de sĂ©curitĂ©** multiples - ✅ **Performance mĂ©diocre** (temps de chargement > 3s) - ✅ **Code legacy authentique** (duplication, pas de patterns) --- ## 🚀 DĂ©marrage Rapide ### Installation ```bash cd apps/legacy-app npm install ``` ### Initialisation de la base de donnĂ©es ```bash npm run db:init # CrĂ©e le schĂ©ma npm run db:seed # Remplit avec donnĂ©es de test ``` ### Lancement du serveur ```bash npm start # Production npm run dev # DĂ©veloppement (nodemon) ``` ### AccĂšs Ă  l'application - **URL** : `http://localhost:3000` - **Compte admin** : `admin@bricoloc.fr` / `admin123` - **Compte utilisateur** : `jean.dupont@email.fr` / `password123` --- ## 📚 Ressources et RĂ©fĂ©rences ### Technologies UtilisĂ©es - [Express.js Documentation](https://expressjs.com/) - [EJS Documentation](https://ejs.co/) - [SQLite Documentation](https://www.sqlite.org/docs.html) - [Multer (File Upload)](https://github.com/expressjs/multer) - [express-session](https://github.com/expressjs/session) ### Inspiration Architecture Legacy - Article : [Big Ball of Mud](http://www.laputan.org/mud/) - Article : [Monolith to Microservices](https://martinfowler.com/articles/break-monolith-into-microservices.html) - VidĂ©o : [Legacy Code Patterns](https://www.youtube.com/watch?v=...) --- --- ## 🔼 Extensions Futures (Phases 2-3) > Ces fonctionnalitĂ©s reproduisent plus fidĂšlement l'Ă©cosystĂšme SI complet de BricoLoc. > Elles peuvent ĂȘtre ajoutĂ©es aprĂšs la Phase 1 pour enrichir la dĂ©mo. ### Phase 2 : Backend SĂ©parĂ© & IntĂ©grations (Optionnel - +20h) **Objectif** : Reproduire l'architecture frontend/backend sĂ©parĂ©e avec services SOAP/REST | Extension | Description | Effort | PrioritĂ© | |-----------|-------------|--------|----------| | **Backend API sĂ©parĂ©** | Extraire la logique mĂ©tier dans un service Node.js sĂ©parĂ© (SOAP ou REST) | 8h | 🟠 Moyenne | | **Cache MySQL** | Ajouter une base MySQL pour cache (photos, docs) | 3h | 🟱 Basse | | **ProcĂ©dures SQL** | Migrer une partie de la logique en procĂ©dures stockĂ©es SQLite | 4h | 🟡 Moyenne | | **Batch de synchronisation** | Script Node.js simulant la synchro CSV nocturne des stocks | 5h | 🟠 Moyenne | **Valeur ajoutĂ©e** : - DĂ©montre les problĂšmes de couplage frontend/backend - Illustre la complexitĂ© des services web SOAP legacy - Montre les difficultĂ©s de synchronisation de donnĂ©es --- ### Phase 3 : ÉcosystĂšme Complet (Optionnel - +30h) **Objectif** : Simuler l'intĂ©gration avec les systĂšmes externes (ERP, comparateur, analytics) | Extension | Description | Effort | PrioritĂ© | |-----------|-------------|--------|----------| | **Mock ERP (SAP B1)** | API REST simulant l'ERP avec donnĂ©es de stocks | 6h | 🟱 Basse | | **Comparateur de prix** | Service externe (API) pour comparaison prix outils | 5h | 🟱 Basse | | **Client lourd stocks** | Application Electron (ou CLI) pour gestion stocks entrepĂŽts | 8h | 🟡 Moyenne | | **Dashboard Analytics** | Page simple avec graphiques (Chart.js) simulant Power BI | 4h | 🟱 Basse | | **Vraie intĂ©gration Stripe** | Paiement fonctionnel avec webhooks | 4h | 🟠 Moyenne | | **Chat temps rĂ©el** | Socket.io pour chat support en temps rĂ©el | 3h | 🟱 Basse | **Valeur ajoutĂ©e** : - Reproduit la complexitĂ© d'un SI avec multiples systĂšmes - DĂ©montre les problĂšmes d'intĂ©gration et de cohĂ©rence des donnĂ©es - Illustre les dĂ©pendances entre systĂšmes legacy --- ### Roadmap d'Extensions (Si Temps Disponible) ```mermaid gantt title Extensions Legacy (Optionnel) dateFormat YYYY-MM-DD section Phase 1 (MVP) App Web B2C :done, phase1, 2025-10-28, 2w section Phase 2 Backend API sĂ©parĂ© :crit, phase2a, after phase1, 8d Cache MySQL :phase2b, after phase1, 3d ProcĂ©dures SQL :phase2c, after phase2a, 4d Batch synchronisation :phase2d, after phase2b, 5d section Phase 3 Mock ERP :phase3a, after phase2, 6d Comparateur de prix :phase3b, after phase2, 5d Client lourd stocks :phase3c, after phase3a, 8d Dashboard Analytics :phase3d, after phase3b, 4d Stripe intĂ©gration :phase3e, after phase3c, 4d Chat temps rĂ©el :phase3f, after phase3d, 3d ``` --- **DĂ©cision** : Phase 1 uniquement pour ce projet (2 semaines). Phases 2-3 documentĂ©es pour rĂ©fĂ©rence future. --- ## 🔄 Prochaines Étapes AprĂšs complĂ©tion de l'application Legacy (Semaine 4) : 1. **Semaine 5** : DĂ©marrage Application Moderne (Setup Next.js + Supabase) 2. **Semaine 6** : Auth Service (Clean Architecture) 3. **Semaine 7-8** : Catalogue & Inventory Services 4. **Semaine 9** : Reservation & Payment Services 5. **Semaine 10** : Comparaison et PrĂ©sentation --- **DerniĂšre mise Ă  jour** : Octobre 2025 **Prochaine rĂ©vision** : Fin Semaine 4 **Statut** : đŸ”” En cours de planification