2026-07-23 16:47:40 +08:00

62 lines
1.4 KiB
Go

package appctx
import (
"context"
"strings"
)
const (
DefaultAppCode = "lalu"
HeaderAppCode = "X-App-Code"
)
type contextKey struct{}
type externalScopeKey struct{}
// ExternalScope contains only server-derived portal authority. Business modules may
// consume it to narrow owner-service calls, but must never construct it from request JSON.
type ExternalScope struct {
AccountID uint64
LinkedAppUserID int64
IdentityType string
RegionID int64
OwnerUserIDs []int64
}
func Normalize(value string) string {
value = strings.ToLower(strings.TrimSpace(value))
if value == "" {
return DefaultAppCode
}
return value
}
func WithContext(ctx context.Context, value string) context.Context {
return context.WithValue(ctx, contextKey{}, Normalize(value))
}
func FromContext(ctx context.Context) string {
if ctx == nil {
return DefaultAppCode
}
value, _ := ctx.Value(contextKey{}).(string)
return Normalize(value)
}
func WithExternalScope(ctx context.Context, scope ExternalScope) context.Context {
scope.OwnerUserIDs = append([]int64(nil), scope.OwnerUserIDs...)
return context.WithValue(ctx, externalScopeKey{}, scope)
}
func ExternalScopeFromContext(ctx context.Context) (ExternalScope, bool) {
if ctx == nil {
return ExternalScope{}, false
}
scope, ok := ctx.Value(externalScopeKey{}).(ExternalScope)
if !ok {
return ExternalScope{}, false
}
scope.OwnerUserIDs = append([]int64(nil), scope.OwnerUserIDs...)
return scope, true
}