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 }