diff --git a/ghost/members-api/index.js b/ghost/members-api/index.js index dbd897aa43..968cb12ef2 100644 --- a/ghost/members-api/index.js +++ b/ghost/members-api/index.js @@ -5,6 +5,7 @@ const StripePaymentProcessor = require('./lib/stripe'); const Tokens = require('./lib/tokens'); const Users = require('./lib/users'); +const Metadata = require('./lib/metadata'); const common = require('./lib/common'); module.exports = function MembersApi({ @@ -25,8 +26,8 @@ module.exports = function MembersApi({ getHTML, getSubject }, - setMetadata, - getMetadata, + memberStripeCustomerModel, + stripeCustomerSubscriptionModel, memberModel, logger }) { @@ -35,13 +36,14 @@ module.exports = function MembersApi({ } const {encodeIdentityToken, decodeToken} = Tokens({privateKey, publicKey, issuer}); + const metadata = Metadata({memberStripeCustomerModel, stripeCustomerSubscriptionModel}); const stripeStorage = { async get(member) { - return getMetadata('stripe', member); + return metadata.getMetadata('stripe', member); }, - async set(metadata) { - return setMetadata('stripe', metadata); + async set(data) { + return metadata.setMetadata('stripe', data); } }; const stripe = paymentConfig.stripe ? new StripePaymentProcessor(paymentConfig.stripe, stripeStorage, common.logging) : null; diff --git a/ghost/members-api/lib/metadata.js b/ghost/members-api/lib/metadata.js new file mode 100644 index 0000000000..80ccc4efde --- /dev/null +++ b/ghost/members-api/lib/metadata.js @@ -0,0 +1,57 @@ +let MemberStripeCustomer; +let StripeCustomerSubscription; + +async function setMetadata(module, metadata) { + if (module !== 'stripe') { + return; + } + + if (metadata.customer) { + await MemberStripeCustomer.upsert(metadata.customer, { + customer_id: metadata.customer.customer_id + }); + } + + if (metadata.subscription) { + await StripeCustomerSubscription.upsert(metadata.subscription, { + subscription_id: metadata.subscription.subscription_id + }); + } + + return; +} + +async function getMetadata(module, member) { + if (module !== 'stripe') { + return; + } + + const customers = (await MemberStripeCustomer.findAll({ + filter: `member_id:${member.id}` + })).toJSON(); + + const subscriptions = await customers.reduce(async (subscriptionsPromise, customer) => { + const customerSubscriptions = await StripeCustomerSubscription.findAll({ + filter: `customer_id:${customer.customer_id}` + }); + return (await subscriptionsPromise).concat(customerSubscriptions.toJSON()); + }, []); + + return { + customers: customers, + subscriptions: subscriptions + }; +} + +module.exports = function ({ + memberStripeCustomerModel, + stripeCustomerSubscriptionModel +}) { + MemberStripeCustomer = memberStripeCustomerModel; + StripeCustomerSubscription = stripeCustomerSubscriptionModel; + + return { + setMetadata, + getMetadata + }; +};