Files

72 lines
2.3 KiB
Go
Raw Permalink Normal View History

package billing
import (
"context"
"strings"
)
// IsEphemeralTestPlanName reports integration-test plan rows that should stay
// out of the admin "catalog" filter (consume-contention-*, claim-test-plan-*, multi-plan-*).
func IsEphemeralTestPlanName(name string) bool {
n := strings.ToLower(strings.TrimSpace(name))
if n == "" {
return false
}
return strings.HasPrefix(n, "consume-contention-") ||
strings.HasPrefix(n, "claim-test-plan-") ||
strings.HasPrefix(n, "multi-plan-")
}
// IsObsoleteLadderPlanName reports pre-v2 public ladder leftovers that must never
// appear on Choose your plan (Basic / Professional / Merkur / Mini).
func IsObsoleteLadderPlanName(name string) bool {
switch strings.ToLower(strings.TrimSpace(name)) {
case "basic", "professional", "mini", "merkur", "meur", "merkur trial":
return true
default:
return false
}
}
// EnsurePlanCatalogHygiene soft-hides obsolete ladder leftovers and forces EPREL
// on for every plan (public EU data — never credit-gated).
//
// Soft-hide: mark Basic/Professional/… as is_custom with an archived description
// so they never look like self-serve product rows. Rows are not deleted (may be
// referenced by history). Ephemeral test plans are left in DB but filtered in admin UI.
func (s *Service) EnsurePlanCatalogHygiene(ctx context.Context) error {
if s == nil || s.Pool == nil {
return nil
}
_, err := s.Pool.Exec(ctx, `
UPDATE plans SET
is_custom = true,
description = CASE
WHEN description IS NULL OR btrim(description) = '' THEN
'Archived pre-v2 plan (hidden from Choose your plan)'
WHEN description LIKE 'Archived pre-v2%' THEN description
ELSE 'Archived pre-v2 plan (hidden from Choose your plan). ' || description
END,
updated_at = now()
WHERE lower(name) IN ('basic', 'professional', 'mini', 'merkur', 'meur', 'merkur trial')
AND is_custom = false`)
if err != nil {
return err
}
// Never leave an explicit capability.eprel=false override — EPREL is free on all plans.
_, err = s.Pool.Exec(ctx, `
UPDATE plans
SET features = features || '{"capability.eprel": true}'::jsonb,
updated_at = now()
WHERE features ? 'capability.eprel'
AND (features->>'capability.eprel') = 'false'`)
if err != nil {
if isUndefinedColumn(err) {
return nil
}
return err
}
return nil
}