feat(subscriptions): add Subscriptions module with plans, quotas, and billing

- Add Subscription, Plan, UsageRecord domain entities
- Implement Create, Upgrade, Cancel subscription commands
- Add MeterUsage command for quota tracking
- Support 4 plan tiers: Free, Agent Pro, Investor, Enterprise
- Register SubscriptionsModule in AppModule

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Ho Ngoc Hai
2026-04-08 02:04:20 +07:00
parent f3081d92fc
commit 9b581b7e5f
32 changed files with 1205 additions and 0 deletions

View File

@@ -0,0 +1,54 @@
import { Module } from '@nestjs/common';
import { CqrsModule } from '@nestjs/cqrs';
// Domain
import { SUBSCRIPTION_REPOSITORY } from './domain/repositories/subscription.repository';
// Infrastructure
import { PrismaSubscriptionRepository } from './infrastructure/repositories/prisma-subscription.repository';
// Application — Commands
import { CreateSubscriptionHandler } from './application/commands/create-subscription/create-subscription.handler';
import { UpgradeSubscriptionHandler } from './application/commands/upgrade-subscription/upgrade-subscription.handler';
import { CancelSubscriptionHandler } from './application/commands/cancel-subscription/cancel-subscription.handler';
import { MeterUsageHandler } from './application/commands/meter-usage/meter-usage.handler';
// Application — Queries
import { GetPlanHandler } from './application/queries/get-plan/get-plan.handler';
import { CheckQuotaHandler } from './application/queries/check-quota/check-quota.handler';
import { GetBillingHistoryHandler } from './application/queries/get-billing-history/get-billing-history.handler';
// Presentation
import { SubscriptionsController } from './presentation/controllers/subscriptions.controller';
import { QuotaGuard } from './presentation/guards/quota.guard';
const CommandHandlers = [
CreateSubscriptionHandler,
UpgradeSubscriptionHandler,
CancelSubscriptionHandler,
MeterUsageHandler,
];
const QueryHandlers = [
GetPlanHandler,
CheckQuotaHandler,
GetBillingHistoryHandler,
];
@Module({
imports: [CqrsModule],
controllers: [SubscriptionsController],
providers: [
// Repositories
{ provide: SUBSCRIPTION_REPOSITORY, useClass: PrismaSubscriptionRepository },
// Guards
QuotaGuard,
// CQRS
...CommandHandlers,
...QueryHandlers,
],
exports: [SUBSCRIPTION_REPOSITORY, QuotaGuard],
})
export class SubscriptionsModule {}