fix(billing): use tier_id instead of tier_code for feature limit endpoints
Some checks failed
CI / ruff (push) Successful in 10s
CI / validate (push) Has been cancelled
CI / dependency-scanning (push) Has been cancelled
CI / docs (push) Has been cancelled
CI / deploy (push) Has been cancelled
CI / pytest (push) Has been cancelled

Tier codes are not unique across platforms (e.g., "essential" exists for
OMS, marketplace, and loyalty). Using tier_code caused feature limits to
be saved to the wrong tier. Switched to tier_id (unique PK) in routes,
service, and frontend JS. Added comprehensive unit and integration tests
including cross-platform isolation regression tests.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-24 13:06:18 +01:00
parent f47c680cb8
commit 2833ff1476
5 changed files with 661 additions and 21 deletions

View File

@@ -450,30 +450,24 @@ class FeatureService:
# Tier Feature Limit Management
# =========================================================================
def get_tier_feature_limits(self, db: Session, tier_code: str) -> list:
def get_tier_feature_limits(self, db: Session, tier_id: int) -> list:
"""Get feature limits for a tier."""
from app.modules.billing.services import admin_subscription_service
tier = admin_subscription_service.get_tier_by_code(db, tier_code)
return (
db.query(TierFeatureLimit)
.filter(TierFeatureLimit.tier_id == tier.id)
.filter(TierFeatureLimit.tier_id == tier_id)
.order_by(TierFeatureLimit.feature_code)
.all()
)
def upsert_tier_feature_limits(self, db: Session, tier_code: str, entries: list[dict]) -> list:
def upsert_tier_feature_limits(self, db: Session, tier_id: int, entries: list[dict]) -> list:
"""Replace feature limits for a tier. Returns list of new TierFeatureLimit objects."""
from app.modules.billing.services import admin_subscription_service
tier = admin_subscription_service.get_tier_by_code(db, tier_code)
db.query(TierFeatureLimit).filter(TierFeatureLimit.tier_id == tier.id).delete()
db.query(TierFeatureLimit).filter(TierFeatureLimit.tier_id == tier_id).delete()
new_rows = []
for entry in entries:
if not entry.get("enabled", True):
continue
row = TierFeatureLimit(
tier_id=tier.id,
tier_id=tier_id,
feature_code=entry["feature_code"],
limit_value=entry.get("limit_value"),
)