You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
3.4 KiB
137 lines
3.4 KiB
package user
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
|
|
"git.samuelpua.com/telboon/ktm-train-bot/backend/internal/common"
|
|
"github.com/go-chi/render"
|
|
"github.com/go-playground/validator/v10"
|
|
)
|
|
|
|
// User Register
|
|
// @Summary For user registration
|
|
// @Description Description
|
|
// @Tags User
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param user body UserRegisterRequest true "User registration info"
|
|
// @Success 200 {object} UserResponse
|
|
// @Failure 400 {object} common.ErrResponse
|
|
// @Router /api/v1/user/register [post]
|
|
func (env *Env) registerRouteHandler(w http.ResponseWriter, r *http.Request) {
|
|
data := &UserRegisterRequest{}
|
|
err := render.DecodeJSON(r.Body, data)
|
|
if err != nil {
|
|
render.Render(w, r, common.ErrInvalidRequest(err))
|
|
return
|
|
}
|
|
|
|
err = validator.New().Struct(data)
|
|
if err != nil {
|
|
render.Render(w, r, common.ErrValidationError(err))
|
|
return
|
|
}
|
|
|
|
createdUser, err := env.registerUser(data.Username, data.Password)
|
|
if err != nil {
|
|
render.Render(w, r, common.ErrInternalError(err))
|
|
return
|
|
}
|
|
|
|
render.Status(r, http.StatusCreated)
|
|
render.Render(w, r, env.NewUserResponse(createdUser))
|
|
}
|
|
|
|
// Login
|
|
// @Summary For user login
|
|
// @Description Description
|
|
// @Tags User
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param user body UserLoginRequest true "User Login info"
|
|
// @Success 200 {object} UserResponse
|
|
// @Failure 400 {object} common.ErrResponse
|
|
// @Router /api/v1/user/login [post]
|
|
func (env *Env) loginRouteHandler(w http.ResponseWriter, r *http.Request) {
|
|
data := &UserLoginRequest{}
|
|
err := render.DecodeJSON(r.Body, data)
|
|
if err != nil {
|
|
render.Render(w, r, common.ErrInvalidRequest(err))
|
|
return
|
|
}
|
|
|
|
err = validator.New().Struct(data)
|
|
if err != nil {
|
|
render.Render(w, r, common.ErrValidationError(err))
|
|
return
|
|
}
|
|
|
|
loginUser, err := env.checkLogin(data.Username, data.Password)
|
|
if err != nil {
|
|
render.Render(w, r, common.ErrInternalError(err))
|
|
return
|
|
}
|
|
|
|
sessionToken, err := env.createSession(loginUser)
|
|
if err != nil {
|
|
render.Render(w, r, common.ErrInternalError(err))
|
|
return
|
|
}
|
|
|
|
loginCookie := http.Cookie{
|
|
Name: env.CookieString,
|
|
Value: sessionToken,
|
|
MaxAge: 7776000,
|
|
Path: "/",
|
|
}
|
|
http.SetCookie(w, &loginCookie)
|
|
|
|
render.Render(w, r, env.NewUserResponse(loginUser))
|
|
}
|
|
|
|
// Logout
|
|
// @Summary For user logout
|
|
// @Description Description
|
|
// @Tags User
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Success 200 {object} common.TextResponse
|
|
// @Failure 400 {object} common.ErrResponse
|
|
// @Router /api/v1/user/logout [post]
|
|
func (env *Env) logoutRouteHandler(w http.ResponseWriter, r *http.Request) {
|
|
cookie, err := r.Cookie(env.CookieString)
|
|
if err != nil {
|
|
err = errors.New("user not logged in")
|
|
render.Render(w, r, common.ErrInternalError(err))
|
|
return
|
|
}
|
|
|
|
err = env.logout(cookie.Value)
|
|
if err != nil {
|
|
render.Render(w, r, common.ErrInternalError(err))
|
|
return
|
|
}
|
|
|
|
render.Render(w, r, common.NewGenericTextResponse("Ok", "Successfully logged out"))
|
|
}
|
|
|
|
// Check current user
|
|
// @Summary Returns current logged in user
|
|
// @Description Description
|
|
// @Tags User
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Success 200 {object} UserResponse
|
|
// @Failure 400 {object} common.ErrResponse
|
|
// @Router /api/v1/user/me [get]
|
|
func (env *Env) meRouteHandler(w http.ResponseWriter, r *http.Request) {
|
|
ctx := r.Context()
|
|
currUser, ok := ctx.Value(UserContextKey).(*User)
|
|
if !ok {
|
|
err := errors.New("user not logged in")
|
|
render.Render(w, r, common.ErrInternalError(err))
|
|
return
|
|
}
|
|
render.Render(w, r, env.NewUserResponse(currUser))
|
|
}
|