GIFs Tenor
Cette section détaille l'intégration avec l'API Tenor permettant aux utilisateurs de rechercher et d'envoyer des GIFs dans les canaux de chat.
TenorService (tenor.service.ts)
Service qui communique avec l'API Tenor v2 pour récupérer des GIFs.
Propriétés
private readonly apiKey: string: Clé API Tenor (depuis variables d'environnement)private readonly baseUrl: string: URL de base de l'API Tenor v2
Méthodes
async searchGifs(query: string, limit: number = 20): Promise<TenorGif[]>
Description : Recherche des GIFs selon un terme de recherche.
Paramètres :
query: Terme de recherchelimit: Nombre de résultats (défaut: 20, max: 50)
API Call :
GET https://tenor.googleapis.com/v2/search
?q={query}
&key={apiKey}
&limit={limit}
&media_filter=gif
Retour : Promise<TenorGif[]>
Structure TenorGif :
{
id: string,
title: string,
media_formats: {
gif: {
url: string,
dims: [width, height],
size: number
},
tinygif: { ... },
nanogif: { ... }
},
created: number,
content_description: string,
itemurl: string,
url: string
}
async getFeaturedGifs(limit: number = 20): Promise<TenorGif[]>
Description : Récupère les GIFs en vedette (trending).
Paramètres :
limit: Nombre de résultats (défaut: 20, max: 50)
API Call :
GET https://tenor.googleapis.com/v2/featured
?key={apiKey}
&limit={limit}
&media_filter=gif
Retour : Promise<TenorGif[]>
TenorController (tenor.controller.ts)
Contrôleur REST pour les endpoints Tenor.
Endpoints
GET /api/tenor/search?q=query&limit=20
Description : Recherche des GIFs.
Query params :
q: Terme de recherche (requis, non vide)limit: Nombre de résultats (1-50, défaut: 20)
Validation :
- Utilisateur authentifié (
authMiddleware) - Query non vide
- Limit entre 1 et 50
Réponse :
{
gifs: TenorGif[]
}
Status codes :
200 OK: Recherche réussie400 BAD_REQUEST: Query vide ou limit invalide401 UNAUTHORIZED: Non authentifié500 INTERNAL_SERVER_ERROR: Erreur API Tenor
GET /api/tenor/featured?limit=20
Description : Récupère les GIFs en vedette.
Query params :
limit: Nombre de résultats (1-50, défaut: 20)
Validation :
- Utilisateur authentifié
- Limit entre 1 et 50
Réponse :
{
gifs: TenorGif[]
}
Status codes :
200 OK: Récupération réussie400 BAD_REQUEST: Limit invalide401 UNAUTHORIZED: Non authentifié500 INTERNAL_SERVER_ERROR: Erreur API Tenor
Configuration
Variable d'environnement
TENOR_API_KEY=your_tenor_api_key_here
Obtention de la clé :
- Créer un compte sur Tenor
- Créer une application
- Copier la clé API
Configuration dans env.ts
export const TENOR_API_KEY = process.env.TENOR_API_KEY || '';
Intégration avec le Chat
Envoi de GIF dans un message
- Client recherche GIF via
/api/tenor/search - Client sélectionne un GIF
- Client envoie message avec URL du GIF :
socket.emit('chat:send-message', { channelId: '...', content: 'https://media.tenor.com/...' }) - Serveur stocke le message avec l'URL
- Serveur diffuse le message aux participants du canal
- Client détecte l'URL et affiche le GIF
Format du message
Les messages contenant des GIFs sont stockés comme des messages normaux avec l'URL dans le champ content.
Exemple de message :
{
_id: ObjectId('...'),
author: 'firebase_uid_123',
content: 'https://media.tenor.com/xyz/image.gif',
creationDate: Date('2025-12-01T12:00:00Z')
}
Le client est responsable de détecter les URLs Tenor et d'afficher les GIFs de manière appropriée.
Limites et quotas
Limites de l'API Tenor
- Rate limit : Selon le plan Tenor (gratuit ou payant)
- Résultats par requête : Max 50 (imposé côté serveur)
- Taille des GIFs : Plusieurs formats disponibles (gif, tinygif, nanogif)
Limites imposées par le serveur
- Limit min : 1
- Limit max : 50
- Query : Non vide pour search
- Authentification : Requise pour tous les endpoints
Gestion d'erreurs
Erreurs API Tenor
Si l'API Tenor retourne une erreur :
- Serveur retourne
500 INTERNAL_SERVER_ERROR - Message générique : "Failed to search GIFs" ou "Failed to fetch featured GIFs"
- Erreur loggée côté serveur pour debugging
Erreurs de validation
- Query vide :
400 BAD_REQUEST- "Search query is required" - Limit invalide :
400 BAD_REQUEST- "Limit must be between 1 and 50" - Non authentifié :
401 UNAUTHORIZED- "User not authenticated"
Sécurité
Authentification
- Middleware
authMiddlewaresur toutes les routes - Vérification du token Firebase
- Vérification de l'utilisateur MongoDB
Protection de la clé API
- Clé Tenor stockée côté serveur uniquement
- Pas exposée au client
- Client passe par le serveur pour toutes les requêtes Tenor
Validation des URLs
- Serveur ne valide pas les URLs de GIF
- Confiance dans l'API Tenor pour fournir des URLs valides
- Client responsable de l'affichage sécurisé
Performance
Caching
Actuellement, aucun cache n'est implémenté. Les requêtes sont transmises directement à l'API Tenor.
Améliorations possibles
- Cache des résultats de recherche populaires
- Cache des GIFs featured
- TTL de 5-10 minutes
- Réduction des appels API Tenor