0% ont trouvé ce document utile (0 vote)
13 vues9 pages

Backend

Transféré par

m678miguel
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
13 vues9 pages

Backend

Transféré par

m678miguel
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd

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 (![Link]('password')) {

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

Vous aimerez peut-être aussi