All checks were successful
continuous-integration/drone/push Build is passing
Reviewed-on: #14
91 lines
2.4 KiB
Go
91 lines
2.4 KiB
Go
package rest
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"net/http"
|
|
|
|
"gitea.dwysokinski.me/twhelp/sessions/internal/domain"
|
|
"gitea.dwysokinski.me/twhelp/sessions/internal/router/rest/internal/model"
|
|
"github.com/go-chi/chi/v5"
|
|
)
|
|
|
|
const (
|
|
sidMaxBytes = 512
|
|
)
|
|
|
|
//counterfeiter:generate -o internal/mock/session_service.gen.go . SessionService
|
|
type SessionService interface {
|
|
CreateOrUpdate(ctx context.Context, params domain.CreateSessionParams) (domain.Session, error)
|
|
Get(ctx context.Context, userID int64, serverKey string) (domain.Session, error)
|
|
}
|
|
|
|
type sessionHandler struct {
|
|
svc SessionService
|
|
}
|
|
|
|
// @ID createOrUpdateSession
|
|
// @Summary Create or update a session
|
|
// @Description Create or update a session
|
|
// @Tags users,sessions
|
|
// @Accept plain
|
|
// @Success 204
|
|
// @Failure 400 {object} model.ErrorResp
|
|
// @Failure 401 {object} model.ErrorResp
|
|
// @Failure 500 {object} model.ErrorResp
|
|
// @Security ApiKeyAuth
|
|
// @Param serverKey path string true "Server key"
|
|
// @Param request body string true "SID"
|
|
// @Router /user/sessions/{serverKey} [put]
|
|
func (h *sessionHandler) createOrUpdate(w http.ResponseWriter, r *http.Request) {
|
|
ctx := r.Context()
|
|
chiCtx := chi.RouteContext(ctx)
|
|
user, _ := userFromContext(ctx)
|
|
|
|
b, err := io.ReadAll(io.LimitReader(r.Body, sidMaxBytes))
|
|
if err != nil {
|
|
renderErr(w, err)
|
|
return
|
|
}
|
|
|
|
params, err := domain.NewCreateSessionParams(chiCtx.URLParam("serverKey"), string(b), user.ID)
|
|
if err != nil {
|
|
renderErr(w, err)
|
|
return
|
|
}
|
|
|
|
_, err = h.svc.CreateOrUpdate(ctx, params)
|
|
if err != nil {
|
|
renderErr(w, err)
|
|
return
|
|
}
|
|
|
|
w.WriteHeader(http.StatusNoContent)
|
|
}
|
|
|
|
// @ID getCurrentUserSession
|
|
// @Summary Get a session
|
|
// @Description Get a session
|
|
// @Tags users,sessions
|
|
// @Success 200 {object} model.GetSessionResp
|
|
// @Failure 400 {object} model.ErrorResp
|
|
// @Failure 401 {object} model.ErrorResp
|
|
// @Failure 404 {object} model.ErrorResp
|
|
// @Failure 500 {object} model.ErrorResp
|
|
// @Security ApiKeyAuth
|
|
// @Param serverKey path string true "Server key"
|
|
// @Router /user/sessions/{serverKey} [get]
|
|
func (h *sessionHandler) getCurrentUser(w http.ResponseWriter, r *http.Request) {
|
|
ctx := r.Context()
|
|
chiCtx := chi.RouteContext(ctx)
|
|
user, _ := userFromContext(ctx)
|
|
|
|
sess, err := h.svc.Get(ctx, user.ID, chiCtx.URLParam("serverKey"))
|
|
if err != nil {
|
|
renderErr(w, err)
|
|
return
|
|
}
|
|
|
|
renderJSON(w, http.StatusOK, model.NewGetSessionResp(sess))
|
|
}
|