core/gating/gating.go
Alex Dunmow 99fc63ddfd feat: WO-PS-002–008 SDK type packages
- rbac/: Role type, constants, HasPermission, RoleFromString
- blocks/: BlockFunc, BlockMeta, BlockContext, context accessors, BlockRegistry interface
- templates/: TemplateFunc, meta types, TemplateRegistry interface
- auth/: Claims, PublicClaims, context extractors
- content/: Content interface, AuthorProfile/PageInfo/PostInfo types
- settings/: Settings interface, map accessor helpers
- gating/: AccessRule, AccessResult, EvaluateAccess, Gating interface
- crypto/: Crypto interface (Encrypt/Decrypt)
- render/: BlockNoteToHTML standalone renderer
- video/: ParseEmbedURL, EmbedIframeURL
- ai/: ToolDefinition, ToolResult, ToolRegistry interface

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-30 22:32:29 +08:00

46 lines
1.1 KiB
Go

package gating
import (
"context"
"github.com/google/uuid"
)
// AccessRule defines content access requirements.
type AccessRule struct {
MinTierLevel int
OverrideTierID string
TeaserMode string // "hard", "soft", "none"
TeaserPercent int
}
// AccessResult is the result of evaluating access for a user.
type AccessResult struct {
HasAccess bool
TeaserMode string
TeaserPercent int
RequiredLevel int
}
// EvaluateAccess checks whether a user's tier level grants access based on the rule.
func EvaluateAccess(userTierLevel int, rule *AccessRule) AccessResult {
if rule == nil {
return AccessResult{HasAccess: true}
}
if userTierLevel >= rule.MinTierLevel {
return AccessResult{HasAccess: true}
}
return AccessResult{
HasAccess: false,
TeaserMode: rule.TeaserMode,
TeaserPercent: rule.TeaserPercent,
RequiredLevel: rule.MinTierLevel,
}
}
// Gating provides gating access for plugins.
type Gating interface {
GetSubscriberTierLevel(ctx context.Context, userID uuid.UUID) (int, error)
EvaluateAccess(userTierLevel int, rule *AccessRule) AccessResult
}