Documentation
¶
Index ¶
- Constants
- Variables
- func ContextFromKafkaHeaders(ctx context.Context, headers []kgo.RecordHeader) context.Context
- func ContextWithSlug(ctx context.Context, slug string) context.Context
- func Middleware(resolver Resolver, log *zap.Logger) middleware.Middleware
- func MiddlewareModule(priority int, resolver Resolver) fx.Option
- func MustSlugFromContext(ctx context.Context) string
- func SaveToHeaders(ctx context.Context, headers map[string]string) map[string]string
- func SlugFromContext(ctx context.Context) (string, bool)
- type ChainResolver
- type HeaderResolver
- type Resolver
- type SubdomainResolver
Constants ¶
const HeaderKey = "x-tenant-slug"
HeaderKey is the Kafka header key for tenant slug propagation between services.
Variables ¶
var ErrInvalidTenant = errors.New("invalid tenant")
ErrInvalidTenant is returned when tenant slug is invalid.
var ErrTenantNotFound = errors.New("tenant not found")
ErrTenantNotFound is returned when tenant slug is not present in the request.
Functions ¶
func ContextFromKafkaHeaders ¶
ContextFromKafkaHeaders creates a context with the tenant ID extracted from Kafka record headers. If no tenant ID is present in headers, returns the context unchanged.
func ContextWithSlug ¶
ContextWithSlug returns a new context with the tenant slug stored.
func Middleware ¶
func Middleware(resolver Resolver, log *zap.Logger) middleware.Middleware
Middleware resolves tenant slug from the request and stores it in context.
func MiddlewareModule ¶
MiddlewareModule provides tenant resolution as an ogen middleware with the given priority.
func MustSlugFromContext ¶
MustSlugFromContext retrieves the tenant slug from the context. Panics if tenant slug is not present — use only in code paths where tenant middleware has already validated the presence.
func SaveToHeaders ¶
SaveToHeaders adds the tenant slug from context to the headers map. Returns the (possibly modified) headers map. If no tenant is in context, returns headers unchanged.
Types ¶
type ChainResolver ¶
type ChainResolver struct {
// contains filtered or unexported fields
}
ChainResolver tries multiple resolvers in order and returns the first non-empty result.
func NewChainResolver ¶
func NewChainResolver(resolvers ...Resolver) *ChainResolver
NewChainResolver creates a resolver that tries each resolver in order.
type HeaderResolver ¶
type HeaderResolver struct {
// contains filtered or unexported fields
}
HeaderResolver extracts the tenant slug from a request header.
func NewHeaderResolver ¶
func NewHeaderResolver(headerName string) *HeaderResolver
NewHeaderResolver creates a new HeaderResolver. headerName is the HTTP header key (e.g. "X-Tenant-Slug").
type Resolver ¶
type Resolver interface {
// Resolve extracts the tenant slug from the request.
// Returns the tenant slug and nil error on success.
// Returns empty string and nil if no tenant is present (optional tenant).
// Returns error if tenant resolution fails unexpectedly.
Resolve(r *http.Request) (string, error)
}
Resolver resolves a tenant slug from an HTTP request.
type SubdomainResolver ¶
type SubdomainResolver struct{}
SubdomainResolver extracts the tenant slug from the first subdomain segment of the request host. For example:
- "acme.sokolshop.com" → "acme"
- "acme.sokolshop.com:8080" → "acme"
- "sokolshop.com" → "" (no subdomain)
- "localhost" → "" (no subdomain)
func NewSubdomainResolver ¶
func NewSubdomainResolver() *SubdomainResolver
NewSubdomainResolver creates a new SubdomainResolver.