@sourceloop/ctrl-plane-subscription-service
Version:
Subscription management microservice for SaaS control plane.
88 lines • 4.05 kB
JavaScript
;
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