72 lines
2.3 KiB
Go
72 lines
2.3 KiB
Go
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
|
||
|
|
}
|