diff --git a/pkg/api/routes.go b/pkg/api/routes.go index ea35ce7..2871fae 100644 --- a/pkg/api/routes.go +++ b/pkg/api/routes.go @@ -14,8 +14,7 @@ func Routes(s *gin.Engine, db *pg.DB) { ver := s.Group(configs.Prefix) api := ver.Group("api", middleware.Auth) - register := ver.Group("register") - login := ver.Group("login") + auth := ver.Group("auth") wallet := ver.Group("wallet", middleware.Auth) transaction := ver.Group("transaction", middleware.Auth) transactionType := ver.Group("transaction-type", middleware.Auth) @@ -27,8 +26,7 @@ func Routes(s *gin.Engine, db *pg.DB) { transactionTypeService := services.TransactionTypeService{Db: db} controllers.NewApiController(&apiService, api) - controllers.NewRegisterController(&usersService, register) - controllers.NewLoginController(&usersService, login) + controllers.NewAuthController(&usersService, auth) controllers.NewWalletsController(&walletService, wallet) controllers.NewTransactionController(&transactionService, transaction) controllers.NewTransactionTypeController(&transactionTypeService, transactionType) diff --git a/pkg/controllers/auth.go b/pkg/controllers/auth.go new file mode 100644 index 0000000..eda0de8 --- /dev/null +++ b/pkg/controllers/auth.go @@ -0,0 +1,70 @@ +package controllers + +import ( + "net/http" + "wallet-api/pkg/middleware" + "wallet-api/pkg/models" + "wallet-api/pkg/services" + + "github.com/gin-gonic/gin" +) + +type AuthController struct { + UsersService *services.UsersService +} + +func NewAuthController(rs *services.UsersService, s *gin.RouterGroup) *AuthController { + rc := new(AuthController) + rc.UsersService = rs + + s.POST("login", rc.PostLogin) + s.POST("register", rc.PostRegister) + s.DELETE("deactivate", middleware.Auth, rc.Delete) + + return rc +} + +func (rc *AuthController) PostLogin(c *gin.Context) { + body := new(models.Login) + if err := c.ShouldBindJSON(&body); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + returnedUser, exceptionReturn := rc.UsersService.Login(body) + + if exceptionReturn.Message != "" { + c.JSON(exceptionReturn.StatusCode, exceptionReturn) + } else { + c.JSON(200, returnedUser) + } +} + +func (rc *AuthController) PostRegister(c *gin.Context) { + body := new(models.User) + body.Init() + body.IsActive = true + if err := c.ShouldBindJSON(body); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + returnedUser, exceptionReturn := rc.UsersService.Create(body) + + if exceptionReturn.Message != "" { + c.JSON(exceptionReturn.StatusCode, exceptionReturn) + } else { + c.JSON(200, returnedUser.Payload()) + } +} +func (rc *AuthController) Delete(c *gin.Context) { + auth := new(models.Auth) + authGet := c.MustGet("auth") + auth.Id = authGet.(*models.Auth).Id + + mr, er := rc.UsersService.Deactivate(auth) + + if er.Message != "" { + c.JSON(er.StatusCode, er) + } else { + c.JSON(200, mr) + } +} diff --git a/pkg/controllers/login.go b/pkg/controllers/login.go deleted file mode 100644 index 88d38f3..0000000 --- a/pkg/controllers/login.go +++ /dev/null @@ -1,38 +0,0 @@ -package controllers - -import ( - "net/http" - "wallet-api/pkg/models" - "wallet-api/pkg/services" - - "github.com/gin-gonic/gin" -) - -type LoginController struct { - UsersService *services.UsersService -} - -func NewLoginController(rs *services.UsersService, s *gin.RouterGroup) *LoginController { - rc := new(LoginController) - rc.UsersService = rs - - s.POST("", rc.Post) - - return rc -} - -func (rc *LoginController) Post(c *gin.Context) { - body := new(models.Login) - if err := c.ShouldBindJSON(&body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } - returnedUser, exceptionReturn := rc.UsersService.Login(body) - - if exceptionReturn.Message != "" { - c.JSON(exceptionReturn.StatusCode, exceptionReturn) - } else { - c.JSON(200, returnedUser) - } - -} diff --git a/pkg/controllers/register.go b/pkg/controllers/register.go deleted file mode 100644 index ea44d86..0000000 --- a/pkg/controllers/register.go +++ /dev/null @@ -1,39 +0,0 @@ -package controllers - -import ( - "net/http" - "wallet-api/pkg/models" - "wallet-api/pkg/services" - - "github.com/gin-gonic/gin" -) - -type RegisterController struct { - UsersService *services.UsersService -} - -func NewRegisterController(rs *services.UsersService, s *gin.RouterGroup) *RegisterController { - rc := new(RegisterController) - rc.UsersService = rs - - s.POST("", rc.Post) - - return rc -} - -func (rc *RegisterController) Post(c *gin.Context) { - body := new(models.User) - body.Init() - if err := c.ShouldBindJSON(body); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } - returnedUser, exceptionReturn := rc.UsersService.Create(body) - - if exceptionReturn.Message != "" { - c.JSON(exceptionReturn.StatusCode, exceptionReturn) - } else { - c.JSON(200, returnedUser.Payload()) - } - -} diff --git a/pkg/models/models.go b/pkg/models/models.go index f1ab492..96ff832 100644 --- a/pkg/models/models.go +++ b/pkg/models/models.go @@ -12,3 +12,7 @@ type FilteredResponse struct { } type ResponseFunc func(*gin.Context) *[]interface{} + +type MessageResponse struct { + Message string `json:"message"` +} diff --git a/pkg/models/register.go b/pkg/models/register.go index dba2322..01ab894 100644 --- a/pkg/models/register.go +++ b/pkg/models/register.go @@ -3,6 +3,7 @@ package models type User struct { tableName struct{} `pg:"users,alias:users"` BaseModel + IsActive bool `json:"isActive" pg:"is_active"` Username string `json:"username" pg:"username"` Password string `json:"password" pg:"password"` Email string `json:"email" pg:"email"` diff --git a/pkg/services/users.go b/pkg/services/users.go index 0529d8a..b1e722e 100644 --- a/pkg/services/users.go +++ b/pkg/services/users.go @@ -57,6 +57,13 @@ func (us *UsersService) Login(loginBody *models.Login) (*models.Token, *models.E return tokenPayload, exceptionReturn } + if !check.IsActive { + exceptionReturn.Message = "Can't log in. User is deactivated." + exceptionReturn.ErrorCode = "400106" + exceptionReturn.StatusCode = 400 + return tokenPayload, exceptionReturn + } + if bcrypt.CompareHashAndPassword([]byte(check.Password), []byte(loginBody.Password)) != nil { exceptionReturn.Message = "Incorrect password" exceptionReturn.ErrorCode = "400104" @@ -72,6 +79,34 @@ func (us *UsersService) Login(loginBody *models.Login) (*models.Token, *models.E return tokenPayload, exceptionReturn } +func (us *UsersService) Deactivate(auth *models.Auth) (*models.MessageResponse, *models.Exception) { + mm := new(models.MessageResponse) + me := new(models.Exception) + um := new(models.User) + + err := us.Db.Model(um).Where("? = ?", pg.Ident("id"), auth.Id).Select() + + if err != nil { + me.ErrorCode = "404101" + me.Message = "User not found" + me.StatusCode = 404 + return mm, me + } + um.IsActive = false + _, err = us.Db.Model(um).Where("? = ?", pg.Ident("id"), auth.Id).Update() + + if err != nil { + me.ErrorCode = "400105" + me.Message = "Could not deactivate user" + me.StatusCode = 400 + return mm, me + } + + mm.Message = "User successfully deactivated." + + return mm, me +} + func CreateToken(user *models.User) (string, error) { atClaims := jwt.MapClaims{} atClaims["authorized"] = true