Skip to content

đŸŽ” Plateforme full-stack d'analytics musicales avec recommandations personnalisĂ©es. MongoDB + NestJS + Next.js. IntĂ©gration Spotify, aggregation pipelines avancĂ©es, visualisations interactives.

Notifications You must be signed in to change notification settings

fabyan09/Statify

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

78 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Statify  Statify

Plateforme complÚte d'analytics musicales et de recommandations personnalisées, intégrant l'API Spotify et MongoDB pour une expérience musicale enrichie.

NestJS Next.js MongoDB TypeScript React


📋 Table des Matiùres


🎯 À propos

Statify est une application full-stack moderne de gestion et d'analyse musicale. Elle combine une interface web réactive avec une API REST puissante et une base de données MongoDB pour offrir :

  • 🎧 Gestion complĂšte de bibliothĂšque musicale (artistes, albums, tracks, playlists)
  • đŸ€– Moteur de recommandations personnalisĂ©es basĂ© sur les prĂ©fĂ©rences utilisateur
  • 📊 Tableaux de bord analytiques avec visualisations interactives
  • 🌐 RĂ©seau de collaborations entre artistes (focus rap français)
  • 🔍 Recherche full-text avancĂ©e avec filtres multiples
  • đŸŽ€ IntĂ©gration complĂšte avec l'API Spotify

Le projet met particuliĂšrement l'accent sur les requĂȘtes MongoDB avancĂ©es (aggregation pipelines, expressions complexes) et dĂ©montre une maĂźtrise approfondie des concepts de base de donnĂ©es NoSQL.


✹ FonctionnalitĂ©s

đŸŽ” Gestion Musicale

  • BibliothĂšque Utilisateur

    • Sauvegarder tracks, albums, et artistes favoris
    • Synchronisation avec Spotify
    • Gestion de playlists publiques/privĂ©es
    • Playlists collaboratives
  • Recherche AvancĂ©e

    • Recherche full-text case-insensitive
    • Filtres multi-critĂšres (genre, annĂ©e, popularitĂ©)
    • Recherche across 5 types de contenu (tracks, albums, artists, playlists, users)
    • Pagination et tri par pertinence

đŸ€– Recommandations Intelligentes

Moteur de recommandations avec 6 sections personnalisées :

  1. Artistes Similaires - Basé sur l'affinité de genres
  2. Albums de Labels Favoris - Découverte par label
  3. Sorties Récentes - Nouveautés de l'année en cours
  4. Tracks d'Artistes Similaires - Exploration approfondie
  5. Tracks Tendance - Popularité >= 70
  6. Albums Classiques - Par décennie préférée

Algorithme :

  • Analyse multi-dimensionnelle (genre, label, pĂ©riode, popularitĂ©)
  • Scoring personnalisĂ© basĂ© sur la bibliothĂšque utilisateur
  • Cache serveur avec TTL (1 heure)

📊 Analytics & Visualisations

1. Dashboard Principal

  • KPIs en temps rĂ©el (total artists, albums, tracks)
  • Top 10 artistes par popularitĂ©
  • Statistiques de bibliothĂšque utilisateur

2. Release Cohorts

  • Timeline des sorties par annĂ©e/mois
  • Distribution par type (album, single, compilation)
  • Évolution de la popularitĂ© moyenne

3. Label Lens

  • Statistiques par maison de disques
  • Nombre d'albums, tracks, popularitĂ© moyenne
  • Classement des labels les plus actifs

4. Collaboration Network

  • Graphe interactif force-directed
  • Visualisation des collaborations (focus rap français)
  • Top collaborations et statistiques dĂ©taillĂ©es
  • ParamĂštres ajustables (charge, distance, nombre de nƓuds)

🔐 Authentification & Utilisateurs

  • SystĂšme de comptes utilisateurs
  • Hashage de mots de passe (bcrypt)
  • Gestion de sessions via Context API
  • Routes protĂ©gĂ©es

🛠 Tech Stack

Frontend (Web)

Technologie Version Utilisation
Next.js 15.5.5 Framework React avec App Router & Turbopack
React 19.1.0 BibliothĂšque UI
TypeScript 5.x Typage statique
TanStack Query 5.90.3 Gestion d'état serveur & cache
Tailwind CSS 4.x Framework CSS utilitaire
Radix UI Latest Composants accessibles
Recharts 3.2.1 Graphiques & visualisations
react-force-graph-2d 1.29.0 Graphe de réseau interactif
Lucide React 0.545.0 IcĂŽnes
Motion 12.23.24 Animations

Backend (API)

Technologie Version Utilisation
NestJS 11.0.1 Framework Node.js structuré
TypeScript 5.7.3 Langage principal
MongoDB 8.19.1 Base de données NoSQL
Mongoose 11.0.3 ODM pour MongoDB
Cache Manager 7.2.4 SystÚme de cache en mémoire
bcrypt 6.0.0 Hashage de mots de passe
Spotify SDK 1.2.0 Intégration API Spotify

🏗 Architecture

┌──────────────────────────────────────────────────────────────┐
│                        Frontend (Next.js)                    │
│                         Port 3001                            │
│                                                              │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐      │
│  │ Dashboard│  │  Search  │  │ Discover │  │  Network │      │
│  └──────────┘  └──────────┘  └──────────┘  └──────────┘      │
│                                                              │
│  ┌──────────────────────────────────────────────────────┐    │
│  │          React Query (Cache & State)                 │    │
│  └──────────────────────────────────────────────────────┘    │
└───────────────────────┬──────────────────────────────────────┘
                        │
                        │ HTTP Requests
                        │
┌───────────────────────▌──────────────────────────────────────┐
│                      Backend (NestJS)                        │
│                         Port 3000                            │
│                                                              │
│  ┌─────────┐  ┌─────────┐  ┌──────────┐  ┌─────────────┐     │
│  │ Albums  │  │ Artists │  │  Tracks  │  │   Search    │     │
│  │ Module  │  │ Module  │  │  Module  │  │   Module    │     │
│  └─────────┘  └─────────┘  └──────────┘  └─────────────┘     │
│                                                              │
│  ┌─────────┐  ┌─────────┐  ┌──────────┐  ┌─────────────┐     │
│  │  Users  │  │Playlists│  │  Stats   │  │Recommenda-  │     │
│  │ Module  │  │ Module  │  │  Module  │  │tions Module │     │
│  └─────────┘  └─────────┘  └──────────┘  └─────────────┘     │
│                                                              │
│  ┌──────────────────────┐   ┌──────────────────────────┐     │
│  │   Cache Manager      │   │   Spotify Service        │     │
│  │   (In-Memory TTL)    │   │   (External API)         │     │
│  └──────────────────────┘   └──────────────────────────┘     │
└───────────────────────┬──────────────────────────────────────┘
                        │
                        │ Mongoose ODM
                        │
┌───────────────────────▌──────────────────────────────────────┐
│                       MongoDB Database                       │
│                                                              │
│  ┌─────────┐  ┌─────────┐  ┌──────────┐  ┌─────────────┐     │
│  │ Artists │  │ Albums  │  │  Tracks  │  │    Users    │     │
│  └─────────┘  └─────────┘  └──────────┘  └─────────────┘     │
│                                                              │
│  ┌─────────────────────────────────────────────────────┐     │
│  │               Playlists                             │     │
│  └─────────────────────────────────────────────────────┘     │
│                                                              │
│  ┌──────────────────────────────────────────────────────┐    │
│  │  Indexes: Text indexes, References, Unique fields    │    │
│  └──────────────────────────────────────────────────────┘    │
└──────────────────────────────────────────────────────────────┘

Flux de Données

  1. User Interaction → Frontend (Next.js)
  2. API Call → React Query (cache check)
  3. HTTP Request → Backend API (NestJS)
  4. Cache Check → Cache Manager (si applicable)
  5. Database Query → MongoDB via Mongoose
  6. Aggregation/Processing → NestJS Services
  7. Response → Frontend → UI Update

🚀 Installation

Prérequis

  • Node.js >= 18.x
  • npm >= 9.x
  • MongoDB >= 6.x (local ou Atlas)
  • Compte Spotify Developer (pour les credentials API)

1. Cloner le repository

git clone https://github.com/fabyan09/Statify.git
cd Statify

2. Configuration Backend

cd api
npm install

Créer un fichier .env à la racine de api/ :

# MongoDB
MONGO_URL=mongodb://localhost:27017/statify

# Spotify API
SPOTIFY_CLIENT_ID=your_spotify_client_id
SPOTIFY_CLIENT_SECRET=your_spotify_client_secret

# CORS
CORS_ORIGINS=http://localhost:3001,http://localhost:3000

# Port
PORT=3000

Obtenir les credentials Spotify :

  1. Aller sur Spotify Developer Dashboard
  2. Créer une nouvelle application
  3. Copier Client ID et Client Secret

3. Configuration Frontend

cd ../web
npm install

Créer un fichier .env.local à la racine de web/ :

NEXT_PUBLIC_API_URL=http://localhost:3000

4. Données initiales (optionnel)

Si vous avez des fichiers JSON dans /data, vous pouvez les importer :

# Exemple avec MongoDB Compass ou mongoimport
mongoimport --db statify --collection artists --file data/artists.json --jsonArray
mongoimport --db statify --collection albums --file data/albums.json --jsonArray
mongoimport --db statify --collection tracks --file data/tracks.json --jsonArray

đŸ’» Utilisation

Développement

Démarrer le Backend (port 3000)

cd api
npm run start:dev

Le serveur API démarre sur http://localhost:3000

Démarrer le Frontend (port 3001)

cd web
npm run dev

L'application web démarre sur http://localhost:3001

Production

Build Backend

cd api
npm run build
npm run start:prod

Build Frontend

cd web
npm run build
npm run start

Tests

# Backend - Tests unitaires
cd api
npm run test

# Backend - Couverture de tests
npm run test:cov

# Backend - Tests e2e
npm run test:e2e

📡 API Endpoints

Users

POST   /users                          Créer un compte
POST   /users/login                    Connexion
GET    /users/:id                      Profil utilisateur
GET    /users/:id/library              BibliothĂšque complĂšte
PUT    /users/:id/library/add          Ajouter Ă  la bibliothĂšque
PUT    /users/:id/library/remove       Retirer de la bibliothĂšque
PATCH  /users/:id                      Mettre Ă  jour le profil
DELETE /users/:id                      Supprimer le compte

Artists

GET    /artists                        Liste des artistes
GET    /artists/:id                    Détails d'un artiste
GET    /artists/:id/albums             Albums de l'artiste
GET    /artists/:id/tracks             Tracks de l'artiste
GET    /artists/search-spotify         Rechercher sur Spotify
POST   /artists/add-from-spotify       Importer depuis Spotify
POST   /artists/:id/sync-albums        Synchroniser les albums
POST   /artists                        Créer un artiste
PATCH  /artists/:id                    Mettre Ă  jour
DELETE /artists/:id                    Supprimer

Albums

GET    /albums                         Liste des albums
GET    /albums/:id                     Détails d'un album
GET    /albums/:id/tracks              Tracks de l'album
GET    /albums/analytics/cohorts       Statistiques par période
GET    /albums/analytics/labels        Statistiques par label
POST   /albums/:id/sync-tracks         Synchroniser les tracks Spotify
POST   /albums                         Créer un album
PATCH  /albums/:id                     Mettre Ă  jour
DELETE /albums/:id                     Supprimer

Tracks

GET    /tracks                         Liste des tracks (paginée)
GET    /tracks/:id                     Détails d'une track
POST   /tracks/by-ids                  Récupérer plusieurs tracks
POST   /tracks                         Créer une track
PATCH  /tracks/:id                     Mettre Ă  jour
DELETE /tracks/:id                     Supprimer

Search

GET    /search?q=query&type=TYPE&page=1&limit=20
       Types: tracks, albums, artists, playlists, users
       Filtres: minPopularity, maxPopularity, genre, year, fromYear, toYear

Playlists

GET    /playlists                      Liste des playlists
GET    /playlists/public               Playlists publiques
GET    /playlists/user/:userId         Playlists d'un utilisateur
GET    /playlists/:id                  Détails d'une playlist
GET    /playlists/:id/tracks           Tracks de la playlist
POST   /playlists                      Créer une playlist
PUT    /playlists/:id/tracks/add       Ajouter des tracks
PUT    /playlists/:id/tracks/remove    Retirer des tracks
PUT    /playlists/:id/tracks/reorder   Réordonner les tracks
PATCH  /playlists/:id                  Mettre Ă  jour
DELETE /playlists/:id                  Supprimer

Recommendations

GET    /recommendations/:userId        Recommandations personnalisées

Collaborations

GET    /collaborations?minCount=N      Réseau de collaborations

Statistics

GET    /stats/dashboard                Stats du dashboard
GET    /stats/artists/top?limit=10     Top artistes
GET    /stats/release-cohorts          Données de timeline
GET    /stats/labels                   Stats par label
GET    /stats/collaborations           Stats de collaborations

Documentation complÚte : Voir la collection Postman ou utiliser l'endpoint /api (si Swagger activé)


🗄 Base de DonnĂ©es

Schéma MongoDB

Le projet utilise 5 collections principales :

1. Artists

{
  _id: "spotify_id",              // String (Spotify ID)
  name: "Ninho",
  popularity: 85,                 // 0-100
  followers: 5234567,
  genres: ["french rap", "rap"],
  images: [{ url, height, width }],
  album_ids: ["album1", "album2"],
  ...
  spotify_synced: true
}

2. Albums

{
  _id: "spotify_id",
  name: "Destin",
  album_type: "album",            // album | single | compilation
  release_date: "2023-03-10",
  popularity: 78,
  label: "Rec. 118",
  artist_ids: ["artist1"],
  track_ids: ["track1", "track2"],
  genres: ["french rap"],
  spotify_synced: true
}

3. Tracks

{
  _id: "spotify_id",
  name: "VVS",
  album_id: "album_id",
  artist_ids: ["artist1", "artist2"],  // Collaborations
  duration_ms: 234567,
  popularity: 82,
  explicit: true,
  track_number: 5,
  disc_number: 1
}

4. Users

{
  _id: ObjectId,
  username: "user123",
  password: "$2b$10$...",          // Bcrypt hash
  liked_tracks: ["track1", "track2"],
  liked_albums: ["album1"],
  favorite_artists: ["artist1"],
  recommendations: {
    sections: [...],
    lastUpdated: Date
  }
}

5. Playlists

{
  _id: ObjectId,
  name: "Mes favoris",
  description: "Ma playlist préférée",
  owner_id: ObjectId,
  collaborators: [ObjectId],
  track_ids: ["track1", "track2"],
  isPublic: true,
  createdAt: Date,
  updatedAt: Date
}

Index Définis

  • Artists: Index textuel sur name + genres
  • Albums: Index textuel sur name
  • Tracks: Index textuel sur name
  • Users: Index textuel sur username (unique)
  • Playlists: Index textuel sur name + description

RequĂȘtes AvancĂ©es

Le projet implĂ©mente 15+ types de requĂȘtes MongoDB incluant :

  • ✅ CRUD de base
  • ✅ Recherche avec $regex case-insensitive
  • ✅ OpĂ©rateurs de comparaison ($gte, $lte, $in)
  • ✅ Expressions avec $expr, $size, $substr, $toInt
  • ✅ Aggregation pipelines complexes ($group, $project, $addFields)
  • ✅ Accumulateurs ($sum, $avg, $cond)
  • ✅ OpĂ©rations mathĂ©matiques ($divide, $round)
  • ✅ Jointures avec .populate()
  • ✅ Optimisations (.lean(), .select(), distinct())

Documentation détaillée : Voir /README_BDD.md


📾 Captures d'Ă©cran

Dashboard Principal

Dashboard Principal Vue d'ensemble avec statistiques globales et top artistes

Réseau de Collaborations

Réseau de Collaborations Graphe interactif des collaborations entre artistes (focus rap français)

Discover - Recommandations

Page Discover Recommandations personnalisées basées sur les préférences utilisateur

Release Cohorts Analytics

Release Cohorts Analyse temporelle des sorties d'albums avec graphiques interactifs


📚 Documentation

  • README_BDD.md - Documentation complĂšte sur l'aspect base de donnĂ©es MongoDB

    • RequĂȘtes avancĂ©es expliquĂ©es
    • Aggregation pipelines dĂ©taillĂ©es
    • Exemples de code annotĂ©s
    • Concepts MongoDB dĂ©montrĂ©s
  • Discover README - Documentation technique du moteur de recommandations

  • API Reference - Voir section API Endpoints


🎓 Contexte AcadĂ©mique

Ce projet a été réalisé dans le cadre d'un cours de Base de Données pour démontrer :

  • ✅ MaĂźtrise de MongoDB (NoSQL)
  • ✅ RequĂȘtes complexes et optimisĂ©es
  • ✅ Aggregation pipelines multi-Ă©tapes
  • ✅ ModĂ©lisation de donnĂ©es pour une application rĂ©elle
  • ✅ Architecture full-stack moderne
  • ✅ IntĂ©gration d'APIs externes (Spotify)

Points forts techniques :

  • 15+ types de requĂȘtes MongoDB diffĂ©rentes
  • 5 collections avec relations
  • Indexes textuels pour la recherche
  • Cache en mĂ©moire avec TTL
  • Recommandations personnalisĂ©es
  • Visualisations interactives

đŸ‘„ Contributeurs

About

đŸŽ” Plateforme full-stack d'analytics musicales avec recommandations personnalisĂ©es. MongoDB + NestJS + Next.js. IntĂ©gration Spotify, aggregation pipelines avancĂ©es, visualisations interactives.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •