Ce projet est une plateforme web dédiée à la gestion des déchets, visant à connecter les particuliers et les entreprises dans une démarche écologique. L'objectif est de permettre aux utilisateurs de s'inscrire, gérer leurs profils, et interagir avec des fonctionnalités comme la localisation des points de collecte ou les signalements de déchets. Les entreprises sont des utilisateurs standards, non responsables des collectes, ce qui rend la plateforme inclusive.
Le backend utilise PHP natif avec une architecture MVC, stockant les données dans une base MySQL nommée waste_management
. Le frontend est prévu en ReactJS pour une interface fluide. Les notifications passent par Telegram via MadelineProto, une solution gratuite et robuste. L'authentification repose sur JWT (JSON Web Tokens) et une 2FA avec des OTP envoyés par Telegram (valables 5 minutes). Les utilisateurs fournissent des coordonnées (latitude
, longitude
) pour les cartes interactives, et un système de rate limiting protège l’API.
La plateforme est économique (open-source), sécurisée (Bcrypt, validation stricte), et testable avec curl ou Postman. Les futures évolutions incluront des signalements, des rappels Telegram, et une app mobile.
- PHP >= 8.0 avec
pdo_mysql
,gmp
. - MySQL >= 5.7.
- Composer pour les dépendances PHP.
- Node.js et npm pour ReactJS.
- Compte Telegram avec API ID et Hash (https://my.telegram.org).
- Serveur web (ex. :
php -S
pour dev).
waste_management/
├── backend/
│ ├── config/
│ │ └── .env
│ ├── controllers/
│ │ ├── AuthController.php
│ │ └── NotificationController.php
│ ├── models/
│ │ ├── Database.php
│ │ ├── CompteModel.php
│ │ ├── UtilisateurModel.php
│ │ ├── EntrepriseModel.php
│ │ ├── RateLimitModel.php
│ │ └── NotificationModel.php
│ ├── public/
│ │ └── index.php
│ ├── vendor/
│ └── session.madeline
├── frontend/
│ ├── src/
│ │ ├── components/
│ │ ├── pages/
│ │ └── App.js
│ ├── package.json
│ └── public/
└── README.md
--
### Dépendances Backend
```bash
composer require vlucas/phpdotenv danog/madelineproto firebase/php-jwt ramsey/uuid
## cloner le projet
```bash
git clone <url-du-repo>
cd waste_management
## creer l'environement virtuelle
```bash
cp backend/config/.env.example backend/config/.env
## cofugurer selon vous paramatre de conf
```bash
DB_HOST=localhost
DB_NAME=waste_management
DB_USER=root
DB_PASS=
TELEGRAM_API_ID=
TELEGRAM_API_HASH=
TELEGRAM_PHONE=
JWT_SECRET=
RATE_LIMIT_REQUESTS=10
RATE_LIMIT_WINDOW=120
OTP_EXPIRATION=300
## installer la base donnees
```bash
mysql -u root -p waste_management < backend/database.sql
## installer les dependance
```bash
cd backend
composer install
## excuter le projet
```bash
cd backend
php -S localhost:8000 -t public
## Endpoints API
Voici tous les endpoints créés, avec leur fonctionnement détaillé :
**1. POST /api/register**
* **Description :** Inscrit un nouvel utilisateur (particulier ou entreprise). Crée un compte avec statut inactif, génère un OTP, et l’envoie via Telegram au numéro fourni.
* **Paramètres (JSON) :**
* `email` (requis) : Email valide.
* `password` (requis) : Mot de passe (min. 8 caractères).
* `type_compte` (requis) : `particulier` ou `entreprise`.
* `telephone` (requis) : Numéro Telegram (ex. : +237674242450).
* **Pour particulier :**
* `nom` (requis).
* `prenom` (requis).
* `adresse` (optionnel).
* `quartier` (optionnel).
* `latitude` (optionnel).
* `longitude` (optionnel).
* `photo_profil` (optionnel).
* **Pour entreprise :**
* `nom_entreprise` (requis).
* `services_email` (requis).
* `services_nom` (optionnel).
* `services_prenom` (optionnel).
* `services_telephone` (optionnel).
* `quartier` (optionnel).
* `nif` (optionnel).
* `domaine_activite` (optionnel).
* `adresse` (optionnel).
* `latitude` (optionnel).
* `longitude` (optionnel).
* **Réponse :**
* `201 Created` : `{"message": "Compte créé, OTP envoyé", "compte_id": 1}`
* `400 Bad Request` : Données invalides/missing.
* `409 Conflict` : Email déjà utilisé.
* `429 Too Many Requests` : Rate limit dépassé.
* `500 Internal Server Error` : Erreur serveur.
* **Exemple :**
```bash
curl -X POST http://localhost:8000/api/register \
-H "Content-Type: application/json" \
-d '{
"email": "jules@ex.com",
"password": "password123",
"type_compte": "particulier",
"nom": "Jean",
"prenom": "Dupont",
"telephone": "+237674242450",
"latitude": 48.8566,
"longitude": 2.3522
}'
```
**2. POST /api/register/verify-otp**
* **Description :** Vérifie un OTP. Si valide, active le compte (`statut = actif`) et retourne un JWT.
* **Paramètres (JSON) :**
* `compte_id` (requis) : ID du compte.
* `otp_code` (requis) : Code OTP à 6 chiffres.
* **Réponse :**
* `200 OK` : `{"message": "OTP vérifié, compte activé", "token": "jwt_token"}`
* `400 Bad Request` : Données manquantes.
* `401 Unauthorized` : OTP invalide/expiré.
* `403 Forbidden` : Compte inactif.
* `404 Not Found` : Compte inexistant.
* `429 Too Many Requests` : Rate limit dépassé.
* `500 Internal Server Error` : Erreur serveur.
* **Exemple :**
```bash
curl -X POST http://localhost:8000/api/register/verify-otp \
-H "Content-Type: application/json" \
-d '{
"compte_id": 1,
"otp_code": "123456"
}'
```
**3. POST /api/register/resend-otp**
* **Description :** Renvoie un nouvel OTP à un utilisateur identifié par son numéro Telegram. Supprime les OTP existants et génère un nouveau code (valable 5 minutes).
* **Paramètres (JSON) :**
* `telephone` (requis) : Numéro Telegram.
* **Réponse :**
* `200 OK` : `{"message": "Nouvel OTP envoyé", "compte_id": 1}`
* `400 Bad Request` : Numéro invalide/manquant.
* `404 Not Found` : Utilisateur non trouvé.
* `429 Too Many Requests` : Rate limit dépassé.
* `500 Internal Server Error` : Erreur serveur.
* **Exemple :**
```bash
curl -X POST http://localhost:8000/api/register/resend-otp \
-H "Content-Type: application/json" \
-d '{
"telephone": "+237674242450"
}'
```
**4. POST /api/login**
* **Description :** Authentifie un utilisateur et envoie un OTP pour 2FA. Vérifie que le compte est actif.
* **Paramètres (JSON) :**
* `email` (requis) : Email.
* `password` (requis) : Mot de passe.
* `telephone` (requis) : Numéro Telegram.
* **Réponse :**
* `200 OK` : `{"message": "OTP envoyé pour 2FA", "compte_id": 1}`
* `400 Bad Request` : Données manquantes/invalides.
* `401 Unauthorized` : Identifiants incorrects.
* `403 Forbidden` : Compte inactif.
* `429 Too Many Requests` : Rate limit dépassé.
* `500 Internal Server Error` : Erreur serveur.
* **Exemple :**
```bash
curl -X POST http://localhost:8000/api/login \
-H "Content-Type: application/json" \
-d '{
"email": "jules@ex.com",
"password": "password123",
"telephone": "+237674242450"
}'
```
**5. POST /api/logout**
* **Description :** Déconnecte l’utilisateur (JWT invalidé côté client).
* **Réponse :**
* `200 OK` : `{"message": "Déconnexion réussie"}`
* `405 Method Not Allowed` : Méthode incorrecte.
* **Exemple :**
```bash
curl -X POST http://localhost:8000/api/logout
```
**6. GET /api/user**
* **Description :** Récupère le profil de l’utilisateur connecté. Nécessite un JWT valide.
* **En-tête :**
* `Authorization: Bearer jwt_token`
* **Réponse :**
* `200 OK` : Données du profil (utilisateur ou entreprise).
* `401 Unauthorized` : Token manquant/invalide.
* `403 Forbidden` : Compte inactif.
* `404 Not Found` : Profil non trouvé.
* `500 Internal Server Error` : Erreur serveur.
* **Exemple :**
```bash
curl -X GET http://localhost:8000/api/user \
-H "Authorization: Bearer jwt_token"
```
**7. PUT /api/user**
* **Description :** Met à jour le profil de l’utilisateur connecté.
* **En-tête :**
* `Authorization: Bearer jwt_token`
* **Paramètres (JSON) :**
* Champs optionnels : `email`, `telephone`, `nom`, `prenom`, etc., selon le type de compte.
* **Réponse :**
* `200 OK` : `{"message": "Profil mis à jour"}`
* `400 Bad Request` : Données invalides.
* `401 Unauthorized` : Token manquant/invalide.
* `403 Forbidden` : Compte inactif.
* `500 Internal Server Error` : Erreur serveur.
* **Exemple :**
```bash
curl -X PUT http://localhost:8000/api/user \
-H "Authorization: Bearer jwt_token" \
-H "Content-Type: application/json" \
-d '{
"nom": "Jean",
"telephone": "+237674242451"
}'
```
**8. PUT /api/user/telegram**
* **Description :** Lie un numéro Telegram au compte.
* **En-tête :**
* `Authorization: Bearer jwt_token`
* **Paramètres (JSON) :**
* `telephone` (requis) : Numéro Telegram.
* **Réponse :**
* `200 OK` : `{"message": "Compte Telegram lié"}`
* `400 Bad Request` : Numéro invalide/manquant.
* `401 Unauthorized` : Token manquant/invalide.
* `403 Forbidden` : Compte inactif.
* `500 Internal Server Error` : Erreur serveur.
* **Exemple :**
```bash
curl -X PUT http://localhost:8000/api/user/telegram \
-H "Authorization: Bearer jwt_token" \
-H "Content-Type: application/json" \
-d '{
"telephone": "+237674242451"
}'
```
**9. POST /api/notifications et GET /api/notifications**
* **Description :** Non implémentés (placeholders pour envoi/liste des notifications).
* **Réponse :**
* `501 Not Implemented` : `{"error": "Non implémenté"}`
* **Note :** Prévu pour gérer les rappels et signalements à l’avenir.
## Base de Données
La base `waste_management` contient 6 tables, définies dans `backend/database.sql` :
* **Comptes :** Stocke les comptes utilisateurs (`email`, `mot_de_passe`, `type`, `statut`).
* **Utilisateurs :** Profils des particuliers (`nom`, `telephone`, `coordonnées`).
* **Entreprises :** Profils des entreprises (`nom`, `services`, `coordonnées`).
* **Otps :** Codes OTP pour 2FA (`code`, `expiration`).
* **RateLimits :** Limite les requêtes par IP.
* **Notifications :** Historique des notifications envoyées.
## Sécurité
* **Mots de passe :** Hachés avec Bcrypt.
* **JWT :** Signé, expire après 24h.
* **2FA :** OTP envoyé via Telegram, valable 5 minutes.
* **Validation :** Email, téléphone (`+d{9,15}`), latitude/longitude.
* **Rate limiting :** 10 requêtes/120s par IP.
* **Nettoyage :** OTP expirés supprimés automatiquement.
## Tests
Utilise Postman ou curl pour tester les endpoints (voir exemples ci-dessus). Tous les endpoints sont protégés contre les abus et retournent des erreurs claires.
## Fonctionnalités Futures
* **Signalements :** Permettre aux utilisateurs de signaler des déchets.
* **Cartes interactives :** Afficher les points de collecte avec latitude/longitude.
* **Rappels Telegram :** Notifications planifiées via `/api/notifications`.
* **App mobile :** Étendre l’API pour iOS/Android.