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