feat(assist-api): added correct handlers for 403 and 404 on getByID

This commit is contained in:
Alexander 2025-04-18 16:24:00 +02:00
parent 685f784691
commit 985ce2812c
4 changed files with 29 additions and 19 deletions

View file

@ -41,7 +41,7 @@ func main() {
defer redisClient.Close()
prefix := api.NoPrefix
builder, err := assist.NewServiceBuilder(log, cfg, webMetrics, dbMetric, pgConn, redisClient, prefix)
builder, err := assist.NewServiceBuilder(log, cfg, webMetrics, dbMetric, pgConn, redisClient)
if err != nil {
log.Fatal(ctx, "can't init services: %s", err)
}
@ -51,7 +51,7 @@ func main() {
log.Fatal(ctx, "failed while creating router: %s", err)
}
router.AddHandlers(prefix, builder.AssistAPI)
router.AddMiddlewares(builder.RateLimiter.Middleware, builder.AuditTrail.Middleware)
router.AddMiddlewares(builder.RateLimiter.Middleware)
server.Run(ctx, log, &cfg.HTTP, router)
}

View file

@ -3,6 +3,7 @@ package api
import (
"context"
"encoding/json"
"errors"
"fmt"
"net/http"
"time"
@ -13,6 +14,7 @@ import (
"openreplay/backend/pkg/assist/service"
"openreplay/backend/pkg/logger"
"openreplay/backend/pkg/server/api"
"openreplay/backend/pkg/sessionmanager"
)
type handlersImpl struct {
@ -124,7 +126,13 @@ func (e *handlersImpl) socketsListByProject(w http.ResponseWriter, r *http.Reque
resp, err := e.assist.GetByID(projectKey, sessionID)
if err != nil {
e.responser.ResponseWithError(e.log, r.Context(), w, http.StatusInternalServerError, err, startTime, r.URL.Path, bodySize)
if errors.Is(err, sessionmanager.ErrSessionNotFound) {
e.responser.ResponseWithError(e.log, r.Context(), w, http.StatusNotFound, err, startTime, r.URL.Path, bodySize)
} else if errors.Is(err, sessionmanager.ErrSessionNotBelongToProject) {
e.responser.ResponseWithError(e.log, r.Context(), w, http.StatusForbidden, err, startTime, r.URL.Path, bodySize)
} else {
e.responser.ResponseWithError(e.log, r.Context(), w, http.StatusInternalServerError, err, startTime, r.URL.Path, bodySize)
}
return
}
response := map[string]interface{}{
@ -183,7 +191,13 @@ func (e *handlersImpl) socketsLiveBySession(w http.ResponseWriter, r *http.Reque
resp, err := e.assist.GetByID(projectKey, sessionID)
if err != nil {
e.responser.ResponseWithError(e.log, r.Context(), w, http.StatusInternalServerError, err, startTime, r.URL.Path, bodySize)
if errors.Is(err, sessionmanager.ErrSessionNotFound) {
e.responser.ResponseWithError(e.log, r.Context(), w, http.StatusNotFound, err, startTime, r.URL.Path, bodySize)
} else if errors.Is(err, sessionmanager.ErrSessionNotBelongToProject) {
e.responser.ResponseWithError(e.log, r.Context(), w, http.StatusForbidden, err, startTime, r.URL.Path, bodySize)
} else {
e.responser.ResponseWithError(e.log, r.Context(), w, http.StatusInternalServerError, err, startTime, r.URL.Path, bodySize)
}
return
}
response := map[string]interface{}{

View file

@ -1,49 +1,42 @@
package assist
import (
"openreplay/backend/pkg/db/redis"
"openreplay/backend/pkg/projects"
"openreplay/backend/pkg/sessionmanager"
"time"
"openreplay/backend/internal/config/assist"
assistAPI "openreplay/backend/pkg/assist/api"
"openreplay/backend/pkg/assist/service"
"openreplay/backend/pkg/db/postgres/pool"
"openreplay/backend/pkg/db/redis"
"openreplay/backend/pkg/logger"
"openreplay/backend/pkg/metrics/database"
"openreplay/backend/pkg/metrics/web"
"openreplay/backend/pkg/projects"
"openreplay/backend/pkg/server/api"
"openreplay/backend/pkg/server/limiter"
"openreplay/backend/pkg/server/tracer"
"openreplay/backend/pkg/sessionmanager"
)
type ServicesBuilder struct {
RateLimiter *limiter.UserRateLimiter
AuditTrail tracer.Tracer
AssistAPI api.Handlers
}
func NewServiceBuilder(log logger.Logger, cfg *assist.Config, webMetrics web.Web, dbMetrics database.Database, pgconn pool.Pool, redis *redis.Client, prefix string) (*ServicesBuilder, error) {
func NewServiceBuilder(log logger.Logger, cfg *assist.Config, webMetrics web.Web, dbMetrics database.Database, pgconn pool.Pool, redis *redis.Client) (*ServicesBuilder, error) {
projectsManager := projects.New(log, pgconn, redis, dbMetrics)
sessManager, err := sessionmanager.New(log, cfg, redis.Redis)
if err != nil {
return nil, err
}
sessManager.Start()
assist := service.NewAssist(log, pgconn, projectsManager, sessManager)
auditrail, err := tracer.NewTracer(log, pgconn, dbMetrics)
if err != nil {
return nil, err
}
assistManager := service.NewAssist(log, pgconn, projectsManager, sessManager)
responser := api.NewResponser(webMetrics)
handlers, err := assistAPI.NewHandlers(log, cfg, responser, assist)
handlers, err := assistAPI.NewHandlers(log, cfg, responser, assistManager)
if err != nil {
return nil, err
}
return &ServicesBuilder{
RateLimiter: limiter.NewUserRateLimiter(10, 30, 1*time.Minute, 5*time.Minute),
AuditTrail: auditrail,
AssistAPI: handlers,
}, nil
}

View file

@ -368,6 +368,9 @@ func (sm *sessionManagerImpl) updateSessions() {
sm.log.Debug(sm.ctx, "Session processing cycle completed in %v. Processed %d sessions", duration, len(sm.cache))
}
var ErrSessionNotFound = errors.New("session not found")
var ErrSessionNotBelongToProject = errors.New("session does not belong to the project")
func (sm *sessionManagerImpl) GetByID(projectID, sessionID string) (interface{}, error) {
if sessionID == "" {
return nil, fmt.Errorf("session ID is required")
@ -378,10 +381,10 @@ func (sm *sessionManagerImpl) GetByID(projectID, sessionID string) (interface{},
sessionData, exists := sm.cache[sessionID]
if !exists {
return nil, fmt.Errorf("session not found")
return nil, ErrSessionNotFound
}
if sessionData.ProjectID != projectID {
return nil, fmt.Errorf("session does not belong to the project")
return nil, ErrSessionNotBelongToProject
}
return sessionData.Raw, nil
}