@dbbs/strapi-stripe-payment
Version:
Strapi integration plugin for Stripe payment system
245 lines (244 loc) • 10.5 kB
JavaScript
"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;
}
}));