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.ts
apps/backend/src/modules/users/domain/user.repository.interface.ts
apps/backend/src/infrastructure/utils/download.util.ts
apps/backend/src/infrastructure/utils/storage.util.ts
apps/backend/src/infrastructure/utils/slugify.util.ts
apps/backend/src/infrastructure/utils/image-processing.util.ts
apps/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.ts
dansinfrastructure/utils/
. - Fonction
downloadFile(url: string): Promise<Buffer>
. - Utiliser
fetch
natif Node.js. - Retourner le
Buffer
du fichier téléchargé. - Si échec → lancer
Error("Download failed: <reason>")
.
Convertir une image en
.webp
- Créer
image-processing.util.ts
dansinfrastructure/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.ts
dansinfrastructure/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.ts
dansinfrastructure/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
avatar
dans 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.webp
réussie
downloadFile()
retourne unBuffer
valideconvertToWebp()
transforme correctementslugifyFilename()
produit un nom structuréstoreFile()
retourne un chemin relatif valideCreateUserCommand
utilise tous les utils et met à jour la DB correctement- Tests unitaires présents pour tous les utilitaires