Implémentez les utilitaires nécessaires pour récupérer, transformer, stocker et référencer les avatars utilisateur lors de l'authentification.
- Télécharger l’avatar de l’utilisateur depuis Google OAuth.
- Convertir l’image en
.webp. - Générer un nom de fichier slugifié
{username}-{uid}.{ext}. - Enregistrer l’image dans
/public/avatars/. - Mettre à jour la base de données avec l’URL relative de l’avatar.
apps/backend/src/modules/users/application/commands/create-user.command.tsapps/backend/src/modules/users/domain/user.repository.interface.ts
apps/backend/src/infrastructure/utils/download.util.tsapps/backend/src/infrastructure/utils/storage.util.tsapps/backend/src/infrastructure/utils/slugify.util.tsapps/backend/src/infrastructure/utils/image-processing.util.tsapps/backend/src/modules/users/application/commands/create-user.command.spec.ts(tests unitaires des utils)
Télécharger un fichier distant et retourner son contenu
- Créer
download.util.tsdansinfrastructure/utils/. - Fonction
downloadFile(url: string): Promise<Buffer>. - Utiliser
fetchnatif Node.js. - Retourner le
Bufferdu fichier téléchargé. - Si échec → lancer
Error("Download failed: <reason>").
Convertir une image en
.webp
- Créer
image-processing.util.tsdansinfrastructure/utils/. - Fonction
convertToWebp(buffer: Buffer): Promise<Buffer>. - Prend un
Buffer, retourne unBuffer.webp. - Utilise une lib adaptée (Sharp ou équivalent Node.js).
Générer un nom de fichier structuré
- Créer
slugify.util.tsdansinfrastructure/utils/. - Fonction
slugifyFilename(username: string, uid: string, ext: string): string. - Retourne
{username}-{uid}.{ext}(sans espaces ni caractères spéciaux).
Enregistrer un fichier sur disque et retourner le chemin relatif
- Créer
storage.util.tsdansinfrastructure/utils/. - Fonction
storeFile(name: string, buffer: Buffer, ext: string): Promise<string>. - Sauvegarde dans
/public/avatars/. - Retourne
/public/avatars/filename.ext.
Orchestration des utilitaires
- Utilise les utils (pas injectés) :
downloadFile(avatarUrl)→ BufferconvertToWebp(buffer)→ BufferslugifyFilename(username, uid, 'webp')→ stringstoreFile(slugifiaed, buffer, 'webp')→ chemin relatif
- Mettre à jour champ
avatardans la DB avec le chemin relatif
Valider le comportement des utilitaires
slugify.util.ts→ nom bien formé, sans caractères spéciauxstorage.util.ts→ le fichier est bien écrit et le chemin retourné est correctimage-processing.util.ts→ conversion en.webpréussie
downloadFile()retourne unBuffervalideconvertToWebp()transforme correctementslugifyFilename()produit un nom structuréstoreFile()retourne un chemin relatif valideCreateUserCommandutilise tous les utils et met à jour la DB correctement- Tests unitaires présents pour tous les utilitaires