186 lines
4.6 KiB
Go
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)
|
||
|
|
}
|
||
|
|
}
|