feat(server): team quota (#8955)

This commit is contained in:
DarkSky
2024-12-09 17:51:54 +08:00
committed by GitHub
parent 8fe188e773
commit 9365958a02
51 changed files with 1997 additions and 218 deletions

View File

@@ -3,6 +3,7 @@ import './config';
import { ServerFeature } from '../../core/config';
import { FeatureModule } from '../../core/features';
import { PermissionModule } from '../../core/permission';
import { QuotaModule } from '../../core/quota';
import { UserModule } from '../../core/user';
import { Plugin } from '../registry';
import { StripeWebhookController } from './controller';
@@ -11,6 +12,7 @@ import {
UserSubscriptionManager,
WorkspaceSubscriptionManager,
} from './manager';
import { TeamQuotaOverride } from './quota';
import {
SubscriptionResolver,
UserSubscriptionResolver,
@@ -22,7 +24,7 @@ import { StripeWebhook } from './webhook';
@Plugin({
name: 'payment',
imports: [FeatureModule, UserModule, PermissionModule],
imports: [FeatureModule, QuotaModule, UserModule, PermissionModule],
providers: [
StripeProvider,
SubscriptionService,
@@ -33,6 +35,7 @@ import { StripeWebhook } from './webhook';
WorkspaceSubscriptionManager,
SubscriptionCronJobs,
WorkspaceSubscriptionResolver,
TeamQuotaOverride,
],
controllers: [StripeWebhookController],
requires: [

View File

@@ -0,0 +1,53 @@
import { Injectable } from '@nestjs/common';
import { OnEvent } from '@nestjs/event-emitter';
import { PermissionService } from '../../core/permission';
import { QuotaManagementService, QuotaType } from '../../core/quota';
import type { EventPayload } from '../../fundamentals';
@Injectable()
export class TeamQuotaOverride {
constructor(
private readonly manager: QuotaManagementService,
private readonly permission: PermissionService
) {}
@OnEvent('workspace.subscription.activated')
async onSubscriptionUpdated({
workspaceId,
plan,
recurring,
quantity,
}: EventPayload<'workspace.subscription.activated'>) {
switch (plan) {
case 'team':
await this.manager.addTeamWorkspace(
workspaceId,
`${recurring} team subscription activated`
);
await this.manager.updateWorkspaceConfig(
workspaceId,
QuotaType.TeamPlanV1,
{ memberLimit: quantity }
);
await this.permission.refreshSeatStatus(workspaceId, quantity);
break;
default:
break;
}
}
@OnEvent('workspace.subscription.canceled')
async onSubscriptionCanceled({
workspaceId,
plan,
}: EventPayload<'workspace.subscription.canceled'>) {
switch (plan) {
case 'team':
await this.manager.removeTeamWorkspace(workspaceId);
break;
default:
break;
}
}
}