package middleware import ( "context" "github.com/google/uuid" ) type contextKey string const ( userIDKey contextKey = "user_id" authMethodKey contextKey = "auth_method" scopesKey contextKey = "scopes" ) type Scopes map[string][]string func SetUserID(ctx context.Context, id uuid.UUID) context.Context { return context.WithValue(ctx, userIDKey, id) } func GetUserID(ctx context.Context) (uuid.UUID, bool) { id, ok := ctx.Value(userIDKey).(uuid.UUID) return id, ok } func SetAuthMethod(ctx context.Context, method string) context.Context { return context.WithValue(ctx, authMethodKey, method) } func GetAuthMethod(ctx context.Context) string { m, _ := ctx.Value(authMethodKey).(string) return m } func SetScopes(ctx context.Context, scopes Scopes) context.Context { return context.WithValue(ctx, scopesKey, scopes) } func GetScopes(ctx context.Context) Scopes { s, _ := ctx.Value(scopesKey).(Scopes) return s } func HasScope(ctx context.Context, resource, action string) bool { if GetAuthMethod(ctx) == "jwt" { return true } scopes := GetScopes(ctx) if scopes == nil { return false } actions, ok := scopes[resource] if !ok { return false } for _, a := range actions { if a == action { return true } } return false }