Un framework Node.js progressif pour construire des applications serveur efficaces et évolutives.
Ce projet est un système de gestion de cinéma développé avec Nest, un framework TypeScript pour Node.js. Il permet de gérer l'ensemble des opérations d'un cinéma, de la programmation des films à la gestion des réservations.
Module d'Authentification
Module de Gestion des Films
Module de Réservation
Module de Notification
Fonctionnels
Non-Fonctionnels
Microservices vs Monolithe
Base de Données
API Design
Performance
Sécurité
Maintenabilité
Court Terme
Moyen Terme
Long Terme
NestJS a été choisi pour ce projet car il offre une architecture similaire à Angular, permettant ainsi un développement full-stack cohérent. Les deux frameworks partagent :
Le frontend de l'application est développé avec Angular et est disponible dans un repository séparé : angular-cinema
Les deux projets (NestJS et Angular) peuvent être déployés ensemble en utilisant Docker Compose :
# Backend NestJS
git clone https://github.com/BernabeLaurent/nestjs-cinema
# Frontend Angular
git clone https://github.com/BernabeLaurent/angular-cinema
Configurer les variables d'environnement :
.env.docker
en .env
dans les deux projetsLancer avec Docker Compose :
# Depuis le projet NestJS
docker-compose up -d
Les services seront disponibles sur :
Le projet utilise GitHub Actions pour automatiser le processus de build et de déploiement.
Déclencheurs
main
main
Étapes du Workflow
name: Deploy
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# Configuration de l'environnement
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
# Installation des dépendances
- name: Install dependencies
run: npm ci
# Tests
- name: Run tests
run: npm run test
# Build
- name: Build
run: npm run build
# Déploiement
- name: Deploy to production
if: github.ref == 'refs/heads/main'
run: |
docker-compose -f docker-compose.prod.yml up -d
Développement
develop
Staging
staging
Production
main
En cas de problème, le rollback est automatique :
Le backend NestJS est configuré pour accepter les requêtes du frontend Angular :
Example :// Configuration CORS dans main.ts
app.enableCors({
origin: process.env.ALLOWED_ORIGINS?.split(',') || [
'http://localhost:4200', // Angular en développement
'http://localhost:3000', // NestJS en développement
],
methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH'],
credentials: true,
allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'],
exposedHeaders: ['Content-Range', 'X-Content-Range'],
maxAge: 3600,
});
Le frontend Angular utilise un service HTTP dédié pour communiquer avec le backend :
Example :// Exemple de service Angular
@Injectable({
providedIn: 'root'
})
export class ApiService {
private apiUrl = environment.apiUrl;
constructor(private http: HttpClient) {}
// Exemple de requête authentifiée
getMovies(): Observable<ApiResponse<Movie[]>> {
return this.http.get<ApiResponse<Movie[]>>(`${this.apiUrl}/movies`);
}
}
Les réponses suivent un format standardisé :
Example :interface ApiResponse<T> {
data: T;
apiVersion: string;
timestamp: string;
}
Pour les fonctionnalités en temps réel :
Example :// Configuration WebSocket dans NestJS
@WebSocketGateway({
cors: {
origin: process.env.ALLOWED_ORIGINS?.split(',') || ['http://localhost:4200'],
credentials: true
}
})
Sécurité
Performance
Maintenance
Développement
🎬 Gestion des films
🎭 Gestion des salles
📅 Programmation des séances
🎟️ Réservations
👥 Gestion des utilisateurs
🔔 Notifications
Le projet implémente plusieurs couches de sécurité pour protéger les données et les utilisateurs :
git clone [URL_DU_REPO]
cd nestjs-cinema
# Renommer le fichier .env.docker en .env
cp .env.docker .env
# Configurer les variables d'environnement dans le fichier .env
# - DATABASE_URL
# - JWT_SECRET
# - REDIS_URL
# - SMTP_CONFIG
npm install
# Mode développement
npm run start:dev
# Mode production
npm run start:prod
Le fichier .env
doit contenir les variables suivantes :
# Environnement (dev, production, test, staging)
NODE_ENV=dev
# Ports
NESTJS_PORT=3000
ANGULAR_PORT=4200
API_VERSION=1.0.0
# Configuration PostgreSQL
DATABASE_PORT=5432
DATABASE_PASSWORD=votre_mot_de_passe
DATABASE_HOST=localhost
DATABASE_NAME=cinema_db
DATABASE_USER=postgres
# Configuration des tokens JWT
JWT_SECRET=votre_secret_jwt
JWT_TOKEN_AUDIENCE=cinema-api
JWT_TOKEN_ISSUER=cinema-app
JWT_ACCESS_TOKEN_TTL=3600 # Durée de vie du token d'accès (en secondes)
JWT_REFRESH_TOKEN_TTL=86400 # Durée de vie du token de rafraîchissement (en secondes)
# Configuration OAuth Google
GOOGLE_CLIENT_ID=votre_client_id
GOOGLE_CLIENT_SECRET=votre_client_secret
# Configuration SMTP pour les notifications
SMTP_HOST=smtp.example.com
SMTP_PORT=587
SMTP_USER=votre_email
SMTP_PASSWORD=votre_mot_de_passe
SMTP_FROM=noreply@cinema.com
# Origines autorisées (séparées par des virgules)
ALLOWED_ORIGINS=http://localhost:4200,http://localhost:3000
# Clé API pour The Movie Database
PROFILE_API_KEY=votre_cle_api_tmdb
.env
dans le repositoryLa documentation complète du projet, incluant la gestion de projet, les spécifications et le suivi, est disponible sur Notion : Documentation du Projet Cinéma
Cette documentation inclut :
La documentation technique complète du projet est disponible de deux manières :
Pour générer et consulter la documentation en local :
Example :# Générer la documentation
npm run compodoc
# La documentation sera disponible à l'adresse : http://localhost:8080/documentation
La documentation est également accessible en ligne à l'adresse : api.bernabe.codes/documentation
Cette documentation inclut :
uploads/
uploads/
├── movies/ # Affiches des films
├── cast/ # Photos du casting
└── profiles/ # Photos de profil utilisateurs
GET /movie/upcoming
- Prochaines sorties
GET /movie/{id}
- Détails d'un film
GET /movie/{id}/credits
- Casting
GET /movie/{id}/videos
- Bandes-annonces
GET /search/movie
- Recherche de filmsGET /configuration
- Configuration de l'APIInformations de base
Médias
Casting
Toutes les réponses de l'API suivent un format standardisé :
Example :{
"data": [
// Données de la réponse
],
"apiVersion": "1.0.0",
"timestamp": "2024-03-20T10:30:00Z"
}
{
"data": [
{
"id": 123,
"title": "Nom du Film",
"releaseDate": "2024-03-20",
"posterPath": "/path/to/poster.jpg"
}
],
"apiVersion": "1.0.0",
"timestamp": "2024-03-20T10:30:00Z"
}
{
"data": {
"id": 123,
"title": "Nom du Film",
"overview": "Description du film...",
"cast": [...],
"videos": [...]
},
"apiVersion": "1.0.0",
"timestamp": "2024-03-20T10:30:00Z"
}
Un diagramme complet de la structure de la base de données PostgreSQL est disponible en ligne : Diagramme de la Base de Données
Ce diagramme inclut :
Dans le dossier bdd/
, vous trouverez :
.tdm
)Un exemple de transaction est fourni pour illustrer :
-- Exemple de transaction
CREATE OR REPLACE FUNCTION make_booking(...)
.tdm
avec Toad Data Modeler# Configuration MongoDB (à ajouter dans .env)
MONGODB_URI=mongodb://localhost:27017/cinema_logs
MONGODB_DB=cinema_logs
src/
├── auth/ # Authentification et autorisation
├── bookings/ # Gestion des réservations
├── common/ # Utilitaires et configurations communes
├── config/ # Configuration de l'application
├── movies/ # Gestion des films
├── notifications/ # Système de notifications
├── sessions-cinemas/ # Gestion des séances
├── theaters/ # Gestion des salles
└── users/ # Gestion des utilisateurs
GET /movies
- Liste des filmsGET /movies/:id
- Détails d'un filmPOST /movies
- Ajouter un filmPUT /movies/:id
- Mettre à jour un filmDELETE /movies/:id
- Supprimer un filmGET /theaters
- Liste des sallesGET /theaters/:id
- Détails d'une sallePOST /theaters
- Ajouter une sallePUT /theaters/:id
- Mettre à jour une salleGET /sessions
- Liste des séancesGET /sessions/:id
- Détails d'une séancePOST /sessions
- Créer une séancePUT /sessions/:id
- Mettre à jour une séanceGET /bookings
- Liste des réservationsPOST /bookings
- Créer une réservationGET /bookings/:id
- Détails d'une réservationDELETE /bookings/:id
- Annuler une réservationCe manuel détaille l'utilisation de l'API du système de gestion de cinéma. L'API est RESTful et utilise JSON comme format d'échange de données.
POST /auth/login
Content-Type: application/json
{
"email": "utilisateur@example.com",
"password": "motdepasse"
}
Réponse :
Example :{
"data": {
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"refresh_token": "eyJhbGciOiJIUzI1NiIs..."
},
"apiVersion": "1.0.0",
"timestamp": "2024-03-20T10:30:00Z"
}
Ajoutez le token dans le header de vos requêtes :
Example :Authorization: Bearer <votre_token>
GET /movies
Paramètres de requête :
page
: Numéro de page (défaut: 1)limit
: Nombre d'éléments par page (défaut: 10)sort
: Champ de tri (ex: "releaseDate")order
: Ordre de tri ("asc" ou "desc")GET /movies/:id
GET /movies/search
Paramètres de requête :
query
: Terme de rechercheyear
: Année de sortiegenre
: ID du genrelanguage
: Code de langueGET /theaters
GET /theaters/:id
GET /theaters/:id/availability
Paramètres de requête :
date
: Date de la séance (YYYY-MM-DD)time
: Heure de la séance (HH:mm)GET /sessions
Paramètres de requête :
movieId
: ID du filmtheaterId
: ID de la salledate
: Date de la séancestatus
: Statut de la séancePOST /sessions
Content-Type: application/json
{
"movieId": "123",
"theaterId": "456",
"startTime": "2024-03-20T20:00:00Z",
"price": 12.50
}
POST /bookings
Content-Type: application/json
{
"sessionId": "789",
"seats": ["A1", "A2"],
"userId": "123"
}
DELETE /bookings/:id
POST /users/register
Content-Type: application/json
{
"email": "nouveau@example.com",
"password": "motdepasse",
"firstName": "Prénom",
"lastName": "Nom"
}
PUT /users/profile
Content-Type: application/json
{
"firstName": "Nouveau Prénom",
"lastName": "Nouveau Nom",
"phone": "+33123456789"
}
L'API utilise des codes HTTP standard et renvoie des messages d'erreur au format suivant :
Example :{
"statusCode": 400,
"message": "Message d'erreur détaillé",
"error": "Bad Request",
"timestamp": "2024-03-20T10:30:00Z"
}
Codes d'erreur courants :
400
: Requête invalide401
: Non authentifié403
: Non autorisé404
: Ressource non trouvée409
: Conflit500
: Erreur serveurGestion des Tokens
Rate Limiting
Cache
Pagination
async function createBooking(sessionId, seats) {
const response = await fetch('/api/bookings', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${token}`
},
body: JSON.stringify({
sessionId,
seats
})
});
if (!response.ok) {
throw new Error('Erreur lors de la création de la réservation');
}
return response.json();
}
Pour toute question ou problème :
http://localhost:3000/api
Le projet inclut une suite complète de tests automatisés :
Example :# Tests unitaires
npm run test
# Tests e2e
npm run test:e2e
# Couverture des tests
npm run test:cov
La documentation technique est disponible de deux manières :
# Générer la documentation
npm run compodoc
# Accès : http://localhost:8080/documentation
http://localhost:3000/api
# Copier le fichier de configuration
cp .env.docker .env
# Configurer les variables requises
# - DATABASE_URL
# - JWT_SECRET
# - SMTP_CONFIG
# Installer les dépendances
npm install
# Compiler le projet
npm run build
# Mode développement
npm run start:dev
# Mode production
npm run start:prod
# Lancer les services
docker-compose up -d
# Services disponibles sur :
# - Backend : http://localhost:3000
# - Frontend : http://localhost:4200
# - Documentation : http://localhost:3000/api
Déclencheurs
main
main
Environnements
develop
)staging
)main
)Sécurité
Monitoring
Rollback
Pour un déploiement sur AWS, utilisez NestJS Mau :
Example :# Installation
npm install -g @nestjs/mau
# Déploiement
mau deploy
Les contributions sont les bienvenues ! Consultez notre guide de contribution pour plus de détails.
Nest est sous licence MIT.