Files
gh-christianlouis-docuelevate/migrations/versions/014_add_subscription_tiers.py
T
copilot-swe-agent[bot] 179f6125e8 feat(subscriptions): add SaaS subscription tiers, pricing page, and enforced upload quotas
- Add Free / Starter / Professional / Business tiers with lifetime, daily, and monthly
  file limits (app/utils/subscription.py)
- Add subscription_tier column to UserProfile model + migration 014
- Enforce quotas at upload time (HTTP 402 on violation) in /api/ui-upload
- New REST API: GET /api/subscriptions/tiers, /my, /platform (admin)
- New pages: /pricing (marketing, public) and /subscription (per-user status)
- Enhanced dashboard: SaaS stats (files today/month, OCR count, active users)
  in multi-user mode; original single-user layout preserved
- Admin users page: show Plan badge, allow tier editing via dropdown
- Navigation: add Pricing link + subscription icon in user header
- Tests: 23 unit tests for subscription tier logic
- Docs: docs/SubscriptionTiers.md

Co-authored-by: christianlouis <361235+christianlouis@users.noreply.github.com>
2026-03-06 15:53:12 +00:00

31 lines
776 B
Python

"""Add subscription_tier column to user_profiles
Revision ID: 014_add_subscription_tiers
Revises: 013_add_user_profiles
Create Date: 2026-03-06
"""
from typing import Union
import sqlalchemy as sa
from alembic import op
# revision identifiers, used by Alembic.
revision: str = "014_add_subscription_tiers"
down_revision: Union[str, None] = "013_add_user_profiles"
depends_on: Union[str, None] = None
def upgrade() -> None:
"""Add subscription_tier column to user_profiles."""
op.add_column(
"user_profiles",
sa.Column("subscription_tier", sa.String(50), nullable=True, server_default="free"),
)
def downgrade() -> None:
"""Remove subscription_tier column from user_profiles."""
op.drop_column("user_profiles", "subscription_tier")