mirror of
https://github.com/saltbo/zpan.git
synced 2026-08-31 02:04:40 +08:00
5a5583b4ed
* feat(licensing): regroup comparison table by capability and add social-login/downloader gates Decouple the feature comparison table's grouping axis from the pricing tier: features are now grouped by capability (core/advanced) while edition availability is expressed purely by the per-edition cells. Coming-soon features show a badge next to the name with a muted check in the target edition column, so it's clear which edition they will land in. Tier reclassification (per product decision): - Social login & OIDC: free = 1 provider, Pro/Business = unlimited - Downloaders: free = 1, Pro/Business = unlimited - Site announcements, Multi-IdP SSO, LDAP/SCIM, Analytics: Business-only New runtime gates (enforced, mirroring the storages count-gate): - social_login_unlimited in POST /api/admin/auth-providers (402 on 2nd) - downloaders_unlimited in POST /api/admin/downloaders (402 on 2nd) - site_announcements added to BUSINESS_ONLY_FEATURES Copy cleanup: - Rename rows that embedded a limit word: "Unlimited Team Workspaces" -> "Team Workspaces", "Storage Backends" -> "Storages" - Clarify "Storage Plans" -> "Sell Storage & Traffic" (the quota_store feature) - Make the Licensing page intro edition-neutral (Pro + Business) instead of the leftover Pro-only copy Tests: add gate tests for both new limits; seed licenses in the existing multi-provider/multi-downloader tests; switch announcement tests to a Business license. Note: site_announcements moving to Business takes full effect for real licenses only once zpan-cloud stops listing it in Pro certificates; the local edition-derived path is already updated. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * refactor(licensing): drop unused per-cert feature override, derive from edition The optional `features[]` override on the license certificate was added with the Pro/Business split but was never exercised: real certs carry only `edition`, and entitlements are derived from it via the feature registry (PRO_GATE_KEYS minus BUSINESS_ONLY_FEATURES). The override was dead in the normal flow and duplicated the edition→feature mapping in two places. Remove it so edition is the single source of truth: - Drop `LicenseAssertion.features` and `normalizeFeatures` (verify.ts) - `effectiveFeatures(edition)` no longer takes/honors an override list - Simplify the test seed helpers (no `features` arg, no test-side business-only set) and update licensing tests to assert edition-derived entitlements `BindingState.features` (the resolved list exposed to the client) is kept. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix(downloader): regenerate OpenAPI spec and Go client for new 402 response The downloaders create route gained a 402 (feature_not_available) response for the free-plan limit; regenerate the committed OpenAPI document and Go client so openapi:downloader:check passes. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>