shelfy-v2/internal/controllers/userController.go
2025-07-27 16:26:30 +02:00

186 lines
4.6 KiB
Go

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)
}
}