UNPKG

@dbbs/strapi-stripe-payment

Version:
298 lines (297 loc) 12.7 kB
"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 }) }); } }));