Aller au contenu
Data & IA

My Social Network API - Architecture Backend

API REST sécurisée (Node.js, Express, MongoDB) pour un réseau social : groupes, événements, billetterie transactionnelle, covoiturage et sondages.

Client
Projet académique EFREI
Année
2026
Expertise
Data & IA
Prestations
API REST, Développement Backend, Sécurité API, Modélisation de données
Outils
  • Node.js
  • Express
  • MongoDB
  • JWT
  • Postman

Contexte

Ce projet s'inscrit dans le cadre d'une simulation professionnelle où Facebook a commandé la création d'une API REST pour un tout nouveau service de réseau social. L'objectif était de concevoir une architecture backend robuste, en ayant carte blanche sur la définition des endpoints, tout en respectant un cahier des charges fonctionnel précis.

Notre approche

Pour répondre à ces exigences, une API RESTful complète et sécurisée a été développée avec Node.js, Express et MongoDB.

  • Architecture & Modélisation

    Conception de schémas de base de données avancés pour gérer les utilisateurs, les groupes (publics, privés, secrets) et les événements.

  • Fonctionnalités Sociales

    Fils de discussion liés aux groupes ou aux événements, albums photos commentables et sondages interactifs.

  • Billetterie & Transactions

    Billetterie avec gestion stricte des stocks (1 billet par personne extérieure) via des transactions MongoDB atomiques (mongoose.startSession()).

  • Modules Collaboratifs (Bonus)

    Shopping List événementielle et module de Covoiturage interactif.

  • Sécurité Maximale

    Authentification JWT, hachage bcrypt, rate limiting contre la force brute, en-têtes sécurisés (Helmet) et trafic exclusivement chiffré en HTTPS.

Livrables

Une API REST totalement fonctionnelle et documentée sur Postman, accompagnée d'un code source validé par des tests de sécurité et d'une visualisation architecturale via un composant Terminal interactif et un diagramme de flux de données.

API en action

Un achat de billet, une transaction

Pas d’interface graphique : l’API se lit dans ses requêtes. Voici l’appel réel de la collection Postman pour acheter un billet, et le document renvoyé par le serveur.

zsh — https://localhost:3000

Requête

POST /events/68ff53f7feb4ed139d5dbb45/purchase HTTP/1.1
Host: localhost:3000
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9…
Content-Type: application/json

{
  "ticketTypeId": "690650cac85bc6f4f34b2676",
  "buyerFirstName": "Peter",
  "buyerLastName": "Pan",
  "buyerAddress": "123 Neverland St, London",
  "buyerEmail": "peter.pan@test.com"
}

RéponseHTTP/1.1 201 Created

{
  "_id": "6906528fc85bc6f4f34b2690",
  "event": "68ff53f7feb4ed139d5dbb45",
  "ticketType": "690650cac85bc6f4f34b2676",
  "buyerFirstName": "Peter",
  "buyerLastName": "Pan",
  "buyerAddress": "123 Neverland St, London",
  "buyerEmail": "peter.pan@test.com",
  "purchaseDate": "2025-11-01T18:42:07.311Z",
  "createdAt": "2025-11-01T18:42:07.311Z",
  "updatedAt": "2025-11-01T18:42:07.311Z"
}

Dans une session MongoDB

  1. 1L’événement existe et est public, sinon la billetterie est refusée.
  2. 2Le type de billet appartient bien à cet événement.
  3. 3Contrôle du stock : soldCount < quantity.
  4. 4Création du billet ; l’index unique (événement + email) bloque un second achat (409).
  5. 5Incrément atomique de soldCount ($inc), puis commit ou rollback complet.

Surface de l’API

57 requêtes documentées

Chaque ressource de la collection Postman, avec la répartition de ses verbes HTTP.

Architecture

Le modèle de données

Treize schémas Mongoose reliés par références. L’événement est le pivot : billetterie, covoiturage, shopping list, albums, sondages et fil de discussion s’y rattachent.

Voir le code Mermaid
erDiagram
  User {
    ObjectId _id PK
    string firstname
    string lastname
    string email UK
    string password "bcrypt"
    string avatar
  }
  Group {
    ObjectId _id PK
    string name
    string groupType "public | private | secret"
    ObjectId[] admins FK
    ObjectId[] members FK
    object settings
  }
  Event {
    ObjectId _id PK
    string name
    date startDate
    date endDate
    string location
    boolean isPrivate
    ObjectId group FK
    boolean shoppingListEnabled
    boolean carpoolingEnabled
  }
  TicketType {
    ObjectId _id PK
    ObjectId event FK
    string name
    number price
    number quantity
    number soldCount
  }
  PurchasedTicket {
    ObjectId _id PK
    ObjectId event FK
    ObjectId ticketType FK
    string buyerEmail "unique par event"
    date purchaseDate
  }
  CarpoolOffer {
    ObjectId _id PK
    ObjectId event FK
    ObjectId driver FK
    string departureLocation
    date departureTime
    number price
    number availableSeats
    number maxDetourMinutes
  }
  ShoppingListItem {
    ObjectId _id PK
    ObjectId event FK
    ObjectId user FK
    string itemName
    number quantity
    date arrivalTime
  }
  User }o--o{ Group : "admin / membre"
  Group |o--o{ Event : "organise"
  User }o--o{ Event : "organise / participe"
  Group ||--o| DiscussionThread : "fil"
  Event ||--o| DiscussionThread : "fil"
  DiscussionThread ||--o{ Message : "contient"
  User ||--o{ Message : "écrit"
  Message |o--o{ Message : "répond à"
  Event ||--o{ PhotoAlbum : "albums"
  PhotoAlbum ||--o{ Photo : "contient"
  User ||--o{ Photo : "publie"
  Event ||--o{ Poll : "sondages"
  Poll ||--o{ PollResponse : "réponses"
  User ||--o{ PollResponse : "vote"
  Event ||--o{ TicketType : "billetterie"
  TicketType ||--o{ PurchasedTicket : "vendu"
  Event ||--o{ PurchasedTicket : "1 par email"
  Event ||--o{ ShoppingListItem : "shopping list"
  User ||--o{ ShoppingListItem : "apporte"
  Event ||--o{ CarpoolOffer : "covoiturage"
  User ||--o{ CarpoolOffer : "conduit"

Stack technique

Outillage

Runtime & API

  • Node.js (ESM)
  • Express
  • REST

Données

  • MongoDB
  • Mongoose
  • Transactions ACID

Sécurité

  • JWT
  • bcrypt
  • Helmet
  • express-rate-limit
  • CORS
  • HTTPS / TLS

Outillage

  • Postman
  • ESLint
  • compression
  • dotenv
Voir le code source complet (GitHub)(nouvel onglet)

Contrôleurs Express, schémas Mongoose, middleware JWT et collection Postman complète.

Autres projets Data & IA

Retour au portfolio