package controllers import ( "canguidev/shelfy/internal/models" "canguidev/shelfy/query" "context" "log" "net/http" "strconv" "github.com/gin-gonic/gin" "golang.org/x/crypto/bcrypt" "gorm.io/gorm" ) // CreateUser crée un nouvel utilisateur func CreateUser(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { c.Header("Content-Type", "application/json") if c.Request.Body == nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Request body is empty"}) return } if c.ContentType() != "application/json" { c.JSON(http.StatusUnsupportedMediaType, gin.H{"error": "Content-Type must be application/json"}) return } var u models.User if err := c.ShouldBindJSON(&u); err != nil { log.Printf("Erreur JSON : %v", err) c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON format"}) return } hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost) if err != nil { log.Printf("Erreur hachage mot de passe : %v", err) c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to hash password"}) return } u.Password = string(hashedPassword) q := query.Use(db) if err := q.User.Create(&u); err != nil { log.Printf("Erreur création utilisateur : %v", err) c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to create user"}) return } c.JSON(http.StatusOK, gin.H{"message": "User created successfully"}) } } // UpdateUser met à jour un utilisateur func UpdateUser(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { c.Header("Content-Type", "application/json") if c.Request.Body == nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Request body is empty"}) return } if c.ContentType() != "application/json" { c.JSON(http.StatusUnsupportedMediaType, gin.H{"error": "Content-Type must be application/json"}) return } idStr := c.Param("id") id, err := strconv.Atoi(idStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"}) return } q := query.Use(db) u := q.User ctx := context.Background() user, err := u.WithContext(ctx).Where(u.ID.Eq(uint(id))).First() if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "User not found"}) return } var usr models.User if err := c.ShouldBindJSON(&usr); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid JSON format"}) return } hashedPassword, err := bcrypt.GenerateFromPassword([]byte(usr.Password), bcrypt.DefaultCost) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to hash password"}) return } user.Name = usr.Name user.Username = usr.Username user.Email = usr.Email user.Password = string(hashedPassword) if err := u.Save(user); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to update user"}) return } c.JSON(http.StatusOK, gin.H{"message": "User updated successfully"}) } } // DeleteUser supprime un utilisateur func DeleteUser(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { c.Header("Content-Type", "application/json") idStr := c.Param("id") id, err := strconv.Atoi(idStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"}) return } q := query.Use(db) u := q.User ctx := context.Background() user, err := u.WithContext(ctx).Where(u.ID.Eq(uint(id))).First() if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "User not found"}) return } if _,err := u.Delete(user); err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to delete user"}) return } c.JSON(http.StatusOK, gin.H{"message": "User deleted successfully"}) } } // ReadAllUser retourne tous les utilisateurs func ReadAllUser(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { c.Header("Content-Type", "application/json") q := query.Use(db) users, err := q.User.Find() if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Failed to fetch users"}) return } c.JSON(http.StatusOK, users) } } // FindUserById retourne un utilisateur par son ID func FindUserById(db *gorm.DB) gin.HandlerFunc { return func(c *gin.Context) { c.Header("Content-Type", "application/json") idStr := c.Param("id") id, err := strconv.Atoi(idStr) if err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid user ID"}) return } q := query.Use(db) u := q.User ctx := context.Background() user, err := u.WithContext(ctx).Where(u.ID.Eq(uint(id))).First() if err != nil { c.JSON(http.StatusNotFound, gin.H{"error": "User not found"}) return } c.JSON(http.StatusOK, user) } }