Files
crawlab/core/controllers/login.go
2024-06-14 15:42:50 +08:00

65 lines
1.5 KiB
Go

package controllers
import (
"github.com/crawlab-team/crawlab/core/constants"
"github.com/crawlab-team/crawlab/core/container"
"github.com/crawlab-team/crawlab/core/errors"
"github.com/crawlab-team/crawlab/core/interfaces"
"github.com/crawlab-team/crawlab/core/models/models"
"github.com/gin-gonic/gin"
"net/http"
)
var LoginController ActionController
func getLoginActions() []Action {
loginCtx := newLoginContext()
return []Action{
{Method: http.MethodPost, Path: "/login", HandlerFunc: loginCtx.login},
{Method: http.MethodPost, Path: "/logout", HandlerFunc: loginCtx.logout},
}
}
type loginContext struct {
userSvc interfaces.UserService
}
func (ctx *loginContext) login(c *gin.Context) {
var u models.User
if err := c.ShouldBindJSON(&u); err != nil {
HandleErrorBadRequest(c, err)
return
}
token, loggedInUser, err := ctx.userSvc.Login(&interfaces.UserLoginOptions{
Username: u.Username,
Password: u.Password,
})
if err != nil {
HandleErrorUnauthorized(c, errors.ErrorUserUnauthorized)
return
}
c.Set(constants.UserContextKey, loggedInUser)
HandleSuccessWithData(c, token)
}
func (ctx *loginContext) logout(c *gin.Context) {
c.Set(constants.UserContextKey, nil)
HandleSuccess(c)
}
func newLoginContext() *loginContext {
// context
ctx := &loginContext{}
// dependency injection
if err := container.GetContainer().Invoke(func(
userSvc interfaces.UserService,
) {
ctx.userSvc = userSvc
}); err != nil {
panic(err)
}
return ctx
}