shelfy/internal/users/users.go
2025-06-06 09:42:55 +02:00

231 lines
6.0 KiB
Go

package users
import (
"app/shelfly/internal/models"
"app/shelfly/query"
"context"
"encoding/json"
"fmt"
"log"
"net/http"
"strconv"
"github.com/gorilla/mux"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
)
func CreateUser(db *gorm.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
// Vérifier si le corps de la requête est vide
if r.Body == nil {
w.WriteHeader(http.StatusBadRequest)
log.Println("Le corps de la requête est vide")
fmt.Fprintf(w, `{"error": "Request body is empty"}`)
return
}
// Vérifier le Content-Type
if r.Header.Get("Content-Type") != "application/json" {
w.WriteHeader(http.StatusUnsupportedMediaType)
log.Println("Content-Type invalide. Requis: application/json")
fmt.Fprintf(w, `{"error": "Content-Type must be application/json"}`)
return
}
// Lire et décoder le JSON
var u models.User
if err := json.NewDecoder(r.Body).Decode(&u); err != nil {
w.WriteHeader(http.StatusBadRequest)
log.Printf("Erreur lors du décodage du JSON : %v", err)
fmt.Fprintf(w, `{"error": "Invalid JSON format"}`)
return
}
// Hacher le mot de passe de l'utilisateur
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(u.Password), bcrypt.DefaultCost)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
log.Printf("Erreur lors du hachage du mot de passe : %v", err)
fmt.Fprintf(w, `{"error": "Failed to hash password"}`)
return
}
// Remplacer le mot de passe par le hachage
u.Password = string(hashedPassword)
// Initialiser le query builder
q := query.Use(db)
// Créer l'utilisateur
if err := q.User.Create(&u); err != nil {
w.WriteHeader(http.StatusInternalServerError)
log.Printf("Erreur lors de la création de l'utilisateur : %v", err)
fmt.Fprintf(w, `{"error": "Failed to create user"}`)
return
}
log.Printf("Utilisateur créé avec succès : %v", u)
w.WriteHeader(http.StatusOK)
fmt.Fprintf(w, `{"message": "User created successfully"}`)
}
}
func UpdateUser(db *gorm.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
// Vérifier si le corps de la requête est vide
if r.Body == nil {
w.WriteHeader(http.StatusBadRequest)
log.Println("Le corps de la requête est vide")
fmt.Fprintf(w, `{"error": "Request body is empty"}`)
return
}
// Vérifier le Content-Type
if r.Header.Get("Content-Type") != "application/json" {
w.WriteHeader(http.StatusUnsupportedMediaType)
log.Println("Content-Type invalide. Requis: application/json")
fmt.Fprintf(w, `{"error": "Content-Type must be application/json"}`)
return
}
params := mux.Vars(r)
q := query.Use(db)
id, err := strconv.Atoi(params["id"])
if err != nil {
//panic(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
u := q.User
ctx := context.Background()
user, err := u.WithContext(ctx).Where(u.ID.Eq(uint(id))).First()
if err != nil {
//panic(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
log.Printf("Utilisateur update avec succès : %v", user)
// Lire et décoder le JSON
var usr models.User
if err := json.NewDecoder(r.Body).Decode(&usr); err != nil {
w.WriteHeader(http.StatusBadRequest)
log.Printf("Erreur lors du décodage du JSON : %v", err)
fmt.Fprintf(w, `{"error": "Invalid JSON format"}`)
return
}
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(usr.Password), bcrypt.DefaultCost)
if err != nil {
//panic(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
user.Name = usr.Name
user.Username = usr.Username
user.Email = usr.Email
user.Password = string(hashedPassword)
u.Save(user)
w.WriteHeader(http.StatusOK)
}
}
func DeleteUser(db *gorm.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
// Vérifier si le corps de la requête est vide
if r.Body == nil {
w.WriteHeader(http.StatusBadRequest)
log.Println("Le corps de la requête est vide")
fmt.Fprintf(w, `{"error": "Request body is empty"}`)
return
}
// Vérifier le Content-Type
if r.Header.Get("Content-Type") != "application/json" {
w.WriteHeader(http.StatusUnsupportedMediaType)
log.Println("Content-Type invalide. Requis: application/json")
fmt.Fprintf(w, `{"error": "Content-Type must be application/json"}`)
return
}
params := mux.Vars(r)
q := query.Use(db)
id, err := strconv.Atoi(params["id"])
if err != nil {
//panic(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
u := q.User
ctx := context.Background()
user, err := u.WithContext(ctx).Where(u.ID.Eq(uint(id))).First()
if err != nil {
//panic(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
u.Delete(user)
log.Printf("Utilisateur delete avec succès : %v", user)
w.WriteHeader(http.StatusOK)
}
}
func ReadAllUser(db *gorm.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
q := query.Use(db)
data,err :=q.User.Find()
if err != nil {
//panic(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
log.Printf("Utilisateur read avec succès : %v", data)
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(data)
}
}
func FindUserById (db *gorm.DB) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
params := mux.Vars(r)
q := query.Use(db)
id, err := strconv.Atoi(params["id"])
log.Printf("Utilisateur ID avec succès : %v", id)
if err != nil {
//panic(err)
w.WriteHeader(http.StatusInternalServerError)
return
}
u := q.User
ctx := context.Background()
user, err := u.WithContext(ctx).Where(u.ID.Eq(uint(id))).First()
log.Printf("Utilisateur read avec succès : %v", user)
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(user)
}}