Backend : [Link] avec Express.
js et MongoDB
Pour le backend, nous utiliserons [Link] avec le framework [Link] pour l'API et Mongoose pour
interagir avec MongoDB.
1. Initialisation du Projet [Link]
Naviguez dans le dossier filmflex/ et exécutez :
Bash
npm init -y
npm install express mongoose dotenv bcryptjs jsonwebtoken
express : Framework web pour [Link].
mongoose : ODM (Object Data Modeling) pour MongoDB, facilitant l'interaction avec la base
de données.
dotenv : Pour charger les variables d'environnement (ex: votre chaîne de connexion
MongoDB).
bcryptjs : Pour hacher les mots de passe de manière sécurisée.
jsonwebtoken : Pour l'authentification basée sur les tokens (JWT).
2. .env (Variables d'Environnement)
Créez un fichier .env à la racine de votre projet :
MONGO_URI=mongodb://localhost:27017/filmflexbd
JWT_SECRET=supersecretjwtkey (changez cette clé !)
3. [Link] (Serveur Express)
JavaScript
require('dotenv').config(); // Charge les variables d'environnement
const express = require('express');
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const path = require('path');
const app = express();
const PORT = [Link] || 5000;
// Middleware pour parser le JSON
[Link]([Link]());
// Servir les fichiers statiques du dossier 'public'
[Link]([Link]([Link](__dirname, 'public')));
// Connexion à la base de données MongoDB
[Link]([Link].MONGO_URI)
.then(() => [Link]('Connecté à MongoDB : filmflexbd'))
.catch(err => [Link]('Erreur de connexion à MongoDB:', err));
// --- Schémas et Modèles Mongoose ---
// Schéma Utilisateur
const userSchema = new [Link]({
username: { type: String, required: true, unique: true },
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
createdAt: { type: Date, default: [Link] }
});
// Hashage du mot de passe avant de sauvegarder
[Link]('save', async function(next) {
if () {
return next();
const salt = await [Link](10);
[Link] = await [Link]([Link], salt);
next();
});
const User = [Link]('User', userSchema);
// Schéma Film/Série (simplifié)
const contentSchema = new [Link]({
title: { type: String, required: true },
description: { type: String, required: true },
imageUrl: { type: String, required: true },
type: { type: String, enum: ['movie', 'series'], required: true }, // 'movie' ou 'series'
genre: [String],
releaseYear: Number,
rating: Number,
// ... d'autres champs pertinents
});
const Content = [Link]('Content', contentSchema);
// --- Routes d'API ---
// Route d'Inscription
[Link]('/api/register', async (req, res) => {
const { username, email, password } = [Link];
try {
let user = await [Link]({ email });
if (user) {
return [Link](400).json({ message: 'L\'utilisateur avec cet email existe déjà.' });
user = new User({ username, email, password });
await [Link]();
[Link](201).json({ message: 'Inscription réussie !' });
} catch (error) {
[Link](error);
[Link](500).json({ message: 'Erreur serveur lors de l\'inscription.' });
});
// Route de Connexion
[Link]('/api/login', async (req, res) => {
const { email, password } = [Link];
try {
const user = await [Link]({ email });
if (!user) {
return [Link](400).json({ message: 'Identifiants invalides.' });
const isMatch = await [Link](password, [Link]);
if (!isMatch) {
return [Link](400).json({ message: 'Identifiants invalides.' });
// Générer un token JWT
const token = [Link](
{ id: user._id, username: [Link] },
[Link].JWT_SECRET,
{ expiresIn: '1h' } // Token expire après 1 heure
);
[Link]({ message: 'Connexion réussie !', token });
} catch (error) {
[Link](error);
[Link](500).json({ message: 'Erreur serveur lors de la connexion.' });
});
// Middleware d'authentification (pour les routes protégées)
const auth = (req, res, next) => {
const token = [Link]('x-auth-token'); // Récupérer le token depuis l'en-tête
if (!token) {
return [Link](401).json({ message: 'Pas de token, autorisation refusée.' });
try {
const decoded = [Link](token, [Link].JWT_SECRET);
[Link] = decoded; // Ajoute les infos de l'utilisateur décodées à la requête
next();
} catch (error) {
[Link](401).json({ message: 'Token non valide.' });
};
// Exemple de route protégée (nécessite d'être connecté)
[Link]('/api/protected', auth, (req, res) => {
[Link]({ message: `Bienvenue ${[Link]}, vous êtes connecté et accédez à une
ressource protégée !` });
});
// Routes pour les films et séries
[Link]('/api/movies', async (req, res) => {
try {
const movies = await [Link]({ type: 'movie' });
[Link](movies);
} catch (error) {
[Link](error);
[Link](500).json({ message: 'Erreur lors de la récupération des films.' });
});
[Link]('/api/series', async (req, res) => {
try {
const series = await [Link]({ type: 'series' });
[Link](series);
} catch (error) {
[Link](error);
[Link](500).json({ message: 'Erreur lors de la récupération des séries.' });
});
// Ajout de contenu (exemple, peut être protégé par un rôle admin)
[Link]('/api/content', auth, async (req, res) => {
const { title, description, imageUrl, type, genre, releaseYear, rating } = [Link];
try {
const newContent = new Content({
title, description, imageUrl, type, genre, releaseYear, rating
});
await [Link]();
[Link](201).json({ message: 'Contenu ajouté avec succès !', content: newContent });
} catch (error) {
[Link](error);
[Link](500).json({ message: 'Erreur lors de l\'ajout du contenu.' });
});
// --- Gestion des Paiements (Concepteuel) ---
// Pour les modes de paiement comme Orange Money, MTN MoMo, PayPal, vous devrez intégrer
// les API de ces services. C'est une partie très complexe et sensible.
// Voici un exemple conceptuel de route de paiement :
[Link]('/api/payment/orange-money', auth, async (req, res) => {
const { amount, phoneNumber } = [Link];
// Logique d'intégration avec l'API Orange Money
// Cela impliquerait d'envoyer une requête à l'API d'Orange Money,
// de gérer les callbacks (webhook) pour confirmer le paiement.
[Link](`Tentative de paiement Orange Money de ${amount} avec ${phoneNumber}`);
[Link](200).json({ message: 'Paiement Orange Money initié. En attente de confirmation...' });
});
[Link]('/api/payment/mtn-momo', auth, async (req, res) => {
const { amount, phoneNumber } = [Link];
// Logique d'intégration avec l'API MTN MoMo
[Link](`Tentative de paiement MTN MoMo de ${amount} avec ${phoneNumber}`);
[Link](200).json({ message: 'Paiement MTN MoMo initié. En attente de confirmation...' });
});
[Link]('/api/payment/paypal', auth, async (req, res) => {
const { amount } = [Link];
// Logique d'intégration avec l'API PayPal (SDK côté serveur)
// Cela générerait un lien de paiement PayPal ou une transaction directe.
[Link](`Tentative de paiement PayPal de ${amount}`);
[Link](200).json({ message: 'Paiement PayPal initié. Redirection vers PayPal...' });
});
// Route par défaut pour toutes les autres requêtes (pour les SPA)
[Link]('*', (req, res) => {
[Link]([Link](__dirname, 'public', '[Link]'));
});
// Démarrer le serveur
[Link](PORT, () => {
[Link](`Serveur démarré sur [Link]
});
Fonctionnement Global et Étapes Suivantes
1. Démarrer MongoDB : Assurez-vous que votre serveur MongoDB est en cours d'exécution
(par défaut sur mongodb://localhost:27017).
2. Démarrer le Backend :
Bash
cd filmflex
node [Link]
Le serveur écoutera sur [Link]
3. Accéder au Site : Ouvrez votre navigateur et allez sur [Link]
Prochaines Étapes Cruciales pour un Vrai Site :
Gestion des Erreurs Robuste : Ajouter plus de gestion des erreurs côté client et serveur.
Validation des Entrées : Valider toutes les données envoyées par l'utilisateur (backend et
frontend).
Sécurité :
o Implémenter des mesures de sécurité supplémentaires (CORS, CSRF, XSS).
o Ne jamais exposer les clés API sensibles côté client.
Gestion des Sessions/Tokens : Affiner la gestion des tokens JWT, y compris le
rafraîchissement des tokens.
Déploiement : Apprendre à déployer votre application sur un serveur (Heroku, Vercel, Netlify
pour le frontend, AWS, DigitalOcean pour le backend).
Contenu Dynamique : Remplir votre base de données filmflexbd avec de vraies données de
films et séries.
Interface Utilisateur Avancée :
o Ajouter des fonctionnalités de recherche et de filtrage.
o Créer des pages de détails pour chaque film/série.
o Implémenter un lecteur vidéo.
Intégration des Paiements Réels : C'est une étape majeure et délicate. Vous devrez vous
inscrire auprès d'Orange Money, MTN MoMo, et PayPal pour obtenir leurs API et
documentations techniques, puis les intégrer de manière sécurisée.
Dashboards Admin : Pour gérer le contenu (ajouter, modifier, supprimer films/séries).
Ce guide vous donne une base solide et les concepts clés pour construire votre site "FilmFlex". La
réalisation complète demandera un apprentissage approfondi de chaque technologie mentionnée.
N'hésitez pas à poser des questions si vous avez besoin de précisions sur des parties spécifiques !
Sources