Files
bigcapital/packages/server-nest/src/modules/Subscription/commands/ChangeLemonSubscription.service.ts
2025-03-24 23:38:43 +02:00

55 lines
1.7 KiB
TypeScript

import { updateSubscription } from '@lemonsqueezy/lemonsqueezy.js';
import { configureLemonSqueezy } from '../utils';
import { IOrganizationSubscriptionChanged } from '../types';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { Inject, Injectable } from '@nestjs/common';
import { PlanSubscription } from '../models/PlanSubscription';
import { events } from '@/common/events/events';
import { ServiceError } from '@/modules/Items/ServiceError';
@Injectable()
export class ChangeLemonSubscription {
constructor(
public readonly eventEmitter: EventEmitter2,
@Inject(PlanSubscription.name)
private readonly planSubscriptionModel: typeof PlanSubscription,
) {}
/**
* Changes the given organization subscription plan.
* @param {number} tenantId - Tenant id.
* @param {number} newVariantId - New variant id.
* @returns {Promise<void>}
*/
public async changeSubscriptionPlan(
newVariantId: number,
subscriptionSlug: string = 'main',
) {
configureLemonSqueezy();
const subscription = await this.planSubscriptionModel.query().findOne({
slug: subscriptionSlug,
});
const lemonSubscriptionId = subscription.lemonSubscriptionId;
// Send request to Lemon Squeezy to change the subscription.
const updatedSub = await updateSubscription(lemonSubscriptionId, {
variantId: newVariantId,
invoiceImmediately: true,
});
if (updatedSub.error) {
throw new ServiceError('SOMETHING_WENT_WRONG');
}
// Triggers `onSubscriptionPlanChanged` event.
await this.eventEmitter.emitAsync(
events.subscription.onSubscriptionPlanChange,
{
lemonSubscriptionId,
newVariantId,
} as IOrganizationSubscriptionChanged,
);
}
}