diff --git a/ghost/members-api/lib/MembersAPI.js b/ghost/members-api/lib/MembersAPI.js index 4b0ca3d57b..de36fafb99 100644 --- a/ghost/members-api/lib/MembersAPI.js +++ b/ghost/members-api/lib/MembersAPI.js @@ -52,7 +52,8 @@ module.exports = function MembersAPI({ OfferRedemption, StripeProduct, StripePrice, - Product + Product, + Settings }, stripeAPIService, offersAPI, @@ -71,6 +72,7 @@ module.exports = function MembersAPI({ const productRepository = new ProductRepository({ Product, + Settings, StripeProduct, StripePrice, stripeAPIService diff --git a/ghost/members-api/lib/repositories/product.js b/ghost/members-api/lib/repositories/product.js index fe305f9561..b5593ebe09 100644 --- a/ghost/members-api/lib/repositories/product.js +++ b/ghost/members-api/lib/repositories/product.js @@ -24,17 +24,20 @@ class ProductRepository { /** * @param {object} deps * @param {any} deps.Product + * @param {any} deps.Settings * @param {any} deps.StripeProduct * @param {any} deps.StripePrice * @param {import('@tryghost/members-api/lib/services/stripe-api')} deps.stripeAPIService */ constructor({ Product, + Settings, StripeProduct, StripePrice, stripeAPIService }) { this._Product = Product; + this._Settings = Settings; this._StripeProduct = StripeProduct; this._StripePrice = StripePrice; this._stripeAPIService = stripeAPIService; @@ -261,6 +264,29 @@ class ProductRepository { delete productData.active; } + if (existingProduct.get('active') === true && productData.active === false) { + const portalProductsSetting = await this._Settings.findOne({ + key: 'portal_products' + }, options); + + let portalProducts; + try { + portalProducts = JSON.parse(portalProductsSetting.get('value')); + } catch (err) { + portalProducts = []; + } + + const updatedProducts = portalProducts.filter(product => product !== productId); + + await this._Settings.edit({ + key: 'portal_products', + value: JSON.stringify(updatedProducts) + }, { + ...options, + id: portalProductsSetting + }); + } + let product = await this._Product.edit(productData, { ...options, id: productId