UNPKG

@sourceloop/ctrl-plane-subscription-service

Version:

Subscription management microservice for SaaS control plane.

88 lines 4.05 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SubscriptionService = void 0; const tslib_1 = require("tslib"); const moment_1 = tslib_1.__importDefault(require("moment")); const repository_1 = require("@loopback/repository"); const repositories_1 = require("../repositories"); const context_1 = require("@loopback/context"); const enums_1 = require("../enums"); const DATE_FORMAT = 'YYYY-MM-DD'; let SubscriptionService = class SubscriptionService { constructor(subscriptionRepository, planRepository, billingCycleRepository) { this.subscriptionRepository = subscriptionRepository; this.planRepository = planRepository; this.billingCycleRepository = billingCycleRepository; } async createSubscription(subscription) { const plan = await this.planRepository.findById(subscription.planId); const billingCycle = await this.billingCycleRepository.findById(plan.billingCycleId); const startDate = (0, moment_1.default)().format(DATE_FORMAT); const endDate = (0, moment_1.default)() .add(billingCycle.duration, this._unitMap(billingCycle.durationUnit)) .format(DATE_FORMAT); return this.subscriptionRepository.create({ ...subscription, startDate, endDate, }); } _unitMap(durationUnit) { switch (durationUnit) { case 'month': return 'M'; case 'year': return 'y'; case 'week': return 'week'; default: return 'days'; } } async getExpireSoonSubscriptions() { const daysRemaining = 7; const subscriptions = await this.subscriptionRepository.find({ where: { status: enums_1.SubscriptionStatus.ACTIVE }, }); return subscriptions .filter(sub => (0, moment_1.default)(sub.endDate).isBefore((0, moment_1.default)().add(daysRemaining, 'days')) && (0, moment_1.default)(sub.endDate).isAfter((0, moment_1.default)())) .map(sub => ({ id: sub.id, daysRemainingToExpiry: (0, moment_1.default)(sub.endDate).diff((0, moment_1.default)(), 'days'), subscriberId: sub.subscriberId, })); } async handleExpiredSubscriptions(dayCount) { const subscriptions = await this.subscriptionRepository.find({ where: { status: enums_1.SubscriptionStatus.ACTIVE }, }); const markAsExpired = subscriptions .filter(sub => (0, moment_1.default)(sub.endDate).isBefore((0, moment_1.default)())) .map(sub => this.subscriptionRepository.updateById(sub.id, { status: enums_1.SubscriptionStatus.EXPIRED, })); await Promise.all(markAsExpired); const range = (0, moment_1.default)().subtract(dayCount, 'days').format(DATE_FORMAT); const expiredSubscriptions = await this.subscriptionRepository.find({ where: { status: enums_1.SubscriptionStatus.EXPIRED }, }); return expiredSubscriptions .filter(sub => (0, moment_1.default)(sub.endDate).isAfter(range)) .map(sub => ({ subscriptionId: sub.id, subscriberId: sub.subscriberId, })); } }; exports.SubscriptionService = SubscriptionService; exports.SubscriptionService = SubscriptionService = tslib_1.__decorate([ (0, context_1.injectable)({ scope: context_1.BindingScope.TRANSIENT }), tslib_1.__param(0, (0, repository_1.repository)(repositories_1.SubscriptionRepository)), tslib_1.__param(1, (0, repository_1.repository)(repositories_1.PlanRepository)), tslib_1.__param(2, (0, repository_1.repository)(repositories_1.BillingCycleRepository)), tslib_1.__metadata("design:paramtypes", [repositories_1.SubscriptionRepository, repositories_1.PlanRepository, repositories_1.BillingCycleRepository]) ], SubscriptionService); //# sourceMappingURL=subscription.service.js.map