Une plateforme moderne de gestion d'événements musicaux et d'artistes construite avec Next.js 15, Prisma 6 et PostgreSQL.
- 🎭 Gestion des artistes - Profils, images et descriptions
- 🎪 Gestion des événements - Concerts, showcases et événements acoustiques
- 🏪 Gestion des stands - Food, activités, tatouages, souvenirs et merch
- 🔔 Système de notifications - Rappels automatiques avant les événements
- 👥 Authentification - Système de connexion avec rôles utilisateur/admin
- 📧 Notifications par email - Envoi automatique de rappels
- 📱 Interface responsive - Optimisée pour tous les appareils
- 🗄️ Base de données robuste - PostgreSQL avec Prisma ORM
- Node.js 18+
- Docker et Docker Compose
- npm ou yarn
- Git
- Cloner le projet
git clone <votre-repo>
cd Pulse- Installer les dépendances
npm install- Configurer l'environnement
# Créer le fichier .env avec la configuration de base
echo 'DATABASE_URL="postgresql://postgres:postgres@localhost:5432/pulse?schema=public"' > .env
echo 'NODE_ENV="development"' >> .env
echo 'NEXTAUTH_SECRET="votre-secret-ici"' >> .env
echo 'NEXTAUTH_URL="http://localhost:3000"' >> .env- Vérifier que Docker est démarré
docker ps- Démarrer la base de données PostgreSQL
npm run docker:up- Vérifier que PostgreSQL répond sur le bon port
nc -zv localhost 5432- Générer le client Prisma
npm run db:generate- Synchroniser la base de données avec le schéma
npm run db:push- Tester Prisma Studio (optionnel)
npm run db:studio- Lancer le serveur de développement
npm run devVotre application sera accessible sur http://localhost:3000
- Gestion des utilisateurs avec authentification
- Rôles : USER et ADMIN
- Chiffrement des mots de passe avec bcrypt
- Profils d'artistes avec images et descriptions
- Relation avec les événements
- Événements musicaux avec dates, lieux et géolocalisation
- Types : CONCERT, ACCOUSTIQUE, SHOWCASE, OTHER
- Genres : RAP, RNB, REGGAE, ROCK
- Gestion des stands d'événements
- Types : FOOD, ACTIVITE, TATOOS, SOUVENIRS, MERCH
- Capacité et prix configurables
- Système de rappels automatiques
- Types : ONE_HOUR_BEFORE, TEN_MINUTES_BEFORE
- Intégration avec le planificateur de tâches
npm run db:generate- Générer le client Prismanpm run db:push- Pousser le schéma vers la basenpm run db:migrate- Créer et appliquer une migrationnpm run db:studio- Ouvrir Prisma Studionpm run db:reset- Réinitialiser la base de données
npm run docker:up- Démarrer PostgreSQLnpm run docker:down- Arrêter PostgreSQLnpm run docker:logs- Voir les logs
Pulse/
├── prisma/
│ ├── schema.prisma # Schéma de base de données
│ └── init/ # Données d'initialisation
├── src/
│ ├── app/ # Pages Next.js (App Router)
│ │ ├── admin/ # Interface d'administration
│ │ │ ├── artists/ # Gestion des artistes
│ │ │ ├── events/ # Gestion des événements
│ │ │ ├── users/ # Gestion des utilisateurs
│ │ │ └── notifications/ # Gestion des notifications
│ │ ├── api/ # API Routes
│ │ │ ├── auth/ # Authentification
│ │ │ ├── artists/ # API des artistes
│ │ │ ├── events/ # API des événements
│ │ │ ├── users/ # API des utilisateurs
│ │ │ ├── notifications/ # API des notifications
│ │ │ ├── upload/ # Upload de fichiers
│ │ │ └── cron/ # Tâches planifiées
│ │ ├── auth/ # Pages d'authentification
│ │ └── globals.css # Styles globaux
│ ├── components/ # Composants React réutilisables
│ │ ├── auth/ # Composants d'authentification
│ │ ├── providers/ # Providers React
│ │ └── ui/ # Composants UI
│ │ └── buttons/ # Boutons personnalisés
│ ├── generated/ # Client Prisma généré
│ └── lib/ # Utilitaires et configurations
│ ├── api-auth.ts # Configuration API
│ ├── auth.ts # Configuration NextAuth
│ ├── email.ts # Configuration email
│ ├── notificationScheduler.ts # Planificateur de notifications
│ └── prisma.ts # Instance Prisma
├── public/ # Assets statiques
│ └── assets/ # Images et fichiers
│ ├── artists/ # Images des artistes
│ └── events/ # Images des événements
├── types/ # Définitions TypeScript
├── docker-compose.yml # Configuration PostgreSQL
└── next.config.ts # Configuration Next.js
- Frontend : Next.js 15 avec App Router
- Backend : API Routes Next.js
- Base de données : PostgreSQL 16
- ORM : Prisma 6
- Authentification : NextAuth.js 4
- Styling : Tailwind CSS 4
- Langage : TypeScript 5
- Email : Nodemailer
- Planification : node-cron
- Upload : Multer
Créez un fichier .env à la racine du projet :
# Base de données
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/pulse?schema=public"
# Environnement
NODE_ENV="development"
# NextAuth
NEXTAUTH_SECRET=br+Y98g0wLbgVe4SF1BUkMPt13mCdxiche/fx6YNSw8
NEXTAUTH_URL="http://localhost:3000"
# Email (optionnel pour le développement)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_SECURE=false
SMTP_USER=arthurjfr.dev@gmail.com
SMTP_PASS=tajliozkqifmpzwj
SMTP_FROM=arthurjfr.dev@gmail.com- Gestion des artistes : CRUD complet avec upload d'images
- Gestion des événements : Création, modification et suppression
- Gestion des utilisateurs : Administration des comptes
- Système de notifications : Configuration des rappels automatiques
- Endpoints sécurisés avec authentification
- Upload de fichiers pour les images
- Validation des données avec Prisma
- Gestion des erreurs standardisée
- Rappels automatiques avant les événements
- Planification intelligente avec node-cron
- Envoi par email avec Nodemailer
- Interface de gestion dans l'admin
- NextAuth.js 4 avec stratégie JWT
- Chiffrement des mots de passe avec bcrypt (12 rounds)
- Gestion des sessions sécurisées
- Rôles utilisateur : USER et ADMIN
- Protection des routes avec middleware d'authentification
requireAdminAuth: Accès réservé aux administrateursrequireUserAuth: Accès pour utilisateurs connectés- Validation des tokens sur chaque requête protégée
- Gestion des erreurs 401/403 standardisées
NEXTAUTH_SECRET="secret-super-securise-minimum-32-caracteres"
NEXTAUTH_URL="http://localhost:3000"POST /api/auth/register- Création de compte (publique)POST /api/auth/login- Connexion via NextAuth (publique)GET/POST /api/auth/[...nextauth]- Gestion des sessions NextAuth
GET /api/artists- Liste des artistes (publique)POST /api/artists- Créer un artiste (admin uniquement)GET /api/artists/[id]- Détails d'un artiste (publique)PUT /api/artists/[id]- Modifier un artiste (admin uniquement)DELETE /api/artists/[id]- Supprimer un artiste (admin uniquement)
GET /api/events- Liste des événements avec filtres et pagination (publique)- Paramètres :
page,limit,search,genre,type,artist_id,upcoming
- Paramètres :
POST /api/events- Créer un événement (admin uniquement)- Validation : titre (min 3 chars), description (min 10 chars), date future, coordonnées GPS
GET /api/events/[id]- Détails d'un événement (publique)PUT /api/events/[id]- Modifier un événement (admin uniquement)DELETE /api/events/[id]- Supprimer un événement (admin uniquement)
GET /api/users- Liste des utilisateurs avec pagination et filtres (admin uniquement)- Paramètres :
page,limit,search,role,sortBy,sortOrder
- Paramètres :
POST /api/users- Créer un utilisateur (admin uniquement)- Validation : username (min 3 chars), email valide, password (min 6 chars)
GET /api/users/[id]- Détails d'un utilisateur (admin uniquement)PATCH /api/users/[id]- Modifier un utilisateur (admin uniquement)DELETE /api/users/[id]- Supprimer un utilisateur (admin uniquement)
POST /api/upload- Upload d'images pour artistes/événements (publique)- Types acceptés : images uniquement
- Taille max : 5MB
- Dossiers :
/public/assets/artists/et/public/assets/events/
GET /api/notifications- Liste des notifications (admin uniquement)POST /api/notifications- Créer une notification (admin uniquement)PUT /api/notifications/[id]- Modifier une notification (admin uniquement)DELETE /api/notifications/[id]- Supprimer une notification (admin uniquement)
POST /api/cron/start-scheduler- Démarrer le planificateur de notificationsPOST /api/cron/stop-scheduler- Arrêter le planificateur de notificationsGET /api/cron/status- Statut du planificateur
- 200 : Succès
- 201 : Ressource créée
- 400 : Erreur de validation
- 401 : Non authentifié
- 403 : Non autorisé (rôle insuffisant)
- 404 : Ressource non trouvée
- 409 : Conflit (doublon)
- 500 : Erreur interne du serveur
// Requête protégée admin
const response = await fetch('/api/artists', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
// Le token JWT est automatiquement inclus par NextAuth
},
body: JSON.stringify({
name: "Nouvel Artiste",
desc: "Description de l'artiste"
})
});
if (response.status === 401) {
// Rediriger vers la page de connexion
} else if (response.status === 403) {
// Utilisateur non autorisé
}- Validation côté serveur : Toutes les entrées sont validées avant traitement
- Protection contre l'injection SQL : Utilisation de Prisma ORM
- Chiffrement des mots de passe : Hachage bcrypt avec salt de 12 rounds
- Gestion des sessions : Tokens JWT sécurisés avec expiration
- Upload sécurisé : Validation des types et tailles de fichiers
- CORS : Configuration sécurisée des origines autorisées
- Séparation des responsabilités : Middleware d'authentification réutilisable
- Gestion d'erreurs centralisée : Codes HTTP standardisés et messages d'erreur clairs
- Validation des données : Règles métier appliquées côté serveur
- Logs de sécurité : Traçabilité des actions d'administration
- Protection des routes sensibles : Vérification systématique des rôles
-
Configurer la base de données
- Utiliser une base PostgreSQL externe (AWS RDS, Supabase, etc.)
- Mettre à jour
DATABASE_URLdans vos variables d'environnement
-
Variables d'environnement de production
NODE_ENV="production" NEXTAUTH_URL="https://votre-domaine.com" NEXTAUTH_SECRET="secret-production-securise"
-
Migration de la base de données
npm run db:migrate
-
Build de l'application
npm run build npm start
-
Connecter votre repository GitHub à Vercel
-
Configurer les variables d'environnement
-
Déployer automatiquement à chaque push
# Build de l'image
docker build -t pulse-app .
# Lancement
docker run -p 3000:3000 --env-file .env pulse-app# Linting
npm run lint
# Build de production
npm run build
# Démarrage en production
npm start
# Vérification des types TypeScript
npx tsc --noEmitPulse - Gestion moderne d'événements musicaux 🎵