diff --git a/FEATURE_GROUP_CALENDAR_COLOR.md b/FEATURE_GROUP_CALENDAR_COLOR.md index 9984edb..4104290 100644 --- a/FEATURE_GROUP_CALENDAR_COLOR.md +++ b/FEATURE_GROUP_CALENDAR_COLOR.md @@ -88,6 +88,56 @@ const colorPalette = [ --- +### 4. **Suppression automatique du calendrier** (`/app/api/groups/[groupId]/route.ts`) ✨ **NOUVEAU** + +#### Modifications au DELETE endpoint : + +Lorsqu'un groupe est supprimé, le calendrier associé est maintenant automatiquement supprimé : + +1. **Récupération du nom du groupe** + - Appel à Keycloak avant suppression pour obtenir le nom du groupe + +2. **Suppression du calendrier** + - Recherche du calendrier nommé `"Groupe: {nom}"` + - Suppression via `prisma.calendar.deleteMany()` + - Logs en cas de succès ou d'échec + +3. **Suppression du groupe** + - Suppression du groupe de Keycloak + - Même si la suppression du calendrier échoue, le groupe est quand même supprimé + +#### Impact : +- ✅ Plus de calendriers orphelins dans la base +- ✅ Nettoyage automatique de la base de données +- ✅ Agenda plus propre après suppression de groupes + +--- + +### 5. **Enrichissement API groupes utilisateur** (`/app/api/users/[userId]/groups/route.ts`) ✨ **NOUVEAU** + +#### Modifications au GET endpoint : + +L'API qui récupère les groupes d'un utilisateur enrichit maintenant les données avec les couleurs des calendriers : + +1. **Récupération des groupes** + - Appel à Keycloak pour obtenir les groupes de l'utilisateur + +2. **Enrichissement avec couleurs** + - Pour chaque groupe, recherche du calendrier associé dans Prisma + - Ajout de la propriété `calendarColor` à chaque groupe + - Valeur `null` si pas de calendrier trouvé + +3. **Retour enrichi** + - Les groupes retournés contiennent maintenant `calendarColor` + - Visible immédiatement dans la page Vision + +#### Impact : +- ✅ La page Vision affiche les bonnes couleurs +- ✅ Pas besoin de requêtes supplémentaires côté client +- ✅ Une seule API call pour tout charger + +--- + ## 🔄 Flux de données ### Chargement initial : @@ -129,9 +179,10 @@ La couleur du calendrier de groupe est maintenant visible dans : - Liste des calendriers (pastille à gauche) - Événements dans le calendrier (barre colorée) -4. **`/vision`** - Page visioconférences - - Calendrier des réunions - - Événements du jour +4. **`/vision`** - Page visioconférences ✨ **NOUVEAU** + - Cercle coloré autour de l'icône groupe + - Icône en blanc si couleur personnalisée, en bleu sinon + - Couleur par défaut : `#DBEAFE` (bleu clair) 5. **Widgets calendrier** - Tous les composants calendrier - `calendar-widget.tsx` @@ -167,6 +218,20 @@ La couleur du calendrier de groupe est maintenant visible dans : 4. Aller sur `/agenda` 5. ✅ Vérifier : Couleur visible dans le calendrier +### Test 5 : Affichage dans Vision ✨ **NOUVEAU** +1. Modifier la couleur d'un groupe +2. Aller sur `/vision` +3. ✅ Vérifier : Le cercle autour de l'icône du groupe a la bonne couleur +4. ✅ Vérifier : L'icône est en blanc si couleur personnalisée + +### Test 6 : Suppression du calendrier ✨ **NOUVEAU** +1. Créer un nouveau groupe +2. Vérifier dans `/agenda` que le calendrier est créé +3. Supprimer le groupe dans `/missions/equipe` +4. Aller sur `/agenda` +5. ✅ Vérifier : Le calendrier du groupe a été supprimé +6. ✅ Vérifier : Aucune erreur dans la console + --- ## 📁 Fichiers modifiés @@ -175,6 +240,9 @@ La couleur du calendrier de groupe est maintenant visible dans : - `app/api/groups/[groupId]/calendar/route.ts` (nouveau endpoint API) ### Fichiers modifiés : + +#### 1. Gestion des couleurs : + - `components/groups/groups-table.tsx` - Import `Palette` de lucide-react - Ajout interface `calendarColor?` à Group @@ -196,6 +264,32 @@ La couleur du calendrier de groupe est maintenant visible dans : - Dialog de sélection de couleur - Affichage icône colorée +#### 2. Affichage dans Vision : ✨ **NOUVEAU** + +- `app/vision/page.tsx` + - Ajout `calendarColor?` à interface `Group` + - Modification affichage du cercle groupe pour utiliser `group.calendarColor` + - Style dynamique : couleur personnalisée ou défaut `#DBEAFE` + - Icône blanche si couleur personnalisée, bleue sinon + +#### 3. Suppression automatique : ✨ **NOUVEAU** + +- `app/api/groups/[groupId]/route.ts` + - Endpoint DELETE modifié + - Import `prisma` et `logger` + - Récupération des détails du groupe avant suppression + - Suppression du calendrier associé via `prisma.calendar.deleteMany()` + - Logs détaillés + +#### 4. Enrichissement API : ✨ **NOUVEAU** + +- `app/api/users/[userId]/groups/route.ts` + - Import `prisma` + - Endpoint GET enrichi + - Recherche du calendrier pour chaque groupe + - Ajout de `calendarColor` aux données retournées + - Gestion d'erreurs pour chaque groupe + --- ## 🔮 Améliorations futures possibles @@ -231,6 +325,29 @@ La couleur du calendrier de groupe est maintenant visible dans : --- +## 🐛 Problèmes résolus + +### ✅ Problème 1 : Calendriers orphelins après suppression de groupe +**Symptôme** : Quand on supprimait un groupe, son calendrier restait dans la base de données et s'affichait dans l'agenda. + +**Solution** : Modification du endpoint DELETE pour supprimer automatiquement le calendrier associé lors de la suppression du groupe. + +**Commit** : Ajout de la suppression automatique dans `/app/api/groups/[groupId]/route.ts` + +--- + +### ✅ Problème 2 : Couleurs non visibles dans la page Vision +**Symptôme** : Les couleurs de calendrier personnalisées n'apparaissaient pas dans `/vision`, tous les groupes avaient la même couleur bleue. + +**Solution** : +1. Enrichissement de l'API `/api/users/[userId]/groups` pour inclure `calendarColor` +2. Modification de l'interface `Group` dans `vision/page.tsx` +3. Affichage dynamique des couleurs dans l'UI + +**Commit** : Enrichissement API et affichage dans Vision + +--- + ## 🐛 Problèmes connus Aucun problème connu pour le moment. @@ -261,5 +378,21 @@ Pour toute question ou problème : --- **Date de création** : 20 janvier 2026 -**Version** : 1.0 +**Dernière mise à jour** : 21 janvier 2026 +**Version** : 1.2 **Auteur** : Senior Developer Assistant + +### 📝 Changelog + +#### v1.2 (21 janvier 2026) +- ✨ Ajout : Suppression automatique du calendrier lors de la suppression d'un groupe +- ✨ Ajout : Affichage des couleurs dans la page Vision (`/vision`) +- 🔧 Modification : Enrichissement de l'API `/api/users/[userId]/groups` avec les couleurs +- 📚 Documentation : Ajout de nouveaux tests et problèmes résolus + +#### v1.1 (20 janvier 2026) +- 🐛 Fix : Problèmes de déploiement Docker +- 📚 Documentation : Ajout du guide de déploiement + +#### v1.0 (20 janvier 2026) +- ✨ Version initiale avec modification des couleurs de calendrier diff --git a/app/api/groups/[groupId]/route.ts b/app/api/groups/[groupId]/route.ts index 954d64b..46919ac 100644 --- a/app/api/groups/[groupId]/route.ts +++ b/app/api/groups/[groupId]/route.ts @@ -144,6 +144,35 @@ export async function DELETE(req: Request, props: { params: Promise<{ groupId: s const token = await getAdminToken(); + // Get group details first to find the calendar name + const groupResponse = await fetch( + `${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/groups/${params.groupId}`, + { + headers: { + Authorization: `Bearer ${token}`, + }, + } + ); + + if (groupResponse.ok) { + const group = await groupResponse.json(); + const groupName = group.name; + + // Delete the associated calendar from database + try { + await prisma.calendar.deleteMany({ + where: { + name: `Groupe: ${groupName}`, + }, + }); + logger.info('Group calendar deleted', { groupName, groupId: params.groupId }); + } catch (calendarError) { + logger.error('Failed to delete group calendar', { groupName, error: calendarError }); + // Continue with group deletion even if calendar deletion fails + } + } + + // Delete the group from Keycloak const response = await fetch( `${process.env.KEYCLOAK_BASE_URL}/admin/realms/${process.env.KEYCLOAK_REALM}/groups/${params.groupId}`, { diff --git a/app/api/users/[userId]/groups/route.ts b/app/api/users/[userId]/groups/route.ts index d5561f5..4e6bc9b 100644 --- a/app/api/users/[userId]/groups/route.ts +++ b/app/api/users/[userId]/groups/route.ts @@ -1,6 +1,7 @@ import { getServerSession } from "next-auth/next"; import { authOptions } from "@/app/api/auth/options"; import { NextResponse } from "next/server"; +import { prisma } from "@/lib/prisma"; async function getAdminToken() { try { @@ -63,7 +64,35 @@ export async function GET(req: Request, props: { params: Promise<{ userId: strin } const groups = await groupsResponse.json(); - return NextResponse.json(groups); + + // Enrich groups with calendar colors from database + const enrichedGroups = await Promise.all( + groups.map(async (group: any) => { + try { + const calendar = await prisma.calendar.findFirst({ + where: { + name: `Groupe: ${group.name}`, + }, + select: { + color: true, + }, + }); + + return { + ...group, + calendarColor: calendar?.color || null, + }; + } catch (error) { + console.error(`Error fetching calendar color for group ${group.name}:`, error); + return { + ...group, + calendarColor: null, + }; + } + }) + ); + + return NextResponse.json(enrichedGroups); } catch (error) { console.error("Error in get user groups:", error); return NextResponse.json({ error: "Internal server error" }, { status: 500 }); diff --git a/app/vision/page.tsx b/app/vision/page.tsx index 2673873..b14727a 100644 --- a/app/vision/page.tsx +++ b/app/vision/page.tsx @@ -31,6 +31,7 @@ interface Group { id: string; name: string; path: string; + calendarColor?: string | null; } interface Mission { @@ -1084,8 +1085,13 @@ export default function VisionPage() { >
-
- +
+

diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 2b45fbb..f443556 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -35,7 +35,7 @@ services: # Optionnel: sauvegardes automatiques # - ./backups:/backups healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-neah_user}"] + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"] interval: 10s timeout: 5s retries: 5