package handlers import ( "encoding/json" "gestion/db" "log" "net/http" "github.com/gin-gonic/gin" ) // GetClientNotifications retourne les notifications du client connecté // GET /api/v1/notifications func GetClientNotifications(c *gin.Context) { username := c.GetString("username") if username == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "Non authentifié"}) return } notifKey := "notifications:" + username // Récupérer toutes les notifications (max 50) results, err := db.Redis.LRange(db.RedisCtx, notifKey, 0, 49).Result() if err != nil { log.Printf("❌ [GET_NOTIFICATIONS] Erreur Redis: %v", err) c.JSON(http.StatusInternalServerError, gin.H{"error": "Erreur récupération notifications"}) return } type Notification struct { CommandID int `json:"command_id"` Type string `json:"type"` Message string `json:"message"` CreatedAt string `json:"created_at"` Read bool `json:"read"` } notifications := make([]Notification, 0, len(results)) unreadCount := 0 for _, raw := range results { var n Notification if err := json.Unmarshal([]byte(raw), &n); err != nil { continue } notifications = append(notifications, n) if !n.Read { unreadCount++ } } log.Printf("✅ [GET_NOTIFICATIONS] %d notifications pour %s (%d non lues)", len(notifications), username, unreadCount) c.JSON(http.StatusOK, gin.H{ "notifications": notifications, "unread_count": unreadCount, "total": len(notifications), }) } // GetLivreurNotifications retourne les notifications du livreur connecté // GET /api/v1/livreur/notifications func GetLivreurNotifications(c *gin.Context) { username := c.GetString("username") if username == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "Non authentifié"}) return } notifKey := "notifications:" + username results, err := db.Redis.LRange(db.RedisCtx, notifKey, 0, 49).Result() if err != nil { log.Printf("❌ [LIVREUR_NOTIFICATIONS] Erreur Redis: %v", err) c.JSON(http.StatusInternalServerError, gin.H{"error": "Erreur récupération notifications"}) return } type Notification struct { CommandID int `json:"command_id"` Type string `json:"type"` Message string `json:"message"` CreatedAt string `json:"created_at"` Read bool `json:"read"` } notifications := make([]Notification, 0, len(results)) unreadCount := 0 for _, raw := range results { var n Notification if err := json.Unmarshal([]byte(raw), &n); err != nil { continue } notifications = append(notifications, n) if !n.Read { unreadCount++ } } log.Printf("✅ [LIVREUR_NOTIFICATIONS] %d notifications pour %s (%d non lues)", len(notifications), username, unreadCount) c.JSON(http.StatusOK, gin.H{ "notifications": notifications, "unread_count": unreadCount, "total": len(notifications), }) } // MarkLivreurNotificationsRead marque toutes les notifications du livreur comme lues // POST /api/v1/livreur/notifications/read func MarkLivreurNotificationsRead(c *gin.Context) { username := c.GetString("username") if username == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "Non authentifié"}) return } notifKey := "notifications:" + username results, err := db.Redis.LRange(db.RedisCtx, notifKey, 0, -1).Result() if err != nil { log.Printf("❌ [LIVREUR_MARK_READ] Erreur Redis LRange: %v", err) c.JSON(http.StatusInternalServerError, gin.H{"error": "Erreur lecture notifications"}) return } markedCount := 0 for i, raw := range results { var n map[string]interface{} if err := json.Unmarshal([]byte(raw), &n); err != nil { continue } if read, ok := n["read"].(bool); ok && read { continue } n["read"] = true updated, _ := json.Marshal(n) db.Redis.LSet(db.RedisCtx, notifKey, int64(i), string(updated)) markedCount++ } log.Printf("✅ [LIVREUR_MARK_READ] %d notifications marquées lues pour %s", markedCount, username) c.JSON(http.StatusOK, gin.H{ "success": true, "marked_count": markedCount, }) } // MarkNotificationsRead marque toutes les notifications comme lues // POST /api/v1/notifications/read func MarkNotificationsRead(c *gin.Context) { username := c.GetString("username") if username == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "Non authentifié"}) return } notifKey := "notifications:" + username // Récupérer toutes les notifications results, err := db.Redis.LRange(db.RedisCtx, notifKey, 0, -1).Result() if err != nil { log.Printf("❌ [MARK_NOTIFICATIONS_READ] Erreur Redis LRange: %v", err) c.JSON(http.StatusInternalServerError, gin.H{"error": "Erreur lecture notifications"}) return } // Réécrire chaque notification avec read=true markedCount := 0 for i, raw := range results { var n map[string]interface{} if err := json.Unmarshal([]byte(raw), &n); err != nil { continue } if read, ok := n["read"].(bool); ok && read { continue } n["read"] = true updated, _ := json.Marshal(n) db.Redis.LSet(db.RedisCtx, notifKey, int64(i), string(updated)) markedCount++ } log.Printf("✅ [MARK_NOTIFICATIONS_READ] %d notifications marquées lues pour %s", markedCount, username) c.JSON(http.StatusOK, gin.H{ "success": true, "marked_count": markedCount, }) }