package handlers import ( "context" "errors" "net/http" "github.com/labstack/echo/v4" "github.com/memohai/memoh/internal/accounts" "github.com/memohai/memoh/internal/auth" "github.com/memohai/memoh/internal/bots" "github.com/memohai/memoh/internal/identity" ) // RequireChannelIdentityID extracts and validates the channel identity ID from the request context. func RequireChannelIdentityID(c echo.Context) (string, error) { channelIdentityID, err := auth.UserIDFromContext(c) if err != nil { return "", err } if err := identity.ValidateChannelIdentityID(channelIdentityID); err != nil { return "", echo.NewHTTPError(http.StatusBadRequest, err.Error()) } return channelIdentityID, nil } // AuthorizeBotAccess validates that the given identity has access to the specified bot. func AuthorizeBotAccess(ctx context.Context, botService *bots.Service, accountService *accounts.Service, channelIdentityID, botID string, policy bots.AccessPolicy) (bots.Bot, error) { if botService == nil || accountService == nil { return bots.Bot{}, echo.NewHTTPError(http.StatusInternalServerError, "bot services not configured") } isAdmin, err := accountService.IsAdmin(ctx, channelIdentityID) if err != nil { return bots.Bot{}, echo.NewHTTPError(http.StatusInternalServerError, err.Error()) } bot, err := botService.AuthorizeAccess(ctx, channelIdentityID, botID, isAdmin, policy) if err != nil { if errors.Is(err, bots.ErrBotNotFound) { return bots.Bot{}, echo.NewHTTPError(http.StatusNotFound, "bot not found") } if errors.Is(err, bots.ErrBotAccessDenied) { return bots.Bot{}, echo.NewHTTPError(http.StatusForbidden, "bot access denied") } return bots.Bot{}, echo.NewHTTPError(http.StatusInternalServerError, err.Error()) } return bot, nil }