sessions/internal/router/rest/session.go
Dawid Wysokiński 786cc60e38
All checks were successful
continuous-integration/drone/push Build is passing
feat: add a new REST endpoint - GET /api/v1/user/sessions/:server (#14)
Reviewed-on: #14
2022-11-25 05:55:31 +00:00

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