Yimaru-BackEnd/internal/domain/content_access_tier.go

46 lines
1.4 KiB
Go

package domain
import "strings"
// ContentAccessTier controls whether learners need an active subscription to consume content.
// Effective tier cascades at read time: any PREMIUM ancestor makes descendants PREMIUM.
type ContentAccessTier string
const (
ContentAccessFree ContentAccessTier = "FREE"
ContentAccessPremium ContentAccessTier = "PREMIUM"
)
// ContentAccessTierFromDB normalizes persisted values.
func ContentAccessTierFromDB(raw string) ContentAccessTier {
switch strings.TrimSpace(strings.ToUpper(raw)) {
case string(ContentAccessFree):
return ContentAccessFree
default:
return ContentAccessPremium
}
}
// ContentAccessTierFromCreateInput resolves create body: omit → premium; explicit value validated separately.
func ContentAccessTierFromCreateInput(raw *string) ContentAccessTier {
if raw == nil || strings.TrimSpace(*raw) == "" {
return ContentAccessPremium
}
return ContentAccessTierFromDB(*raw)
}
// EffectiveContentAccessTier returns PREMIUM when any tier in the chain is PREMIUM.
func EffectiveContentAccessTier(tiers ...ContentAccessTier) ContentAccessTier {
for _, tier := range tiers {
if tier == ContentAccessPremium {
return ContentAccessPremium
}
}
return ContentAccessFree
}
// RequiresSubscription is true when the effective tier needs an active plan.
func (t ContentAccessTier) RequiresSubscription() bool {
return t == ContentAccessPremium
}