From 3b2b4b947c9be5dbf7261908b6bb9c95db97dc66 Mon Sep 17 00:00:00 2001 From: LeonG11 Date: Tue, 23 Jun 2026 14:41:08 +0300 Subject: [PATCH] feat: add register for users --- backend/handlers/user_handler.go | 47 +++++++++++++++++++++++++++++--- backend/main.go | 7 +++-- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/backend/handlers/user_handler.go b/backend/handlers/user_handler.go index 10de248..1fa2e04 100644 --- a/backend/handlers/user_handler.go +++ b/backend/handlers/user_handler.go @@ -67,16 +67,13 @@ func Register(c *gin.Context) { FirstName string `json:"first_name" binding:"required"` LastName string `json:"last_name" binding:"required"` Phone string `json:"phone"` - Role string `json:"role" binding:"required"` } - // 1. Проверяем входящие данные if err := c.ShouldBindJSON(&input); err != nil { c.JSON(http.StatusBadRequest, gin.H{"error": "Ошибка валидации ", "details": err.Error()}) return } - // 2. Хешируем пароль (чтобы не хранить его в открытом виде) hashedPassword, err := bcrypt.GenerateFromPassword([]byte(input.Password), bcrypt.DefaultCost) if err != nil { c.JSON(http.StatusInternalServerError, gin.H{"error": "Ошибка при шифровании пароля"}) @@ -90,7 +87,7 @@ func Register(c *gin.Context) { FirstName: input.FirstName, LastName: input.LastName, Phone: input.Phone, - Role: input.Role, // по умолчанию + Role: "customer", } // 4. Сохраняем в базу через GORM @@ -101,6 +98,48 @@ func Register(c *gin.Context) { c.JSON(http.StatusOK, gin.H{"message": "Пользователь успешно зарегистрирован"}) } +func RegisterAdmin(c *gin.Context) { + var input struct { + Username string `json:"username" binding:"required"` + Password string `json:"password" binding:"required,min=8"` + FirstName string `json:"first_name" binding:"required"` + LastName string `json:"last_name" binding:"required"` + Phone string `json:"phone"` + Role string `json:"role"` + } + + if err := c.ShouldBindJSON(&input); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Ошибка валидации ", "details": err.Error()}) + return + } + + if input.Role != "Рабочий" && input.Role != "Админ" { + c.JSON(http.StatusForbidden, gin.H{"error": "Недопустимая роль"}) + return + } + + hashedPassword, err := bcrypt.GenerateFromPassword([]byte(input.Password), bcrypt.DefaultCost) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Ошибка при шифровании пароля"}) + return + } + + user := models.User{ + Username: input.Username, + Password: string(hashedPassword), + FirstName: input.FirstName, + LastName: input.LastName, + Phone: input.Phone, + Role: input.Role, + } + + if err := database.DB.Create(&user).Error; err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Ошибка при регистрации пользователя", "details": err.Error()}) + return + } + c.JSON(http.StatusOK, gin.H{"message": "Пользователь успешно зарегистрирован"}) +} + func UpdateProfile(c *gin.Context) { var input models.UpdateUserInput diff --git a/backend/main.go b/backend/main.go index b492f14..e5a82f8 100644 --- a/backend/main.go +++ b/backend/main.go @@ -43,6 +43,7 @@ func main() { api.GET("/items/:id", handlers.GetItem) api.GET("/items/", handlers.GetAllItems) api.GET("/getCategories", handlers.GetCategories) + api.POST("/register", handlers.Register) protected.Use(middleware.AuthRequired()) { protected.DELETE("/items/:id", handlers.DeleteItem) @@ -57,11 +58,11 @@ func main() { protected.GET("/orders/:id", handlers.GetOrder) } - admin := protected.Group("/") + admin := protected.Group("/admin") admin.Use(middleware.AdminOnly()) { - admin.POST("/register", handlers.Register) - admin.GET("/admin/orders", handlers.GetAllOrders) + admin.POST("/register", handlers.RegisterAdmin) + admin.GET("/orders", handlers.GetAllOrders) } }