125 lines
4.4 KiB
Markdown
125 lines
4.4 KiB
Markdown
# 🎉 RÉSOLUTION FINALE - Support Ticket Notifications
|
|
|
|
## ✅ Problème résolu !
|
|
|
|
Le problème était **une question de permissions Supabase**.
|
|
|
|
### 🔍 Diagnostic
|
|
|
|
L'erreur était :
|
|
```
|
|
AuthApiError: User not allowed
|
|
code: 'not_admin'
|
|
status: 403
|
|
```
|
|
|
|
### 🎯 Cause racine
|
|
|
|
`sb.auth.admin.getUserById()` nécessite des **permissions administrateur** (clé `service_role`), mais le code utilisait `createSbServer()` qui utilise la clé `anon` (publique).
|
|
|
|
### 🔧 Solution appliquée
|
|
|
|
**Fichiers modifiés :**
|
|
|
|
1. **`/app/api/tickets/[id]/recipient-info/route.ts`**
|
|
```typescript
|
|
// Ajout de l'import
|
|
import { createSbServer, createSbServiceRole } from "@/lib/supabaseServer";
|
|
|
|
// Utilisation du service role pour getUserById
|
|
const sbAdmin = createSbServiceRole();
|
|
const { data: creatorUser } = await sbAdmin.auth.admin.getUserById(ticket.created_by);
|
|
```
|
|
|
|
2. **`/app/(app)/staff/tickets/[id]/page.tsx`**
|
|
```typescript
|
|
// Ajout de l'import
|
|
import { createSbServer, createSbServiceRole } from "@/lib/supabaseServer";
|
|
|
|
// Utilisation du service role pour getUserById
|
|
const sbAdmin = createSbServiceRole();
|
|
const { data: creatorUser } = await sbAdmin.auth.admin.getUserById(ticket.created_by);
|
|
```
|
|
|
|
### 🎬 Actions à faire maintenant
|
|
|
|
1. **Le serveur va recharger automatiquement** (hot reload)
|
|
2. **Rechargez la page** du ticket dans votre navigateur
|
|
3. **Vérifiez** :
|
|
- Le nom du créateur devrait s'afficher correctement
|
|
- Le modal de confirmation devrait s'afficher quand vous cliquez sur "Envoyer"
|
|
|
|
### 📋 Ce qui devrait maintenant fonctionner
|
|
|
|
✅ **Sur la page `/staff/tickets/[id]` :**
|
|
```
|
|
┌─────────────────────────────────────────┐
|
|
│ Organisation: Nom de l'entreprise │
|
|
│ Ouvert par: Jean (ou email) │ ← Maintenant correct !
|
|
└─────────────────────────────────────────┘
|
|
```
|
|
|
|
✅ **Dans le modal de confirmation :**
|
|
```
|
|
┌─────────────────────────────────────────┐
|
|
│ Confirmer l'envoi de votre réponse │
|
|
│ │
|
|
│ Destinataire │
|
|
│ 📧 jean@example.com │
|
|
│ Jean │ ← Maintenant correct !
|
|
│ │
|
|
│ Message │
|
|
│ [Votre message...] │
|
|
│ │
|
|
│ [Annuler] [Envoyer ✉️] │ ← Fonctionne !
|
|
└─────────────────────────────────────────┘
|
|
```
|
|
|
|
### 🔍 Logs attendus dans le terminal
|
|
|
|
Vous devriez maintenant voir :
|
|
```
|
|
📋 [ticket page] Ticket: { id: '...', created_by: '...', ... }
|
|
📋 [ticket page] Tentative getUserById pour: ...
|
|
📋 [ticket page] getUserById result: { hasData: true, hasUser: true, hasEmail: true, error: null }
|
|
📋 [ticket page] Email: user@example.com
|
|
📋 [ticket page] User metadata: { "display_name": "Jean", ... }
|
|
✅ [ticket page] Nom trouvé dans display_name: Jean
|
|
```
|
|
|
|
Et pour l'API :
|
|
```
|
|
📋 [recipient-info] Ticket ID: ...
|
|
📋 [recipient-info] Created by: ...
|
|
📋 [recipient-info] getUserById result: { hasData: true, hasUser: true, hasEmail: true, error: null }
|
|
📋 [recipient-info] User metadata: { "display_name": "Jean", ... }
|
|
✅ [recipient-info] Nom trouvé dans display_name: Jean
|
|
```
|
|
|
|
### 🎓 Leçon apprise
|
|
|
|
**Important à retenir :**
|
|
|
|
1. **`auth.admin.getUserById()`** nécessite la clé `service_role`
|
|
2. Utiliser `createSbServer()` pour les opérations normales
|
|
3. Utiliser `createSbServiceRole()` pour les opérations admin
|
|
4. Toujours vérifier les permissions **AVANT** d'utiliser le service role
|
|
|
|
### 📚 Documentation
|
|
|
|
Consultez :
|
|
- `SUPPORT_TICKET_NOTIFICATIONS_FIXES.md` - Documentation complète des corrections
|
|
- `GUIDE_DEMARRAGE_TICKETS.md` - Guide de démarrage et débogage
|
|
|
|
---
|
|
|
|
## 🚀 Testez maintenant !
|
|
|
|
1. Rechargez la page du ticket
|
|
2. Vérifiez que le nom s'affiche
|
|
3. Essayez d'envoyer un message (sans cocher "Note interne")
|
|
4. Le modal devrait s'afficher avec toutes les infos !
|
|
|
|
---
|
|
|
|
*Résolution finale - 14 octobre 2025*
|