diff --git a/backend/handlers/main.go b/backend/handlers/main.go index 727529d..7f8ea35 100644 --- a/backend/handlers/main.go +++ b/backend/handlers/main.go @@ -539,20 +539,21 @@ func AdminUserDelete(db *gorm.DB) http.HandlerFunc { id := mux.Vars(r)["id"] var user models.User - if err := db.First(&user, id).Error; err != nil { + if err := db.Unscoped().First(&user, id).Error; err != nil { http.Error(w, "Utilisateur introuvable", http.StatusNotFound) return } - if err := db.Delete(&user).Error; err != nil { + // Suppression définitive + if err := db.Unscoped().Delete(&user).Error; err != nil { http.Error(w, "Erreur suppression", http.StatusInternalServerError) return } - // On retourne du HTML vide car on swap "outerHTML" w.WriteHeader(http.StatusOK) w.Write([]byte("")) } } + diff --git a/backend/models/models.go b/backend/models/models.go index 3dc6c36..25b3e65 100644 --- a/backend/models/models.go +++ b/backend/models/models.go @@ -18,7 +18,6 @@ type User struct { ID uint `gorm:"primaryKey"` CreatedAt time.Time UpdatedAt time.Time - DeletedAt gorm.DeletedAt `gorm:"index"` NameClient string `gorm:"not null"` Password string `gorm:"not null"` // hashé avec bcrypt diff --git a/backend/renders/renders.go b/backend/renders/renders.go index 8856502..0b91560 100644 --- a/backend/renders/renders.go +++ b/backend/renders/renders.go @@ -137,10 +137,11 @@ func AdminUserEditForm(db *gorm.DB) http.HandlerFunc { } func AdminUserUpdate(db *gorm.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { - idStr := mux.Vars(r)["id"] - id, err := strconv.Atoi(idStr) - if err != nil { - http.Error(w, "ID invalide", http.StatusBadRequest) + id := mux.Vars(r)["id"] + + var user models.User + if err := db.First(&user, id).Error; err != nil { + http.Error(w, "Utilisateur introuvable", http.StatusNotFound) return } @@ -149,33 +150,50 @@ func AdminUserUpdate(db *gorm.DB) http.HandlerFunc { return } - var user models.User - if err := db.First(&user, id).Error; err != nil { - http.Error(w, "Utilisateur introuvable", http.StatusNotFound) - return + email := r.FormValue("email") + password := r.FormValue("password") + role := r.FormValue("role") + isActive := r.FormValue("is_active") == "on" + waToken := r.FormValue("whatsapp_token") + waPhoneID := r.FormValue("whatsapp_phone_number_id") + monthlyCreditsStr := r.FormValue("monthly_credits") + + user.Email = email + user.Role = models.UserRole(role) + user.IsActive = isActive + user.WhatsappToken = waToken + user.WhatsappPhoneNumberID = waPhoneID + + if monthlyCreditsStr != "" { + if val, err := strconv.Atoi(monthlyCreditsStr); err == nil { + user.MonthlyCredits = uint(val) + } } - // Mise à jour des champs - user.Email = r.FormValue("email") - user.Role = models.UserRole(r.FormValue("role")) - user.IsActive = r.FormValue("is_active") == "on" + if password != "" { + hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) + if err != nil { + http.Error(w, "Erreur de hachage du mot de passe", http.StatusInternalServerError) + return + } + user.Password = string(hash) + } if err := db.Save(&user).Error; err != nil { - http.Error(w, "Erreur mise à jour", http.StatusInternalServerError) + http.Error(w, "Erreur lors de la mise à jour", http.StatusInternalServerError) return } - // Réafficher la ligne utilisateur mise à jour - data := map[string]interface{}{ - "User": user, - } - renderPartial(w, "admin_user_row", data) + w.Header().Set("HX-Trigger", "userUpdated") + w.WriteHeader(http.StatusOK) + w.Write([]byte("
Utilisateur mis à jour avec succès.
")) } } + func AdminConversationPage(db *gorm.DB) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { idStr := mux.Vars(r)["id"]