UNPKG

@dbbs/strapi-stripe-payment

Version:
245 lines (244 loc) 10.5 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const http_errors_1 = __importDefault(require("http-errors")); const strapi_1 = require("@strapi/strapi"); const enums_1 = require("../enums"); const helpers_1 = require("../helpers"); exports.default = strapi_1.factories.createCoreService('plugin::stripe-payment.subscription', ({ strapi }) => ({ async createCheckoutSession(params) { const { userId } = params; const { organizationName, customerId, plan } = await (0, helpers_1.validateAndFetchCheckoutSessionDetails)(strapi, params); if (plan.type !== enums_1.PlanType.RECURRING) { throw new http_errors_1.default.BadRequest('Cannot create a subscription checkout session for a one-time plan'); } const organizationByName = await strapi.query('plugin::stripe-payment.organization').findOne({ where: { name: organizationName }, populate: { subscription: true } }); if ((organizationByName === null || organizationByName === void 0 ? void 0 : organizationByName.subscription) && organizationByName.subscription.status !== enums_1.SubscriptionStatus.CANCELLED) { throw new http_errors_1.default.BadRequest(`Cannot create a subscription for the organization '${organizationByName.name}' as it already has an active subscription`); } const successUrl = strapi.config.get('server.stripe.successPaymentUrl'); const sessionParams = { success_url: successUrl, metadata: { organizationName, userId, planId: plan.id, quantity: params.quantity }, line_items: [{ price: plan.stripe_id, quantity: params.quantity }], subscription_data: { trial_period_days: 30 }, mode: 'subscription', ...(customerId && { customer: customerId }) }; const session = await strapi.plugin('stripe-payment').service('stripe').checkout.sessions.create(sessionParams); return session.url; }, async getSubscriptionById(params) { const { id } = params; const subscription = await strapi.query('plugin::stripe-payment.subscription').findOne({ where: { id }, populate: { organization: true, plan: true } }); if (!subscription) { return null; } const stripeSubscription = await strapi .plugin('stripe-payment') .service('stripe') .subscriptions.retrieve(subscription.stripe_id); return { ...subscription, quantity: stripeSubscription.quantity }; }, async getMySubscription(params) { const { userId } = params; const organization = await strapi.query('plugin::stripe-payment.organization').findOne({ where: { users: { id: userId } }, populate: { users: true } }); const subscription = await strapi.query('plugin::stripe-payment.subscription').findOne({ where: { organization: { id: organization.id } }, populate: ['organization', 'plan', 'plan.product'] }); const stripeSubscription = await strapi .plugin('stripe-payment') .service('stripe') .subscriptions.retrieve(subscription.stripe_id); return { ...subscription, quantity: stripeSubscription.quantity }; }, async getSubscriptions() { return strapi .query('plugin::stripe-payment.subscription') .findMany({ populate: { organization: true, plan: true } }); }, async cancelSubscription(params) { const { id } = params; const subscription = await strapi.query('plugin::stripe-payment.subscription').findOne({ where: { id }, select: ['id', 'stripe_id', 'status'] }); if (!subscription) { return null; } if (subscription.status === enums_1.SubscriptionStatus.CANCELLED) { throw new http_errors_1.default.Forbidden(`Subscription with ID ${id} already cancelled`); } await strapi.plugin('stripe-payment').service('stripe').subscriptions.cancel(subscription.stripe_id); await strapi.query('plugin::stripe-payment.subscription').update({ where: { id: subscription.id }, data: { status: enums_1.SubscriptionStatus.CANCELLED } }); return true; }, async pauseSubscription(params) { const { id } = params; const subscription = await strapi.query('plugin::stripe-payment.subscription').findOne({ where: { id }, select: ['id', 'stripe_id', 'status'] }); if (!subscription) { return null; } if (subscription.status !== enums_1.SubscriptionStatus.ACTIVE) { throw new http_errors_1.default.Forbidden(`Subscription with ID ${id} not in active state`); } await strapi .plugin('stripe-payment') .service('stripe') .subscriptions.update(subscription.stripe_id, { pause_collection: { behavior: 'void' } }); const updatedSubscription = await strapi.query('plugin::stripe-payment.subscription').update({ where: { id: subscription.id }, data: { status: enums_1.SubscriptionStatus.PAUSED } }); return updatedSubscription; }, async resumeSubscription(params) { const { id } = params; const subscription = await strapi.query('plugin::stripe-payment.subscription').findOne({ where: { id }, select: ['id', 'stripe_id', 'status'] }); if (!subscription) { return null; } await strapi.plugin('stripe-payment').service('stripe').subscriptions.update(subscription.stripe_id, { pause_collection: null }); if (subscription.status !== enums_1.SubscriptionStatus.PAUSED) { throw new http_errors_1.default.Forbidden(`Subscription with ID ${id} not in paused state`); } const updatedSubscription = await strapi.query('plugin::stripe-payment.subscription').update({ where: { id: subscription.id }, data: { status: enums_1.SubscriptionStatus.ACTIVE } }); return updatedSubscription; }, async updateStripeSubscription(params) { const { planId, quantity, id } = params; const subscription = await strapi.query('plugin::stripe-payment.subscription').findOne({ where: { id }, populate: ['organization.users', 'plan'] }); if (!subscription) { throw new http_errors_1.default.NotFound(`Subscription with ID ${id} not found`); } if (!subscription.organization) { throw new http_errors_1.default.NotFound(`Organization with ID ${subscription.organization.id} not found`); } if (quantity && quantity < subscription.organization.users.length) { throw new http_errors_1.default.BadRequest('Invalid quantity'); } const stripeSubscription = await strapi .plugin('stripe-payment') .service('stripe') .subscriptions.retrieve(subscription.stripe_id); let stripeUpdatedPlan = subscription.plan.stripe_id; let updatedPlan = subscription.plan; const stripeUpdatedQuantity = quantity || stripeSubscription.items.data[0].quantity; if (planId) { const plan = await strapi.query('plugin::stripe-payment.plan').findOne({ where: { id: planId } }); if (!plan) { throw new http_errors_1.default.NotFound(`Plan with ID ${planId} not found`); } stripeUpdatedPlan = plan.stripe_id; updatedPlan = plan; } else { stripeUpdatedPlan = subscription.plan.stripe_id; } if (stripeUpdatedQuantity > subscription.organization.quantity) { throw new http_errors_1.default.BadRequest('The new quantity exceeds the available seats in the organization. Please add more seats.'); } await strapi .plugin('stripe-payment') .service('stripe') .subscriptions.update(subscription.stripe_id, { items: [ { id: stripeSubscription.items.data[0].id, price: stripeUpdatedPlan, quantity: stripeUpdatedQuantity } ] }); const updatedSubscription = await strapi.query('plugin::stripe-payment.subscription').update({ where: { id: subscription.id }, data: { plan: updatedPlan } }); return updatedSubscription; }, async resubscribe(params) { const { id } = params; const subscription = await strapi.query('plugin::stripe-payment.subscription').findOne({ where: { id }, populate: ['organization.users', 'plan'] }); if (!subscription) { throw new http_errors_1.default.NotFound(`Subscription with ID ${id} not found`); } if (subscription.status !== enums_1.SubscriptionStatus.CANCELLED) { throw new http_errors_1.default.Forbidden(`subscription with ID ${id} is not cancelled`); } const quantity = subscription.organization.users.length; const stripeSubscription = await strapi .plugin('stripe-payment') .service('stripe') .subscriptions.create({ customer: subscription.organization.customer_id, items: [ { price: subscription.plan.stripe_id, quantity } ] }); await strapi.query('plugin::stripe-payment.subscription').update({ where: { id: subscription.id }, data: { stripe_id: stripeSubscription.id, status: enums_1.SubscriptionStatus.ACTIVE } }); return true; } }));