@dbbs/strapi-stripe-payment
Version:
Strapi integration plugin for Stripe payment system
298 lines (297 loc) • 12.7 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 strapi_1 = require("@strapi/strapi");
const http_errors_1 = __importDefault(require("http-errors"));
const enums_1 = require("../enums");
const templates_1 = require("../templates");
exports.default = strapi_1.factories.createCoreService('plugin::stripe-payment.organization', ({ strapi }) => ({
async create(params) {
const { name, ownerId, email, quantity } = params;
const owner = await strapi.query('plugin::users-permissions.user').findOne({ where: { id: ownerId } });
if (!owner) {
return null;
}
const customer = await strapi.plugin('stripe-payment').service('stripe').customers.create({
name,
email
});
return strapi.query('plugin::stripe-payment.organization').create({
data: {
name,
customer_id: customer.id,
owner_id: ownerId,
users: [ownerId],
quantity
}
});
},
async getOrganizationById(params) {
const { id } = params;
const organization = await strapi.query('plugin::stripe-payment.organization').findOne({
where: { id },
populate: ['subscription', 'subscription.plan', 'users', 'purchases', 'purchases.plan', 'purchases.plan.product']
});
if (!organization) {
return null;
}
return organization;
},
async getUserOrganizations(params) {
const { userId } = params;
return strapi.query('plugin::stripe-payment.organization').findMany({
where: {
users: {
id: userId
}
},
populate: ['users']
});
},
async getAllOrganizations() {
return strapi.query('plugin::stripe-payment.organization').findMany({
populate: ['users']
});
},
async update(params) {
var _a, _b, _c, _d;
const { name, id, quantity } = params;
const organization = await strapi
.query('plugin::stripe-payment.organization')
.findOne({ where: { id }, populate: { subscription: true } });
if (!organization) {
return null;
}
if (organization.subscription) {
const stripeSubscription = await strapi
.plugin('stripe-payment')
.service('stripe')
.subscriptions.retrieve(organization.subscription.stripe_id);
if (((_b = (_a = stripeSubscription === null || stripeSubscription === void 0 ? void 0 : stripeSubscription.items) === null || _a === void 0 ? void 0 : _a.data[0]) === null || _b === void 0 ? void 0 : _b.quantity) && quantity < ((_d = (_c = stripeSubscription === null || stripeSubscription === void 0 ? void 0 : stripeSubscription.items) === null || _c === void 0 ? void 0 : _c.data[0]) === null || _d === void 0 ? void 0 : _d.quantity)) {
throw new http_errors_1.default.BadRequest('The new quantity value cannot be less than the current subscription quantity.');
}
}
await strapi.plugin('stripe-payment').service('stripe').customers.update(organization.customer_id, {
name
});
return strapi.query('plugin::stripe-payment.organization').update({
where: { id: organization.id },
data: {
name,
quantity
}
});
},
async getDefaultPaymentMethod(params) {
const { id } = params;
const organization = await strapi.query('plugin::stripe-payment.organization').findOne({ where: { id } });
if (!organization) {
return null;
}
const { customer_id: customerId, payment_method_id: paymentMethodId } = organization;
const paymentMethod = await strapi
.plugin('stripe-payment')
.service('stripe')
.customers.retrievePaymentMethod(customerId, paymentMethodId);
const { brand, exp_month: expMonth, exp_year: expYear, last4 } = paymentMethod.card;
return { brand, expMonth, expYear, last4 };
},
async delete(params) {
const { id } = params;
const organization = await strapi.query('plugin::stripe-payment.organization').findOne({ where: { id } });
if (!organization) {
return null;
}
await strapi.plugin('stripe-payment').service('stripe').customers.del(organization.customer_id);
await strapi.query('plugin::stripe-payment.organization').delete({ where: { id } });
return { id };
},
async updateOwner(params) {
const { id, ownerId } = params;
const organization = await strapi.query('plugin::stripe-payment.organization').findOne({
where: { id },
populate: ['users']
});
if (!organization) {
return null;
}
if (!organization.users.find((user) => user.id === ownerId)) {
throw new http_errors_1.default.BadRequest(`Cannot update owner of the organization since the user with ID ${ownerId} is not a member of the organization`);
}
return strapi.query('plugin::stripe-payment.organization').update({
where: { id: organization.id },
data: {
owner_id: ownerId
}
});
},
async createDefaultPaymentMethodUpdateCheckoutSession(params) {
const { id } = params;
const organization = await strapi.query('plugin::stripe-payment.organization').findOne({ where: { id } });
if (!organization) {
return null;
}
return strapi
.plugin('stripe-payment')
.service('stripe')
.checkout.sessions.create({
customer: organization.customer_id,
success_url: strapi.config.get('server.stripe.successSetupUrl'),
mode: 'setup',
currency: strapi.config.get('server.stripe.currency')
});
},
async addUser(params) {
const { organizationId, recipientEmail } = params;
const organization = await strapi.query('plugin::stripe-payment.organization').findOne({
where: { id: organizationId },
populate: {
users: true
}
});
if (!organization) {
return null;
}
const user = await strapi.query('plugin::users-permissions.user').findOne({ where: { email: recipientEmail } });
if (!user) {
throw new http_errors_1.default.NotFound(`User with email ${recipientEmail} not found`);
}
if (organization.users.some(({ id }) => id === user.id)) {
throw new http_errors_1.default.BadRequest('User already exists in organization!');
}
if (organization.quantity <= organization.users.length + 1) {
throw new http_errors_1.default.BadRequest('Run out of available places in your organization, add new seats');
}
if (organization.subscription) {
const stripeSubscription = await strapi
.plugin('stripe-payment')
.service('stripe')
.subscriptions.retrieve(organization.subscription.stripe_id);
if (stripeSubscription.items.data[0].quantity <= organization.users.length) {
await strapi
.plugin('stripe-payment')
.service('stripe')
.subscriptions.update(organization.subscription.stripe_id, {
items: [
{
id: stripeSubscription.items.data[0].id,
quantity: organization.users.length + 1
}
]
});
}
}
await strapi.query('plugin::stripe-payment.organization').update({
where: { id: organizationId },
data: {
users: organization.users ? [...organization.users, user] : [user]
}
});
return user;
},
async removeUser(params) {
const { organizationId, userId } = params;
const organization = await strapi.query('plugin::stripe-payment.organization').findOne({
where: { id: organizationId },
populate: {
users: true
}
});
if (!organization) {
return null;
}
if (userId === Number(organization.owner_id)) {
throw new http_errors_1.default.BadRequest('Cannot remove an organization owner');
}
const userToRemove = organization.users.find((user) => user.id === userId);
if (!userToRemove) {
throw new http_errors_1.default.BadRequest(`User with ID ${userId} is not a member of the organization`);
}
const organizationUsers = organization.users.filter((user) => user.id !== Number(userId));
return strapi.query('plugin::stripe-payment.organization').update({
where: { id: organizationId },
data: {
users: organizationUsers
}
});
},
async acceptInvite(params) {
const { organizationId, userId, token } = params;
const invite = await strapi.query('plugin::stripe-payment.invite').findOne({
where: {
token,
organization: organizationId,
status: enums_1.InviteStatus.PENDING
}
});
if (!invite) {
throw new http_errors_1.default.NotFound(`Invite token ${token} for ${organizationId} not found`);
}
const organization = await strapi.query('plugin::stripe-payment.organization').findOne({
where: { id: organizationId },
populate: {
users: true,
subscription: true,
invites: {
where: {
status: enums_1.InviteStatus.PENDING
}
}
}
});
if (organization.quantity <= organization.users.length + organization.invites.length) {
throw new http_errors_1.default.BadRequest('Run out of available places in your organization, add new seats');
}
const user = await strapi.query('plugin::users-permissions.user').findOne({
where: { id: userId }
});
if (organization.users.some(({ id }) => id === user.id)) {
throw new http_errors_1.default.BadRequest('User already exists in organization!');
}
const stripeSubscription = await strapi
.plugin('stripe-payment')
.service('stripe')
.subscriptions.retrieve(organization.subscription.stripe_id);
if (stripeSubscription.items.data[0].quantity <= organization.users.length) {
await strapi
.plugin('stripe-payment')
.service('stripe')
.subscriptions.update(organization.subscription.stripe_id, {
items: [
{
id: stripeSubscription.items.data[0].id,
quantity: organization.users.length + 1
}
]
});
}
await strapi.query('plugin::stripe-payment.organization').update({
where: { id: organizationId },
data: {
users: organization.users ? [...organization.users, user] : [user]
}
});
await strapi.query('plugin::stripe-payment.invite').update({
where: { id: invite.id },
data: {
status: enums_1.InviteStatus.ACCEPTED
}
});
return true;
},
async sendOrganizationInviteEmail(params) {
const { organizationName, organizationId, recipientEmail, inviteToken } = params;
const domainUrl = strapi.config.get('server.stripe.domainUrl');
const acceptInviteLink = `${domainUrl}/organization/${organizationId}/accept-invite?token=${inviteToken}`;
return strapi
.plugin('stripe-payment')
.service('notification')
.sendEmail({
subject: `Invite to organization ${organizationName}`,
recipientsEmails: [recipientEmail],
message: (0, templates_1.getSendOrganizationInviteTemplate)({ organizationName, recipientEmail, acceptInviteLink })
});
}
}));