Ce document fournit la documentation de l’API REST pour le projet Ecodrop.
L’API Ecodrop est accessible via deux domaines différents pointant vers le même serveur :
Afin de tester les fonctionnalités réservées aux administrateurs, il est nécessaire de se connecter via GitLab en utilisant l’une des adresses e-mail suivantes :
philippe.mathieu@univ-lille.frjonas.facon.etu@univ-lille.fredi.hamiti.etu@univ-lille.frLe projet utilise un système d’authentification déléguée basé sur le protocole OAuth2. Nous ne stockons pas de mots de passe ; l’identité des utilisateurs est vérifiée par des fournisseurs de confiance (GitLab, Discord, Google, GitHub).
/auth/token) avec un
Authorization Code.Authorization: Bearer <token> pour chaque
requête protégée.sequenceDiagram
participant Client
participant API as API Ecodrop
participant DB as Base de données
participant Provider as OAuth Provider
Client->>Provider: 1. Demande d'autorisation (Login)
Provider-->>Client: 2. Redirection vers callback avec Code
Client->>API: 3. Appel /auth/token?code=...
API->>Provider: 4. Échange Code contre Access Token
Provider-->>API: 5. Retourne Access Token
API->>Provider: 6. Demande infos utilisateur (email, pseudo)
Provider-->>API: 7. Retourne infos utilisateur
API->>DB: 8. Vérifie/Crée l'utilisateur & récupère son rôle
DB-->>API: 9. Utilisateur (id, role)
API-->>Client: 10. Retourne JWT interne signé
Le SecurityFilter de l’API applique les règles suivantes
:
| Méthode | Endpoint | Accès |
|---|---|---|
GET |
(tous sauf exception) | Public |
GET |
/points/overloaded |
ADMIN |
POST |
/deposits |
USER / ADMIN |
DELETE |
(tous) | ADMIN |
POST, PUT,
PATCH |
(autres) | ADMIN |
Pour garantir la stabilité du service, une limitation de débit est appliquée sur l’ensemble des endpoints de l’API :
429 Too Many Requests.Les endpoints listant plusieurs ressources (points de collecte, dépôts, utilisateurs, etc.) supportent la pagination via deux paramètres de requête optionnels :
limit : Nombre maximum de résultats à
retourner.
offset : Nombre de résultats à sauter
avant de commencer à retourner les données.
Exemple d’utilisation :
/ecodrop/users/leaderboard?limit=5&offset=10
L’API supporte les formats JSON (par défaut) et XML pour les échanges de données.
POST,
PUT, PATCH) : Spécifiez le format dans le
header Content-Type (ex: application/json ou
application/xml).GET) :
Spécifiez le format souhaité dans le header Accept (ex:
application/json ou application/xml).Le schéma suivant représente l’organisation des données dans l’application.
classDiagram
direction BT
class Users {
int id PK
string login
string role
}
class WasteType {
int id PK
string nom
int pointsPerKilo
}
class CollectionPoint {
int id PK
string adresse
int capaciteMax
}
class Accepts {
int pointid FK
int wastetypeid FK
}
class Deposit {
int id PK
int userid FK
int pointid FK
int wastetypeid FK
int poids
datetime dateDepot
boolean collected
}
CollectionPoint "1" --> "0..*" Deposit : pointid
Users "1" --> "0..*" Deposit : userid
WasteType "1" --> "0..*" Deposit : wastetypeid
CollectionPoint "1" --> "0..*" Accepts : pointid
WasteType "1" --> "0..*" Accepts : wastetypeid
Récupère les utilisateurs et leur nombre total de points par ordre décroissant.
SELECT Users.login, SUM(Deposit.poids * WasteType.pointsPerKilo) AS totalPoints
FROM Users
JOIN Deposit ON Users.id = Deposit.userId
JOIN WasteType ON Deposit.wasteTypeId = WasteType.id
GROUP BY Users.id, Users.login
ORDER BY totalPoints DESC
LIMIT ? OFFSET ?Récupère la capacité maximale et le poids total actuel des dépôts non collectés pour un point donné.
SELECT cp.capaciteMax, COALESCE(SUM(d.poids), 0) AS totalWeight
FROM CollectionPoint cp
LEFT JOIN Deposit d ON d.pointid = cp.id AND d.collected IS FALSE
WHERE cp.id = ?
GROUP BY cp.id, cp.capaciteMaxIdentifie les points de collecte dont le taux de remplissage dépasse 80% de leur capacité maximale.
SELECT cp.id, cp.adresse, cp.capaciteMax, COALESCE(SUM(d.poids), 0) AS totalPoids
FROM CollectionPoint cp
LEFT JOIN Deposit d ON d.pointid = cp.id AND d.collected IS FALSE
GROUP BY cp.id, cp.adresse, cp.capaciteMax
HAVING cp.capaciteMax > 0 AND (COALESCE(SUM(d.poids), 0) * 100.0 / cp.capaciteMax) > 80