Login User Fixed

This commit is contained in:
Владимир Шалимов 2024-06-06 21:02:59 +05:00
parent 09abc8e3df
commit 40bce8348f
3 changed files with 43 additions and 12 deletions

View File

@ -10,6 +10,7 @@ import (
"golang-test/database" "golang-test/database"
"golang-test/libs" "golang-test/libs"
"golang-test/message" "golang-test/message"
"golang-test/types"
"golang-test/validators" "golang-test/validators"
"golang.org/x/crypto/bcrypt" "golang.org/x/crypto/bcrypt"
) )
@ -51,24 +52,42 @@ func RegisterUser(c *gin.Context, user database.User) {
return return
} }
func LoginUser(c *gin.Context, email, password string) *Token { func LoginUser(c *gin.Context, login types.LoginRequest) {
var user database.User var user database.User
db := database.Connector() db := database.Connector()
validate := validators.Validate validate := validators.Validate
if err := db.Where("email = ?", email).First(&user).Error; err != nil { response := message.Response{Status: 200}
return nil var token *database.Token
if err := validate.Struct(login); err != nil {
response.Error = libs.GetValidationErrors(err.(validator.ValidationErrors))
response.Status = 400
message.SendResponse(c, response)
return
} }
if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil { if err := db.Where("email = ?", login.Email).First(&user).Error; err != nil {
return nil response.Status = 404
response.Error = gin.H{
"error": "User not found",
}
} }
token := &Token{
UserID: user.ID, if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(login.Password)); err != nil {
Token: generateToken(), response.Status = 404
response.Error = gin.H{
"error": "User not found",
}
} }
if err := db.Create(token).Error; err != nil {
return nil token.Token = generateToken()
token.UserID = user.ID
user.Tokens = append(user.Tokens, token)
response.Message = gin.H{
"message": "Login Success",
} }
return token
message.SendResponse(c, response)
} }
func generateToken() string { func generateToken() string {

View File

@ -15,11 +15,18 @@ type Product struct {
Manufacturer *Manufacturer `gorm:"foreignKey:ManufacturerID;references:ID"` Manufacturer *Manufacturer `gorm:"foreignKey:ManufacturerID;references:ID"`
} }
type Token struct {
gorm.Model
UserID uint
Token string
User *User `gorm:"foreignKey:UserID;references:ID"`
}
type User struct { type User struct {
gorm.Model gorm.Model
Name string `validate:"required"` Name string `validate:"required"`
Email string `validate:"required"` Email string `validate:"required"`
Password string `validate:"required"` Password string `validate:"required"`
Products []*Product `gorm:"many2many:user_products;"` Products []*Product `gorm:"many2many:user_products;"`
Token string `gorm:"many2many:user_token;"` Tokens []*Token `gorm:"many2many:user_token;"`
} }

View File

@ -3,3 +3,8 @@ package types
type ManufacturerPatchRequest struct { type ManufacturerPatchRequest struct {
Name string `validate:"required"` Name string `validate:"required"`
} }
type LoginRequest struct {
Email string `validate:"required,email"`
Password string `validate:"required"`
}