diff --git a/documentation/content/docs/_meta.json b/documentation/content/docs/_meta.json index 87e801a..f8c30e2 100644 --- a/documentation/content/docs/_meta.json +++ b/documentation/content/docs/_meta.json @@ -7,6 +7,7 @@ "features": "Fonctionnalités", "stack": "Stack Technologique", "database": "Modèle de Données", + "flows": "Flux Métiers", "---security---": { "type": "separator", "label": "Sécurité & Conformité" diff --git a/documentation/content/docs/api-reference.mdx b/documentation/content/docs/api-reference.mdx index f113288..361dad7 100644 --- a/documentation/content/docs/api-reference.mdx +++ b/documentation/content/docs/api-reference.mdx @@ -216,6 +216,16 @@ Cette page documente tous les points de terminaison disponibles sur l'API Memego - `200 OK` : 2FA désactivée. + + Recherche des utilisateurs par leur nom d'utilisateur ou nom d'affichage. Requiert l'authentification. + + **Query Params :** + - `q` (string) : Terme de recherche. + + **Réponses :** + - `200 OK` : Liste des utilisateurs correspondants. + + Liste tous les utilisateurs. **Réservé aux administrateurs.** @@ -406,6 +416,92 @@ Cette page documente tous les points de terminaison disponibles sur l'API Memego +### 💬 Commentaires (`/comments` & `/contents/:id/comments`) + + + + Liste les commentaires d'un contenu. + + **Réponses :** + - `200 OK` : Liste des commentaires, incluant l'auteur et si l'utilisateur actuel a aimé le commentaire. + + + + Ajoute un commentaire à un contenu. Requiert l'authentification. + + **Corps de la requête :** + - `text` (string) : Contenu du commentaire. + - `parentId` (uuid, optional) : ID du commentaire parent pour les réponses. + + **Réponses :** + - `201 Created` : Commentaire ajouté. + + + + Supprime un commentaire. L'utilisateur doit être l'auteur ou un modérateur/admin. + + **Réponses :** + - `200 OK` : Commentaire supprimé. + + + + Ajoute un "like" à un commentaire. Requiert l'authentification. + + **Réponses :** + - `201 Created` : Like ajouté. + + + + Retire un "like" d'un commentaire. Requiert l'authentification. + + **Réponses :** + - `200 OK` : Like retiré. + + + +### ✉️ Messagerie (`/messages`) + + + + Liste les conversations de l'utilisateur connecté. Requiert l'authentification. + + **Réponses :** + - `200 OK` : Liste des conversations avec le dernier message et le nombre de messages non lus. + + + + Récupère le nombre total de messages non lus pour l'utilisateur. Requiert l'authentification. + + **Réponses :** + - `200 OK` : `{ "count": number }`. + + + + Récupère ou crée une conversation avec un utilisateur spécifique. Requiert l'authentification. + + **Réponses :** + - `200 OK` : Objet conversation. + + + + Récupère les messages d'une conversation. Marque les messages comme lus. Requiert l'authentification. + + **Réponses :** + - `200 OK` : Liste des messages. + + + + Envoie un message. Requiert l'authentification. + + **Corps de la requête :** + - `recipientId` (uuid) : ID du destinataire. + - `text` (string) : Contenu du message. + + **Réponses :** + - `201 Created` : Message envoyé. + + + ### ⭐ Favoris (`/favorites`) diff --git a/documentation/content/docs/api.mdx b/documentation/content/docs/api.mdx index 43a6842..7dc3898 100644 --- a/documentation/content/docs/api.mdx +++ b/documentation/content/docs/api.mdx @@ -29,4 +29,4 @@ Memegoat utilise une architecture de stockage d'objets compatible S3 (MinIO). Le ### Notifications (Mail) -Le système intègre un service d'envoi d'emails (SMTP) pour les notifications critiques et la gestion des comptes. +Le système intègre un service d'envoi d'emails (SMTP) via `@nestjs-modules/mailer` pour les notifications critiques, la validation des comptes et la réinitialisation de mots de passe. diff --git a/documentation/content/docs/compliance.mdx b/documentation/content/docs/compliance.mdx index 192f051..e6c51ff 100644 --- a/documentation/content/docs/compliance.mdx +++ b/documentation/content/docs/compliance.mdx @@ -19,7 +19,8 @@ Le projet Memegoat s'inscrit dans une démarche de respect de la vie privée et Conformément à la section [Sécurité](/docs/security), les mesures suivantes sont appliquées : - **Chiffrement au repos** : Utilisation de **PGP (pgcrypto)** pour les données identifiantes. -- **Hachage aveugle** : Pour permettre les opérations sur données chiffrées sans compromettre la confidentialité. +- **Cryptographie Post-Quantique** : Mise en œuvre de `@noble/post-quantum` pour protéger les données contre les futures capacités de calcul quantique. +- **Hachage aveugle (Blind Indexing)** : Pour permettre les opérations d'unicité et de recherche sur données chiffrées sans compromettre la confidentialité. - **Hachage des mots de passe** : Utilisation de l'algorithme **Argon2id**. - **Communications sécurisées** : Utilisation de **TLS 1.3** via Caddy. - **Suivi des Erreurs (Sentry)** : Configuration conforme avec désactivation de l'envoi des PII (Personally Identifiable Information) et masquage des données sensibles. diff --git a/documentation/content/docs/database.mdx b/documentation/content/docs/database.mdx index d55ecb4..6e71801 100644 --- a/documentation/content/docs/database.mdx +++ b/documentation/content/docs/database.mdx @@ -18,13 +18,24 @@ erDiagram USER ||--o{ API_KEY : "genere" USER ||--o{ AUDIT_LOG : "genere" USER ||--o{ FAVORITE : "ajoute" + USER ||--o{ COMMENT : "rédige" + USER ||--o{ COMMENT_LIKE : "aime" + USER ||--o{ CONVERSATION_PARTICIPANT : "participe" + USER ||--o{ MESSAGE : "envoie" CONTENT ||--o{ CONTENT_TAG : "possede" TAG ||--o{ CONTENT_TAG : "est_lie_a" CONTENT ||--o{ REPORT : "est_signale" CONTENT ||--o{ FAVORITE : "est_mis_en" + CONTENT ||--o{ COMMENT : "reçoit" TAG ||--o{ REPORT : "est_signale" + COMMENT ||--o{ COMMENT : "possède des réponses" + COMMENT ||--o{ COMMENT_LIKE : "est aimé par" + + CONVERSATION ||--o{ CONVERSATION_PARTICIPANT : "regroupe" + CONVERSATION ||--o{ MESSAGE : "contient" + CATEGORY ||--o{ CONTENT : "catégorise" ROLE ||--o{ USER_ROLE : "attribue_a" @@ -45,6 +56,15 @@ erDiagram string type string storage_key } + COMMENT { + string text + } + CONVERSATION { + timestamp created_at + } + MESSAGE { + string text + } TAG { string name string slug @@ -140,6 +160,39 @@ erDiagram uuid content_id PK, FK uuid tag_id PK, FK } + comments { + uuid id PK + uuid content_id FK + uuid user_id FK + uuid parent_id FK + text text + timestamp created_at + timestamp updated_at + timestamp deleted_at + } + comment_likes { + uuid comment_id PK, FK + uuid user_id PK, FK + timestamp created_at + } + conversations { + uuid id PK + timestamp created_at + timestamp updated_at + } + conversation_participants { + uuid conversation_id PK, FK + uuid user_id PK, FK + timestamp joined_at + } + messages { + uuid id PK + uuid conversation_id FK + uuid sender_id FK + text text + timestamp created_at + timestamp read_at + } roles { uuid id PK varchar name @@ -225,6 +278,15 @@ erDiagram users ||--o{ sessions : "user_id" users ||--o{ api_keys : "user_id" users ||--o{ audit_logs : "user_id" + contents ||--o{ comments : "content_id" + users ||--o{ comments : "user_id" + comments ||--o{ comments : "parent_id" + comments ||--o{ comment_likes : "comment_id" + users ||--o{ comment_likes : "user_id" + conversations ||--o{ conversation_participants : "conversation_id" + users ||--o{ conversation_participants : "user_id" + conversations ||--o{ messages : "conversation_id" + users ||--o{ messages : "sender_id" ``` ### Physique (MPD) @@ -278,6 +340,7 @@ erDiagram #### Sécurité et Chiffrement - **Chiffrement PGP (Native)** : Les colonnes `email` et `two_factor_secret` sont stockées au format `bytea` et chiffrées/déchiffrées via les fonctions `pgp_sym_encrypt` et `pgp_sym_decrypt` de PostgreSQL (via l'extension `pgcrypto`). +- **Cryptographie Post-Quantique** : Utilisation de la bibliothèque `@noble/post-quantum` pour anticiper les futures menaces cryptographiques. - **Hachage aveugle (Blind Indexing)** : La colonne `email_hash` stocke un hash (SHA-256) de l'email pour permettre les recherches d'unicité et les recherches rapides sans déchiffrer la donnée. #### Index et Optimisations diff --git a/documentation/content/docs/deployment.mdx b/documentation/content/docs/deployment.mdx index ab9099a..89b20e9 100644 --- a/documentation/content/docs/deployment.mdx +++ b/documentation/content/docs/deployment.mdx @@ -12,10 +12,10 @@ Un conteneur **Caddy** est utilisé en tant que reverse proxy pour fournir le TL ### Pré-requis Système - - + + - + ### Procédure de Déploiement diff --git a/documentation/content/docs/features.mdx b/documentation/content/docs/features.mdx index df49bdd..ba2cdb7 100644 --- a/documentation/content/docs/features.mdx +++ b/documentation/content/docs/features.mdx @@ -10,7 +10,7 @@ Le projet Memegoat intègre un ensemble de fonctionnalités avancées pour garan ## 🏗️ Infrastructure & Médias ### 📤 Publication & Traitement -Le coeur de la plateforme permet la publication sécurisée de mèmes et de GIFs avec un pipeline de traitement complet : +Le coeur de la plateforme permet la publication sécurisée de mèmes et de GIFs avec un pipeline de traitement complet (voir le [Flux de Publication](/docs/flows#-publication-de-contenu-pipeline-médía)) : @@ -64,6 +64,11 @@ Un système complet de gestion de profil permet aux utilisateurs de : - Configurer la **Double Authentification (2FA)**. - Consulter leurs sessions actives et révoquer des accès. +### 💬 Interaction & Communauté +Memegoat favorise l'interaction entre les utilisateurs via plusieurs fonctionnalités sociales : +- **Système de Commentaires** : Les utilisateurs peuvent commenter les mèmes, répondre à d'autres commentaires et aimer les contributions. +- **Messagerie Privée** : Un système de messagerie sécurisé permettant des conversations directes entre utilisateurs, avec gestion des conversations et compteurs de messages non lus. + Toutes les données sensibles du profil sont protégées par **chiffrement PGP** au repos. diff --git a/documentation/content/docs/flows.mdx b/documentation/content/docs/flows.mdx new file mode 100644 index 0000000..ed6b1fe --- /dev/null +++ b/documentation/content/docs/flows.mdx @@ -0,0 +1,177 @@ +--- +title: Flux Métiers +description: Diagrammes de séquence et explications des flux critiques de Memegoat. +--- + +# 🔄 Flux Métiers + +Cette section détaille les processus critiques de la plateforme Memegoat à travers des diagrammes de séquence et des explications techniques étape par étape. + +## 🔐 Authentification & Sécurité + +### Inscription & Double Authentification (2FA) + +Le processus d'inscription intègre immédiatement les mesures de sécurité fortes (Argon2id, PGP). L'activation de la 2FA est optionnelle mais fortement recommandée. + +```mermaid +sequenceDiagram + participant U as Utilisateur + participant F as Frontend + participant B as Backend + participant DB as PostgreSQL + participant M as Serveur SMTP + + Note over U, DB: Flux d'Inscription + U->>F: Remplir formulaire (email, password) + F->>B: POST /auth/register + B->>B: Hash password (Argon2id) + B->>B: Chiffrement Email (PGP) + B->>B: Génération Email Hash (Blind Indexing) + B->>DB: INSERT INTO users + B->>M: Envoi email de validation + B-->>F: 201 Created + F-->>U: Succès (Redirection Login) + + Note over U, DB: Activation 2FA + U->>F: Activer 2FA + F->>B: POST /users/me/2fa/setup + B->>B: Générer Secret TOTP + B->>B: Chiffrer Secret (PGP) + B->>DB: UPDATE users SET two_factor_secret + B-->>F: Secret + QR Code URL + F-->>U: Affiche QR Code + U->>F: Saisir code TOTP + F->>B: POST /users/me/2fa/enable (token) + B->>B: Déchiffrer Secret (PGP) + B->>B: Vérifier TOTP (otplib) + B->>DB: UPDATE users SET is_two_factor_enabled = true + B-->>F: 200 OK +``` + +--- + +## 📤 Publication de Contenu (Pipeline Média) + +La publication d'un mème ou d'un GIF suit un pipeline rigoureux garantissant la sécurité (Antivirus) et l'optimisation (Transcodage). + +```mermaid +sequenceDiagram + participant U as Utilisateur + participant F as Frontend + participant B as Backend + participant AV as ClamAV + participant S3 as MinIO (S3) + participant DB as PostgreSQL + + U->>F: Sélectionner image/vidéo + F->>B: POST /contents/upload (multipart) + B->>B: Validation (Taille, MIME-Type) + B->>AV: Scan Antivirus (Stream) + AV-->>B: Verdict (Clean/Infected) + + alt Infecté + B-->>F: 400 Bad Request (Virus detected) + else Sain + B->>B: Transcodage (Sharp/FFmpeg) + Note right of B: WebP pour images, WebM pour vidéos + B->>S3: Upload fichier optimisé + S3-->>B: Storage Key + B->>DB: INSERT INTO contents + B->>DB: INSERT INTO audit_logs (Upload action) + B-->>F: 201 Created + end +``` + +--- + +## 💬 Messagerie & Temps Réel + +Memegoat utilise **Socket.io** pour les interactions en temps réel, avec une validation de session robuste via `iron-session`. + +```mermaid +sequenceDiagram + participant U1 as Utilisateur A + participant F1 as Frontend A + participant WS as WebSocket Gateway + participant B as Backend (API) + participant F2 as Frontend B + participant U2 as Utilisateur B + + U1->>F1: Ouvre le chat + F1->>WS: Connexion (transports: websocket) + Note over WS: Authentification via iron-session cookie + WS->>WS: Vérifie Access Token (JWT) + WS->>WS: Rejoindre room "user:A" + WS-->>F1: Connected + + U1->>F1: Tape un message + F1->>WS: Event "typing" { recipientId: B, isTyping: true } + WS->>F2: Event "user_typing" { userId: A, isTyping: true } + F2-->>U2: Affiche "A est en train d'écrire..." + + U1->>F1: Envoyer message + F1->>B: POST /messages { recipientId: B, text: "Salut !" } + B->>DB: INSERT INTO messages + B-->>F1: 201 Created + B->>WS: Trigger Notify(B) + WS->>F2: Event "new_message" { senderId: A, text: "Salut !" } + F2-->>U2: Affiche message + Notification +``` + +--- + +## ⚖️ Cycle de Vie & Conformité (RGPD) + +La gestion des données respecte le droit à l'oubli à travers un processus de suppression en deux étapes et une purge automatique. + +```mermaid +sequenceDiagram + participant U as Utilisateur + participant B as Backend + participant DB as PostgreSQL + participant S3 as MinIO (S3) + participant C as Cron Job (PurgeService) + + Note over U, DB: Droit à l'oubli (Phase 1) + U->>B: DELETE /users/me + B->>DB: UPDATE users SET deleted_at = NOW() + B->>DB: UPDATE contents SET deleted_at = NOW() WHERE user_id = U + B-->>U: 200 OK (Compte désactivé) + + Note over C, S3: Purge Automatique (Phase 2 - après 30 jours) + C->>B: Execute purgeExpiredData() + B->>DB: SELECT users WHERE deleted_at < 30 days + B->>DB: DELETE FROM users (Hard Delete) + Note right of B: Cascade delete sur API keys, Sessions, etc. + B->>DB: DELETE FROM contents (Hard Delete) + B->>S3: DELETE objects (Storage Keys) + B->>DB: Purge Audit Logs / Reports expirés +``` + +--- + +## 🚩 Modération + +Le flux de modération permet aux utilisateurs de signaler des abus, traités ensuite par les administrateurs. + +```mermaid +sequenceDiagram + participant U as Utilisateur + participant B as Backend + participant DB as PostgreSQL + participant A as Administrateur + + U->>B: POST /reports { contentId, reason, description } + B->>DB: INSERT INTO reports (status: pending) + B-->>U: 201 Created + + A->>B: GET /reports (Admin Panel) + B->>DB: SELECT * FROM reports WHERE status = pending + B-->>A: Liste des signalements + + A->>B: PATCH /reports/:id/status { status: resolved } + B->>DB: UPDATE reports SET status = resolved + Note right of B: Si contenu illicite, l'admin peut supprimer le contenu + B->>B: DELETE /contents/:id/admin (Hard Delete) + B-->>A: 200 OK +``` diff --git a/documentation/content/docs/index.mdx b/documentation/content/docs/index.mdx index 1c0b9bd..396b4a4 100644 --- a/documentation/content/docs/index.mdx +++ b/documentation/content/docs/index.mdx @@ -18,10 +18,11 @@ graph TD User([Utilisateur]) Caddy[Reverse Proxy: Caddy] Frontend[Frontend: Next.js] - Backend[Backend: NestJS] + Backend[Backend: NestJS 11] DB[(Database: PostgreSQL)] Storage[Storage: S3/MinIO] Cache[(Cache: Redis)] + AV[Antivirus: ClamAV] Monitoring[Monitoring: Sentry] User <--> Caddy @@ -30,6 +31,7 @@ graph TD Backend <--> DB Backend <--> Storage Backend <--> Cache + Backend <--> AV Backend --> Monitoring ``` @@ -43,6 +45,11 @@ Explorez les sections clés pour approfondir vos connaissances techniques : href="/docs/features" description="Détails des capacités techniques et du pipeline média haute performance." /> + diff --git a/documentation/content/docs/stack.mdx b/documentation/content/docs/stack.mdx index 98008e8..f539540 100644 --- a/documentation/content/docs/stack.mdx +++ b/documentation/content/docs/stack.mdx @@ -17,9 +17,9 @@ description: Technologies utilisées dans le projet Memegoat ### Backend - + - + @@ -28,8 +28,9 @@ description: Technologies utilisées dans le projet Memegoat - - + + +