--- title: Référence API description: Documentation détaillée de tous les points de terminaison de l'API Memegoat. --- ## 📖 Référence API Cette page documente tous les points de terminaison disponibles sur l'API Memegoat. L'URL de base de l'API est `https://api.memegoat.fr`. L'authentification est gérée via des **cookies HttpOnly sécurisés** (`iron-session`). Les tokens ne sont pas exposés dans le corps des réponses après connexion pour une sécurité maximale. ### 🔐 Authentification (`/auth`) Inscrit un nouvel utilisateur. **Corps de la requête (JSON) :** - `username` (string, max: 32) : Nom d'utilisateur unique. - `email` (string) : Adresse email valide. - `password` (string, min: 8) : Mot de passe. - `displayName` (string, optional, max: 32) : Nom d'affichage. **Réponses :** - `201 Created` : Utilisateur créé. - `400 Bad Request` : Validation échouée ou utilisateur déjà existant. ```json { "username": "goat_user", "email": "user@memegoat.fr", "password": "strong-password", "displayName": "Le Bouc" } ``` Authentifie un utilisateur et retourne les jetons de session. Si la 2FA est activée, retourne un indicateur. **Corps de la requête :** - `email` (string) - `password` (string) **Réponses :** - `200 OK` : Connexion réussie. ```json { "message": "User logged in successfully", "userId": "uuid-v4" } ``` - `200 OK` (2FA requise) : ```json { "message": "2FA required", "requires2FA": true, "userId": "uuid-v4" } ``` - `401 Unauthorized` : Identifiants invalides. *Note: L'access_token et le refresh_token sont stockés dans un cookie HttpOnly chiffré.* Finalise la connexion si la 2FA est requise. **Corps de la requête :** - `userId` (uuid) : ID de l'utilisateur. - `token` (string) : Code TOTP à 6 chiffres. **Réponses :** - `200 OK` : Vérification réussie, session établie. - `401 Unauthorized` : Token invalide ou utilisateur non autorisé. Obtient un nouvel `access_token` à partir du `refresh_token` stocké dans la session. Met à jour automatiquement le cookie de session. **Réponses :** - `200 OK` : Token rafraîchi. - `401 Unauthorized` : Refresh token absent ou invalide. Invalide la session actuelle en détruisant le cookie de session. **Réponses :** - `200 OK` : Déconnexion réussie. Élève les privilèges d'un utilisateur au rang d'administrateur. Cette route n'est active que si aucun administrateur n'existe en base de données. Le token est affiché dans les logs de la console au démarrage. **Query Params :** - `token` (string) : Token à usage unique généré par le système. - `username` (string) : Nom de l'utilisateur à promouvoir. **Réponses :** - `200 OK` : Utilisateur promu. - `401 Unauthorized` : Token invalide ou utilisateur non trouvé. ### 👤 Utilisateurs (`/users`) Récupère les informations détaillées de l'utilisateur connecté. Requiert l'authentification. **Réponses :** - `200 OK` : Retourne l'objet utilisateur complet (incluant données privées). - `401 Unauthorized` : Session invalide. Récupère le profil public d'un utilisateur par son nom d'utilisateur. Mise en cache pendant 1 minute. **Réponses :** - `200 OK` : Profil public (id, username, displayName, bio, avatarUrl, createdAt). - `404 Not Found` : Utilisateur non trouvé. Extrait l'intégralité des données de l'utilisateur au format JSON (Conformité RGPD). Contient le profil, les contenus créés et les favoris. **Réponses :** - `200 OK` : Archive JSON des données. - `401 Unauthorized` : Non authentifié. Met à jour les informations du profil. **Corps de la requête :** - `displayName` (string, optional, max: 32) - `bio` (string, optional, max: 255) - `avatarUrl` (string, optional) : URL directe de l'avatar. **Réponses :** - `200 OK` : Profil mis à jour. - `400 Bad Request` : Validation échouée. Met à jour l'avatar de l'utilisateur via upload de fichier. **Type :** `multipart/form-data` **Champ :** `file` (Image: png, jpeg, webp) **Réponses :** - `201 Created` : Avatar téléchargé et mis à jour. - `400 Bad Request` : Fichier invalide ou trop volumineux. Met à jour les consentements légaux de l'utilisateur (CGU/RGPD). **Corps de la requête :** - `termsVersion` (string, max: 16) - `privacyVersion` (string, max: 16) **Réponses :** - `200 OK` : Consentements enregistrés. Marque le compte pour suppression (Soft Delete). Les données sont définitivement purgées après un délai légal de 30 jours. **Réponses :** - `200 OK` : Suppression planifiée. Génère un secret et un QR Code pour la configuration de la 2FA. **Réponses :** - `201 Created` : ```json { "secret": "JBSWY3DPEHPK3PXP", "qrCodeDataUrl": "data:image/png;base64,..." } ``` Active la 2FA après vérification du jeton TOTP. **Corps de la requête :** - `token` (string) : Code TOTP généré par l'app. **Réponses :** - `200 OK` : 2FA activée. - `400 Bad Request` : Token invalide ou 2FA non initiée. Désactive la 2FA en utilisant un jeton TOTP valide. **Corps de la requête :** - `token` (string) : Code TOTP. **Réponses :** - `200 OK` : 2FA désactivée. Liste tous les utilisateurs. **Réservé aux administrateurs.** **Query Params :** - `limit` (number) : Défaut 10. - `offset` (number) : Défaut 0. **Réponses :** - `200 OK` : Liste paginée des utilisateurs. - `403 Forbidden` : Droits insuffisants. Supprime définitivement un utilisateur par son UUID. **Réservé aux administrateurs.** **Réponses :** - `200 OK` : Utilisateur supprimé. ### 🖼️ Contenus (`/contents`) Recherche et filtre les contenus. Cet endpoint est mis en cache pendant 1 minute. **Query Params :** - `limit` (number) : Défaut 10. - `offset` (number) : Défaut 0. - `sort` : `trend` | `recent` - `tag` (string) : Filtrer par tag (nom). - `category` (slug ou uuid) : Filtrer par catégorie. - `author` (username) : Filtrer par auteur. - `query` (string) : Recherche textuelle dans le titre. - `favoritesOnly` (boolean) : Ne montrer que les favoris de l'utilisateur (nécessite auth). - `userId` (uuid) : Filtrer par ID utilisateur. **Réponses :** - `200 OK` : Liste paginée des contenus. Récupère les contenus les plus populaires du moment. Cache de 5 minutes. **Query Params :** `limit`, `offset`. **Réponses :** - `200 OK` : Liste des tendances. Récupère les contenus les plus récents. Cache de 1 minute. **Query Params :** `limit`, `offset`. **Réponses :** - `200 OK` : Liste des contenus récents. Récupère un contenu par son ID ou son Slug. Cache de 1 heure. **Détection de Bots (SEO) :** Si l'User-Agent correspond à un robot d'indexation (Googlebot, Twitterbot, etc.), l'API retourne un rendu HTML minimal contenant les méta-tags **OpenGraph** et **Twitter Cards**. **Réponses :** - `200 OK` : Objet Contenu ou Rendu HTML (Bots). - `404 Not Found` : Contenu inexistant. Crée une entrée de contenu à partir d'une ressource déjà uploadée ou externe. **Corps de la requête :** - `type` : `meme` | `gif` - `title` (string, max: 255) - `storageKey` (string, max: 512) : Clé du fichier sur S3. - `mimeType` (string, max: 128) - `fileSize` (number) - `categoryId` (uuid, optional) - `tags` (string[], optional) **Réponses :** - `201 Created` : Contenu référencé. - `401 Unauthorized` : Non authentifié. Upload un fichier et crée le contenu associé en une seule étape. **Type :** `multipart/form-data` **Champs :** - `file` (binary) : png, jpeg, webp, webm, gif. - `type` : `meme` | `gif` - `title` (string) - `categoryId` (uuid, optional) - `tags` (string[], optional) **Réponses :** - `201 Created` : Upload réussi et contenu créé. - `400 Bad Request` : Fichier non supporté ou données invalides. Génère une URL présignée pour un upload direct vers S3. **Query Param :** - `fileName` (string) : Nom du fichier avec extension. **Réponses :** - `201 Created` : Retourne l'URL présignée et les champs requis. Incrémente le compteur de vues d'un contenu. **Réponses :** - `201 Created` : Compteur incrémenté. Incrémente le compteur d'utilisation (clic sur "Utiliser"). **Réponses :** - `201 Created` : Compteur incrémenté. Supprime un contenu (Soft Delete). Doit être l'auteur. **Réponses :** - `200 OK` : Contenu supprimé. - `403 Forbidden` : Tentative de supprimer le contenu d'autrui. Supprime définitivement un contenu. **Réservé aux administrateurs.** **Réponses :** - `200 OK` : Contenu supprimé définitivement. ### 📂 Catégories (`/categories`) Liste toutes les catégories de mèmes disponibles. Cache de 1 heure. **Réponses :** - `200 OK` : Liste d'objets catégorie. Récupère les détails d'une catégorie spécifique. **Réponses :** - `200 OK` : Objet catégorie. - `404 Not Found` : Catégorie non trouvée. Crée une nouvelle catégorie. **Admin uniquement.** **Corps de la requête :** - `name` (string, max: 64) - `description` (string, optional, max: 255) - `iconUrl` (string, optional, max: 512) **Réponses :** - `201 Created` : Catégorie créée. Met à jour une catégorie existante. **Admin uniquement.** **Corps de la requête :** (Tous optionnels) `name`, `description`, `iconUrl`. **Réponses :** - `200 OK` : Catégorie mise à jour. Supprime une catégorie. **Admin uniquement.** **Réponses :** - `200 OK` : Catégorie supprimée. ### ⭐ Favoris (`/favorites`) Liste les favoris de l'utilisateur connecté. **Query Params :** - `limit` (number) : Défaut 10. - `offset` (number) : Défaut 0. **Réponses :** - `200 OK` : Liste paginée des favoris. - `401 Unauthorized` : Non authentifié. Ajoute un contenu aux favoris de l'utilisateur. **Réponses :** - `201 Created` : Favori ajouté. Retire un contenu des favoris de l'utilisateur. **Réponses :** - `200 OK` : Favori supprimé. ### 🚩 Signalements (`/reports`) Signale un contenu ou un tag pour modération. **Corps de la requête :** - `contentId` (uuid, optional) : ID du contenu à signaler. - `tagId` (uuid, optional) : ID du tag à signaler. - `reason` : `inappropriate` | `spam` | `copyright` | `other` - `description` (string, optional, max: 1000) **Réponses :** - `201 Created` : Signalement enregistré. Liste les signalements. **Réservé aux administrateurs et modérateurs.** **Query Params :** - `limit` (number) : Défaut 10. - `offset` (number) : Défaut 0. **Réponses :** - `200 OK` : Liste des signalements. Met à jour le statut d'un signalement. **Réservé aux administrateurs et modérateurs.** **Corps de la requête :** - `status` : `pending` | `reviewed` | `resolved` | `dismissed` **Réponses :** - `200 OK` : Statut mis à jour. ### 🔑 Clés API (`/api-keys`) Génère une nouvelle clé API pour l'utilisateur. **Corps de la requête :** - `name` (string, max: 128) : Nom descriptif de la clé. - `expiresAt` (date-string, optional) : Date d'expiration. **Réponses :** - `201 Created` : Clé générée. Retourne le token (à conserver précieusement, ne sera plus affiché). Liste toutes les clés API actives de l'utilisateur. **Réponses :** - `200 OK` : Liste des métadonnées des clés (nom, date de création, expiration). Révoque une clé API spécifique. **Réponses :** - `200 OK` : Clé révoquée. ### 🏷️ Tags (`/tags`) Liste les tags populaires ou recherchés. Cache de 5 minutes. **Query Params :** - `limit` (number) : Défaut 10. - `offset` (number) : Défaut 0. - `query` (string, optional) : Recherche par nom. - `sort` : `popular` | `recent` **Réponses :** - `200 OK` : Liste paginée des tags. ### 🛠️ Système (`/health`) Vérifie l'état de santé de l'API et de ses dépendances (DB, Redis). **Réponses :** - `200 OK` : Système opérationnel. ```json { "status": "ok", "timestamp": "2024-01-21T10:00:00.000Z", "database": "connected", "redis": "connected" } ``` - `503 Service Unavailable` : Problème sur l'un des composants. ### 📁 Médias (`/media`) Sert un fichier média stocké sur S3 avec une gestion optimisée du cache. **Query Params :** - `path` (string) : Chemin relatif du fichier sur le bucket. **Réponses :** - `200 OK` : Flux binaire du fichier. Headers `Content-Type` et `Cache-Control` inclus. - `404 Not Found` : Fichier introuvable. ### 📊 Administration (`/admin`) Récupère les statistiques globales d'utilisation de la plateforme (**Admin uniquement**).