đŸŽ” SwipeZ API

API .NET 8 permettant d’authentifier un utilisateur via Spotify OAuth2 PKCE, de rĂ©cupĂ©rer ses playlists, de gĂ©rer ses prĂ©fĂ©rences et de stocker/cache les donnĂ©es utilisĂ©es par l’application mobile SwipeZ.


🚀 Introduction

SwipeZ est une application mobile qui simplifie la gestion des playlists musicales en offrant une expérience intuitive pour conserver ou supprimer des morceaux par un simple swipe.
L’API que vous consultez ici fournit toutes les fonctionnalitĂ©s serveur nĂ©cessaires Ă  l’application : authentification sĂ©curisĂ©e avec Spotify, rĂ©cupĂ©ration des playlists, gestion de sessions et cache.

đŸ‘„ Équipe

Martin LEMOIGNE ‱ Maxime CHARLET ‱ Guilhem BARRIQUAND ‱ Mathis DE SOUSA ‱ Victor LESUEUR ‱ Maxence TEIXEIRA


đŸ—ïž Architecture gĂ©nĂ©rale

Schéma global

!Schéma d'architecture SwipeZ

  • L’application Flutter se connecte Ă  Spotify pour authentifier l’utilisateur via OAuth2 PKCE.
  • L’API reçoit les jetons, crĂ©e une session sĂ©curisĂ©e et stocke les informations en base.
  • Les playlists de l’utilisateur sont mises en cache pour rĂ©duire les appels Ă  l’API Spotify.
  • L’utilisateur peut ensuite sĂ©lectionner, modifier ou vider ses prĂ©fĂ©rences de playlists.

Modules principaux

  • Authentification PKCE OAuth2 : dĂ©marre l’autorisation Spotify, gĂšre le retour callback, stocke refresh/access tokens.
  • Sessions & sĂ©curitĂ© : gestion du cycle de vie via APPSESSION, purge au logout, denylist des refresh tokens.
  • Gestion des playlists : import par pages (PLAYLISTCACHE), lien session/cache (PLAYLISTCACHE_SESSION), sĂ©lection personnalisĂ©e (PLAYLISTSELECTION).
  • Logs & suivi : AUDITLOG enregistre les actions clĂ©s pour audit et dĂ©bogage.

⚙ Installation & exĂ©cution locale

Prérequis

Cloner le projet

git clone https://github.com/S5-C1-Exodia/webservice.git
cd webservice/API

Configuration

Renommer ou compléter appsettings.json à partir de appsettings.Development.json :

{
  "ConnectionStrings": {
    "Default": "Server=localhost;Port=3306;Database=swipezdb;Uid=root;Pwd=;"
  },
  "Spotify": {
    "ClientId": "<votre_client_id>",
    "RedirectUri": "https://<votre_ngrok_ou_domaine>/api/spotify/callback",
    "AuthorizeEndpoint": "https://accounts.spotify.com/authorize",
    "TokenEndpoint": "https://accounts.spotify.com/api/token",
    "BaseUrl": "https://api.spotify.com/v1",
    "PlaylistsPageSize": 50
  },
  "Deeplink": {
    "SchemeHost": "swipez://oauth-callback/spotify"
  },
  "Security": {
    "PkceTtlMinutes": 10,
    "SessionTtlMinutes": 60
  }
}

Variables clés :

Clé Description
ConnectionStrings.Default Connexion MySQL
Spotify.ClientId Clé fournie par Spotify Developers
Spotify.RedirectUri URL de callback OAuth Spotify
Deeplink.SchemeHost Lien profond pour ouvrir l’application mobile
Security.PkceTtlMinutes Durée de validité du challenge PKCE
Security.SessionTtlMinutes Durée de vie des sessions

Lancer l’API

dotnet restore
dotnet run

Par dĂ©faut l’API dĂ©marre sur https://localhost:5001 (ou un port libre selon ta config).


🚀 DĂ©ploiement (structure)

(Section à compléter lors de la mise en production)

  • Reverse proxy (Caddy / Nginx)
  • HTTPS (certificats Let’s Encrypt)
  • Dockerfile / CI-CD (GitHub Actions, pipelines)
  • Variables secrĂštes gĂ©rĂ©es via environnement
  • Logs & monitoring (AuditLog)

đŸ—„ïž Base de donnĂ©es

L’API s’appuie sur MySQL 8.4 et la base swipezdb.

Chaque table et sa fonction sont dĂ©crites dans đŸ—„ïž Base de donnĂ©es SwipeZ.

Résumé rapide :

  • APPSESSION : sessions utilisateur
  • TOKENSET : jetons OAuth long terme
  • ACCESSTOKEN : jeton d’accĂšs Spotify en cours
  • PLAYLISTCACHE & PLAYLISTCACHE_SESSION : cache des playlists et lien par session
  • PLAYLISTSELECTION : playlists choisies
  • USERPROFILECACHE : profil utilisateur Spotify
  • PKCEENTRY & DENYLISTEDREFRESH : sĂ©curitĂ© OAuth
  • AUDITLOG : traçabilitĂ©

🌐 Endpoints de l’API

1ïžâƒŁ Authentification

Méthode Endpoint Description
POST /api/spotify/auth/start DĂ©marre le flux OAuth2 PKCE et retourne l’URL Spotify + state.
GET /api/spotify/callback Callback Spotify : Ă©change code ↔ tokens, crĂ©ation session, redirection vers deeplink.
POST /api/spotify/logout DĂ©connecte l’utilisateur et purge la session.

Exemple — Start Auth

POST /api/spotify/auth/start
Content-Type: application/json

{
  "scopes": ["playlist-read-private", "playlist-modify-private"]
}

Réponse :

{
  "authorizationUrl": "https://accounts.spotify.com/authorize?...",
  "state": "a1b2c3d4"
}

2ïžâƒŁ Playlists

Méthode Endpoint Description
GET /api/spotify/playlists RécupÚre les playlists (pagination via X-Page-Token).
GET /api/spotify/playlist-preferences Liste les playlists sélectionnées.
GET /api/playlists/{playlist_id}/tracks Liste les playlists sélectionnées.
PUT /api/spotify/playlist-preferences Remplace complÚtement la sélection de playlists.
PATCH /api/spotify/playlist-preferences/add Ajoute des playlists à la sélection.
PATCH /api/spotify/playlist-preferences/remove Retire des playlists de la sélection.
DELETE /api/spotify/playlist-preferences Supprime toutes les préférences.

Exemple — RĂ©cupĂ©ration playlists

GET /api/spotify/playlists
X-Session-Id: 9c92a6e3-2ed1-41e3-bb64-5db26cfb5f3f

Réponse :

{
  "items": [
    {
      "playlistId": "37i9dQZF1DXcBWIGoYBM5M",
      "name": "Today's Top Hits",
      "owner": { "displayName": "Spotify" },
      "images": [{ "url": "https://i.scdn.co/image/..." }],
      "tracksCount": 50
    }
  ],
  "nextPageToken": "abc123"
}

Exemple — Modifier prĂ©fĂ©rences

PUT /api/spotify/playlist-preferences
X-Session-Id: 9c92a6e3-2ed1-41e3-bb64-5db26cfb5f3f
Content-Type: application/json

{
  "playlistIds": ["37i9dQZF1DXcBWIGoYBM5M"]
}

Réponse : 204 No Content


🔒 SĂ©curitĂ©

  • OAuth2 PKCE : gĂ©nĂ©ration code_verifier & code_challenge, validation state, Ă©change code → tokens.
  • Sessions : créées Ă  chaque callback, TTL configurable (60 min par dĂ©faut).
  • Refresh token denylist : empĂȘche la rĂ©utilisation aprĂšs logout.
  • Audit & logs : toutes les actions critiques sont inscrites dans AUDITLOG.
  • HTTPS recommandĂ© pour toute utilisation en production.

✅ Tests

  • Frameworks : xUnit, Moq pour mocks.
  • Tests unitaires : sur Helpers, Managers, Services.
  • Tests d’intĂ©gration : scripts Python (connexion, dĂ©connexion, playlists).
  • Lancer les tests :
dotnet test

Pour les tests d’intĂ©gration Python :

cd Tests/Integration
pip install -r requirements.txt
python connexion.py

đŸ€ Contribution

  • Forkez le repo puis crĂ©ez une branche : git checkout -b feature/ma-feature
  • Commit conventionnel (ex. feat(auth): ajout d’un endpoint refresh token)
  • Pull request vers la branche main
  • Tests Ă  jour avant tout merge

📜 Licence

(À insĂ©rer — ex. MIT adaptĂ© projet scolaire, ou mention IUT Dijon propriĂ©taire pĂ©dagogique)


🔎 Ressources utiles