Skip to content

Instantly share code, notes, and snippets.

@alexsoyes
Created April 2, 2025 07:09
Show Gist options
  • Save alexsoyes/622c41bfd17965b14d3a55066afd386e to your computer and use it in GitHub Desktop.
Save alexsoyes/622c41bfd17965b14d3a55066afd386e to your computer and use it in GitHub Desktop.

Instruction: Gestion et stockage des avatars utilisateur

Implémentez les utilitaires nécessaires pour récupérer, transformer, stocker et référencer les avatars utilisateur lors de l'authentification.

Goal

  • 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.

Existing files

  • apps/backend/src/modules/users/application/commands/create-user.command.ts
  • apps/backend/src/modules/users/domain/user.repository.interface.ts

New files to create

  • 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)

Grouped tasks

download.util.ts

Télécharger un fichier distant et retourner son contenu

  • Créer download.util.ts dans infrastructure/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>").

image-processing.util.ts

Convertir une image en .webp

  • Créer image-processing.util.ts dans infrastructure/utils/.
  • Fonction convertToWebp(buffer: Buffer): Promise<Buffer>.
  • Prend un Buffer, retourne un Buffer .webp.
  • Utilise une lib adaptée (Sharp ou équivalent Node.js).

slugify.util.ts

Générer un nom de fichier structuré

  • Créer slugify.util.ts dans infrastructure/utils/.
  • Fonction slugifyFilename(username: string, uid: string, ext: string): string.
  • Retourne {username}-{uid}.{ext} (sans espaces ni caractères spéciaux).

storage.util.ts

Enregistrer un fichier sur disque et retourner le chemin relatif

  • Créer storage.util.ts dans infrastructure/utils/.
  • Fonction storeFile(name: string, buffer: Buffer, ext: string): Promise<string>.
  • Sauvegarde dans /public/avatars/.
  • Retourne /public/avatars/filename.ext.

Modification de CreateUserCommand

Orchestration des utilitaires

  • Utilise les utils (pas injectés) :
    • downloadFile(avatarUrl) → Buffer
    • convertToWebp(buffer) → Buffer
    • slugifyFilename(username, uid, 'webp') → string
    • storeFile(slugifiaed, buffer, 'webp') → chemin relatif
  • Mettre à jour champ avatar dans la DB avec le chemin relatif

Tests

Valider le comportement des utilitaires

  • slugify.util.ts → nom bien formé, sans caractères spéciaux
  • storage.util.ts → le fichier est bien écrit et le chemin retourné est correct
  • image-processing.util.ts → conversion en .webp réussie

Validation checkpoints

  • downloadFile() retourne un Buffer valide
  • convertToWebp() transforme correctement
  • slugifyFilename() produit un nom structuré
  • storeFile() retourne un chemin relatif valide
  • CreateUserCommand utilise tous les utils et met à jour la DB correctement
  • Tests unitaires présents pour tous les utilitaires
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment