# đșïž 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