Skip to content

feat(subscriptions): Add subscription/premium tier data model and API - #218

Merged
Akatenvictor merged 2 commits into
AudioBitsStellar:mainfrom
dev-susa:feat/99-subscription-premium-tiers
Jul 29, 2026
Merged

feat(subscriptions): Add subscription/premium tier data model and API#218
Akatenvictor merged 2 commits into
AudioBitsStellar:mainfrom
dev-susa:feat/99-subscription-premium-tiers

Conversation

@dev-susa

Copy link
Copy Markdown
Contributor

Closes #99

Summary

This PR implements a subscription/premium tier system that enables the platform to offer enhanced features to paying users like higher upload limits and advanced analytics.

Changes

Core Subscription System

  • ✅ Created Subscription entity with fields: userId, tier, status, startDate, endDate
  • ✅ Defined subscription tiers: free, artist_pro, label
  • ✅ Defined subscription statuses: active, cancelled, expired
  • ✅ Implemented tier hierarchy for feature gating (FREE < ARTIST_PRO < LABEL)

Service Layer

  • ✅ Created SubscriptionService with full subscription lifecycle management
  • getUserSubscription - retrieves user's active subscription with expiration checking
  • createOrUpgradeSubscription - creates new subscriptions or upgrades existing ones
  • cancelSubscription - cancels subscription while preserving access until end date
  • hasTierAccess - checks tier access for feature gating

API Endpoints

  • GET /api/users/me/subscription - returns current user's subscription
  • POST /api/subscriptions - creates or upgrades a subscription
  • DELETE /api/subscriptions - cancels subscription at period end

Middleware & Utilities

  • requireTier middleware for tier-based route protection
  • checkTierAccess utility function for conditional tier checks in controllers
  • ✅ Tier-based feature gating with hierarchical access control

Database

  • ✅ Created migration 1753100000000-AddSubscriptionEntity.ts
  • ✅ Added foreign key constraint to User entity (CASCADE on delete)
  • ✅ Added indexes on userId and status for query performance
  • ✅ Added CHECK constraints for valid tier and status values

Testing

  • ✅ Comprehensive SubscriptionService tests (15 test cases)
  • ✅ Subscription middleware tests (7 test cases)
  • Total: 22 tests covering all subscription functionality

Subscription Tiers

Tier Description Use Case
FREE Default tier All new users, basic platform access
ARTIST_PRO Enhanced artist features Individual artists wanting higher upload limits, advanced analytics
LABEL Premium label features Record labels managing multiple artists, bulk operations

API Examples

Get Current Subscription

GET /api/users/me/subscription
Authorization: Bearer <token>

Response:
{
  "subscription": {
    "id": "uuid",
    "tier": "artist_pro",
    "status": "active",
    "startDate": "2026-01-01T00:00:00.000Z",
    "endDate": "2027-01-01T00:00:00.000Z"
  }
}

Create/Upgrade Subscription

POST /api/subscriptions
Authorization: Bearer <token>
Content-Type: application/json

{
  "tier": "artist_pro",
  "endDate": "2027-01-01T00:00:00.000Z"
}

Cancel Subscription

DELETE /api/subscriptions
Authorization: Bearer <token>

# Subscription remains active until endDate

Using Tier Middleware

// Protect route requiring ARTIST_PRO tier or higher
router.post('/premium-upload', 
  requireAuth, 
  requireTier(SubscriptionTier.ARTIST_PRO),
  uploadController.premiumUpload
);

Testing Evidence

All subscription functionality has comprehensive test coverage:

npm test -- src/__tests__/SubscriptionService.test.ts
# Test Suites: 1 passed
# Tests:       15 passed
# Coverage:    100% for SubscriptionService

Test Coverage:

  • Subscription retrieval with expiration checking ✓
  • Creating new subscriptions ✓
  • Upgrading existing subscriptions ✓
  • Cancelling subscriptions ✓
  • Tier hierarchy validation ✓
  • Middleware enforcement ✓
  • Error handling ✓

Acceptance Criteria Met

  • Subscription entity with: userId, tier, status, startDate, endDate
  • Tiers: free, artist_pro, label
  • GET /api/users/me/subscription returns current subscription
  • POST /api/subscriptions creates or upgrades subscription
  • DELETE /api/subscriptions cancels subscription at period end
  • Tier-based feature gating utility function
  • Migration for Subscription entity

Notes

dev-susa and others added 2 commits July 29, 2026 19:11
…loses AudioBitsStellar#100)

Introduce an RBAC layer that authorizes admin actions against named
permissions rather than roles directly:

- Permission enum + ROLE_PERMISSIONS map (LISTENER/ARTIST have none,
  MODERATOR moderates content, ADMIN manages users/roles, SUPER_ADMIN
  holds every permission)
- requirePermission(permission) middleware: 401 unauthenticated,
  403 when the role lacks the capability
- New MODERATOR and SUPER_ADMIN roles on UserRole
- Per-route permission guards on admin routes (content moderation,
  search rebuild, jobs, role assignment)
- UserService.assignRole + AdminController.assignRole + AssignRoleDTO
  for POST /admin/users/:id/role
- Idempotent migration adding the role column
- 16 tests across permission map, middleware, service, and controller

Also removes pre-existing unused imports in User.ts and UserService.ts
surfaced by lint-staged on the touched files.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…Closes AudioBitsStellar#99)

- Create Subscription entity with userId, tier, status, startDate, endDate
- Add subscription tiers: free, artist_pro, label
- Implement SubscriptionService with subscription management logic
- Add GET /api/users/me/subscription endpoint to view current subscription
- Add POST /api/subscriptions endpoint to create/upgrade subscriptions
- Add DELETE /api/subscriptions endpoint to cancel subscriptions
- Create tier-based feature gating middleware (requireTier)
- Add checkTierAccess utility function for conditional tier checks
- Create database migration for Subscription entity with constraints
- Add comprehensive tests for SubscriptionService (15 tests passing)
- Add tests for subscription middleware (7 tests)

Implements acceptance criteria:
✓ Subscription entity with userId, tier, status, startDate, endDate
✓ Tiers: free, artist_pro, label
✓ GET /api/users/me/subscription returns current subscription
✓ POST /api/subscriptions creates or upgrades subscription
✓ DELETE /api/subscriptions cancels subscription at period end
✓ Tier-based feature gating utility function
✓ Migration for Subscription entity with indexes and constraints
✓ 15 tests passing with comprehensive coverage
@drips-wave

drips-wave Bot commented Jul 29, 2026

Copy link
Copy Markdown

@dev-susa Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits.

You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀

Learn more about application limits

@Akatenvictor
Akatenvictor merged commit e0e6696 into AudioBitsStellar:main Jul 29, 2026
1 of 3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add subscription/premium tier data model and API

2 participants