diff --git a/controllers/userController.go b/controllers/userController.go index 04c3a6e..8d1bf19 100644 --- a/controllers/userController.go +++ b/controllers/userController.go @@ -10,6 +10,7 @@ import ( "golang-test/database" "golang-test/libs" "golang-test/message" + "golang-test/types" "golang-test/validators" "golang.org/x/crypto/bcrypt" ) @@ -51,24 +52,42 @@ func RegisterUser(c *gin.Context, user database.User) { return } -func LoginUser(c *gin.Context, email, password string) *Token { +func LoginUser(c *gin.Context, login types.LoginRequest) { var user database.User db := database.Connector() validate := validators.Validate - if err := db.Where("email = ?", email).First(&user).Error; err != nil { - return nil + response := message.Response{Status: 200} + 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 { - return nil + if err := db.Where("email = ?", login.Email).First(&user).Error; err != nil { + response.Status = 404 + response.Error = gin.H{ + "error": "User not found", + } } - token := &Token{ - UserID: user.ID, - Token: generateToken(), + + if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(login.Password)); err != nil { + 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 { diff --git a/database/models.go b/database/models.go index 9c18ac9..d20d354 100644 --- a/database/models.go +++ b/database/models.go @@ -15,11 +15,18 @@ type Product struct { 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 { gorm.Model Name string `validate:"required"` Email string `validate:"required"` Password string `validate:"required"` Products []*Product `gorm:"many2many:user_products;"` - Token string `gorm:"many2many:user_token;"` + Tokens []*Token `gorm:"many2many:user_token;"` } diff --git a/types/types.go b/types/types.go index 684ff34..eabbbdb 100644 --- a/types/types.go +++ b/types/types.go @@ -3,3 +3,8 @@ package types type ManufacturerPatchRequest struct { Name string `validate:"required"` } + +type LoginRequest struct { + Email string `validate:"required,email"` + Password string `validate:"required"` +}