đą Announcements
đ Vue d'ensembleâ
Le module Announcements gĂšre toutes les annonces du systĂšme pour les administrateurs. Il utilise NATS pour la communication inter-microservices avec la queue admin-service.
đïž Architectureâ
- Queue NATS :
admin-service - Patterns :
announcements.* - Upload d'images : Intégré avec validation
- Opérations en lot : Actions groupées
- Cache : Architecture prĂȘte pour Redis
đĄ Message Patterns NATSâ
1. Lister les Annoncesâ
Pattern : announcements.all
Payload (AnnouncementQueryDto)â
{
"page": 1,
"limit": 10,
"status": "PUBLISHED",
"categoryId": 1,
"search": "nouvelle fonctionnalité",
"sortBy": "createdAt",
"sortOrder": "desc"
}
Filtres Disponiblesâ
| Filtre | Type | Description |
|---|---|---|
status | String | Statut de l'annonce (DRAFT, PUBLISHED, ARCHIVED, DELETED) |
categoryId | Number | ID de la catégorie (pour usage futur) |
search | String | Recherche dans le titre et le contenu |
sortBy | String | Champ de tri (createdAt, title, etc.) |
sortOrder | String | Ordre de tri (asc, desc) |
2. DĂ©tails d'une Annonceâ
Pattern : announcements.details
Payloadâ
{
"id": "announcement-uuid"
}
3. CrĂ©er une Annonceâ
Pattern : announcements.create
Option 1 : Avec URL d'image existanteâ
{
"title": "Nouvelle fonctionnalité disponible",
"content": "Nous sommes heureux d'annoncer le lancement de notre nouvelle fonctionnalité...",
"image": "/uploads/announcements/existing-image.jpg",
"status": "DRAFT",
"categoryId": 1
}
Option 2 : Avec upload d'image intĂ©grĂ©â
{
"title": "Nouvelle fonctionnalité disponible",
"content": "Nous sommes heureux d'annoncer le lancement de notre nouvelle fonctionnalité...",
"status": "DRAFT",
"categoryId": 1,
"imageData": {
"fileName": "announcement-image.jpg",
"fileType": "image/jpeg",
"base64Data": "/9j/4AAQSkZJRgABAQAAAQABAAD..."
}
}
Champs Obligatoiresâ
title: Titre de l'annoncecontent: Contenu de l'annonce
Champs Optionnelsâ
image: URL ou chemin vers une image existanteimageData: Données pour upload d'une nouvelle imagestatus: Statut (défaut: DRAFT)categoryId: Catégorie (pour usage futur)
Note : Si imageData est fourni, l'image sera automatiquement sauvegardée et image sera ignoré.
4. Mettre Ă jour une Annonceâ
Pattern : announcements.update
Option 1 : Mise Ă jour simpleâ
{
"id": "announcement-uuid",
"updateData": {
"title": "Titre mis Ă jour",
"content": "Contenu mis Ă jour",
"status": "PUBLISHED"
}
}
Option 2 : Avec changement d'imageâ
{
"id": "announcement-uuid",
"updateData": {
"title": "Titre mis Ă jour",
"content": "Contenu mis Ă jour",
"imageData": {
"fileName": "new-image.jpg",
"fileType": "image/jpeg",
"base64Data": "/9j/4AAQSkZJRgABAQAAAQABAAD..."
}
}
}
Note : Si imageData est fourni, l'ancienne image sera automatiquement supprimée et remplacée.
5. Supprimer une Annonceâ
Pattern : announcements.delete
Payloadâ
{
"id": "announcement-uuid"
}
Note : Suppression logique (soft delete) - le statut devient DELETED.
6. Publier/DĂ©publier une Annonceâ
Pattern : announcements.publish
Payloadâ
{
"id": "announcement-uuid",
"publishData": {
"status": "PUBLISHED"
}
}
Statuts Disponiblesâ
PUBLISHED: Publier l'annonceDRAFT: Dépublier l'annonce
7. OpĂ©rations en Lotâ
Pattern : announcements.bulk-action
Payloadâ
{
"ids": ["uuid1", "uuid2", "uuid3"],
"action": "publish"
}
Actions Disponiblesâ
publish: Publier les annonces sélectionnéesunpublish: Dépublier les annonces sélectionnéesarchive: Archiver les annonces sélectionnéesdelete: Supprimer les annonces sélectionnées
8. Statistiques des Annoncesâ
Pattern : announcements.stats
Payloadâ
{}
RĂ©ponseâ
{
"success": true,
"message": "Announcement statistics retrieved successfully",
"result": {
"totalAnnouncements": 50,
"publishedAnnouncements": 30,
"draftAnnouncements": 15,
"archivedAnnouncements": 3,
"deletedAnnouncements": 2,
"announcementsByStatus": [
{"status": "PUBLISHED", "count": 30},
{"status": "DRAFT", "count": 15}
],
"recentAnnouncements": [
{
"id": 1,
"publicId": "uuid",
"title": "DerniĂšre annonce",
"content": "Contenu...",
"status": "PUBLISHED",
"createdAt": "2024-01-15T10:00:00Z"
}
]
}
}
đ Enums et Statutsâ
Statuts d'Annonce (AnnouncementStatus)â
enum AnnouncementStatus {
DRAFT = 'DRAFT', // Brouillon
PUBLISHED = 'PUBLISHED', // Publié
ARCHIVED = 'ARCHIVED', // Archivé
DELETED = 'DELETED' // Supprimé
}
| Statut | Description | Actions Possibles |
|---|---|---|
DRAFT | Brouillon en cours de rédaction | Publier, Modifier, Supprimer |
PUBLISHED | Annonce visible publiquement | Dépublier, Archiver, Modifier |
ARCHIVED | Annonce archivée | Republier, Supprimer |
DELETED | Annonce supprimée | Restaurer |
đ FonctionnalitĂ©s AvancĂ©esâ
1. Gestion des Imagesâ
- Upload sécurisé : Validation du type de fichier (JPG, PNG, GIF, WebP)
- Limite de taille : 5MB maximum
- Stockage local : Fichiers sauvés dans
/uploads/announcements/ - Noms uniques : UUID pour éviter les conflits
- Support Base64 : Upload direct depuis le frontend
- Gestion automatique : Suppression des anciennes images lors des mises Ă jour
2. OpĂ©rations en Lotâ
- Sélection multiple : Actions sur plusieurs annonces
- Actions groupées : Publier, archiver, supprimer en une fois
- Retour détaillé : Nombre d'éléments affectés
- Validation : Vérification avant exécution
- Rollback : Annulation en cas d'erreur
3. Recherche et Filtrageâ
- Recherche textuelle : Dans titre et contenu
- Filtres par statut : Affichage conditionnel
- Tri personnalisé : Par date, titre, etc.
- Pagination : Performance optimisée
- Cache intelligent : Réduction des accÚs DB
đĄ Exemples d'Utilisationâ
CrĂ©er une Annonce avec Imageâ
{
"title": "Mise Ă jour importante du systĂšme",
"content": "Nous avons déployé une mise à jour majeure qui améliore les performances...",
"status": "DRAFT",
"imageData": {
"fileName": "update-banner.jpg",
"fileType": "image/jpeg",
"base64Data": "data:image/jpeg;base64,/9j/4AAQ..."
}
}
Publication en Lotâ
{
"ids": ["ann-001", "ann-002", "ann-003"],
"action": "publish"
}
Recherche d'Annoncesâ
{
"page": 1,
"limit": 20,
"search": "maintenance",
"status": "PUBLISHED",
"sortBy": "createdAt",
"sortOrder": "desc"
}
đŻ Le module Announcements offre une gestion complĂšte des annonces avec upload d'images, opĂ©rations en lot et recherche avancĂ©e pour une communication efficace avec les utilisateurs.