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)) }