46 lines
1.4 KiB
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
|
|
}
|