From 8afc68814e9a8a0ca5a1154ade203759cba4b8e6 Mon Sep 17 00:00:00 2001 From: songl Date: Thu, 6 Jun 2024 20:03:22 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A3=D0=B6=D0=B0=D1=81=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- controllers/userController.go | 130 +++++++++++++++++++++++++++++++--- database/models.go | 8 +-- main.go | 10 +-- 3 files changed, 132 insertions(+), 16 deletions(-) diff --git a/controllers/userController.go b/controllers/userController.go index 9eba8e0..e4bffec 100644 --- a/controllers/userController.go +++ b/controllers/userController.go @@ -4,16 +4,130 @@ package controllers import ( "crypto/rand" - "fmt" + "encoding/base64" + "github.com/gin-gonic/gin" + "github.com/go-playground/validator/v10" + "golang-test/database" + "golang-test/libs" + "golang-test/message" + "golang-test/validators" + "golang.org/x/crypto/bcrypt" + "gorm.io/gorm" ) -func tokenGenerator() string { - b := make([]byte, 4) - rand.Read(b) - return fmt.Sprintf("%x", b) +//func tokenGenerator() string { +// b := make([]byte, 4) +// rand.Read(b) +// return fmt.Sprintf("%x", b) +//} + +// func main() { +// a := tokenGenerator() +// fmt.Println(a) +// } +type Token struct { + gorm.Model + UserID uint + token string } -func main() { - a := tokenGenerator() - fmt.Println(a) +func RegisterUser(c *gin.Context, user database.User) { + db := database.Connector() + validate := validators.Validate + response := message.Response{Status: 200} + if err := validate.Struct(user); err != nil { + response.Error = libs.GetValidationErrors(err.(validator.ValidationErrors)) + response.Status = 400 + message.SendResponse(c, response) + return + } + hash, err := bcrypt.GenerateFromPassword([]byte(user.Password), 12) + if err != nil { + return + } + user.Password = string(hash) + if err := db.Create(user).Error; err != nil { + return + } + return +} + +func LoginUser(c *gin.Context, email, password string) *Token { + var user database.User + db := database.Connector() + validate := validators.Validate + if err := db.Where("email = ?", email).First(&user).Error; err != nil { + return nil + } + if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil { + return nil + } + token := &Token{ + UserID: user.ID, + Token: generateToken(), + } + if err := db.Create(token).Error; err != nil { + return nil + } + return token +} + +func generateToken() string { + b := make([]byte, 4) + if _, err := rand.Read(b); err != nil { + return "" + } + return base64.StdEncoding.EncodeToString(b) +} + +func GetUserByToken(c *gin.Context, token string) database.User { + var tokenStruct Token + + db := database.Connector() + validate := validators.Validate + if err := db.Where("token = ?", token).First(&tokenStruct).Error; err != nil { + return nil + } + var user database.User + if err := db.First(&user, tokenStruct.UserID).Error; err != nil { + return err + } + return user +} + +func EditUser(c *gin.Context, token string, user database.User) { + db := database.Connector() + validate := validators.Validate + u := GetUserByToken(c, token) + if err := validate.Struct(user); err != nil { + return + } + if user.Name != "" { + u.Name = user.Name + } + if user.Email != "" { + u.Email = user.Email + } + if user.Password != "" { + hash, err := bcrypt.GenerateFromPassword([]byte(user.Password), 12) + if err != nil { + return + } + u.Password = string(hash) + } + if err := db.Save(u).Error; err != nil { + return + } + return +} + +func DeleteUser(c *gin.Context, token string) { + u, err := GetUserByToken(db, token) + if err != nil { + return + } + if err := db.Delete(u).Error; err != nil { + return + } + return } diff --git a/database/models.go b/database/models.go index 53b468c..9c18ac9 100644 --- a/database/models.go +++ b/database/models.go @@ -9,7 +9,7 @@ type Manufacturer struct { type Product struct { gorm.Model - Name string `validate:"required` + Name string `validate:"required"` Price uint `validate:"required"` ManufacturerID uint `validate:"required"` Manufacturer *Manufacturer `gorm:"foreignKey:ManufacturerID;references:ID"` @@ -17,9 +17,9 @@ type Product struct { type User struct { gorm.Model - Name string - Email string - Password string + Name string `validate:"required"` + Email string `validate:"required"` + Password string `validate:"required"` Products []*Product `gorm:"many2many:user_products;"` Token string `gorm:"many2many:user_token;"` } diff --git a/main.go b/main.go index a59b5ee..654ed42 100644 --- a/main.go +++ b/main.go @@ -70,12 +70,14 @@ func main() { controllers.EditManufacture(c, manufacturer) }) + //Для создания пользователя r.POST("/registration", func(c *gin.Context) { - type registrationForm struct { - name string - email string - password string + var manufacturer database.Manufacturer + if err := c.ShouldBind(&manufacturer); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) } + + controllers.CreateManufacturer(c, manufacturer) }) err := r.Run() if err != nil {