diff --git a/ghost/admin/app/components/modals/limits/multiple-newsletters.hbs b/ghost/admin/app/components/modals/limits/multiple-newsletters.hbs new file mode 100644 index 0000000000..e3fd1f71a4 --- /dev/null +++ b/ghost/admin/app/components/modals/limits/multiple-newsletters.hbs @@ -0,0 +1,27 @@ + +
diff --git a/ghost/admin/app/components/settings/newsletters/newsletter-management.js b/ghost/admin/app/components/settings/newsletters/newsletter-management.js index c5cf96c484..4e22574b27 100644 --- a/ghost/admin/app/components/settings/newsletters/newsletter-management.js +++ b/ghost/admin/app/components/settings/newsletters/newsletter-management.js @@ -10,6 +10,7 @@ export default class NewsletterManagementComponent extends Component { @service modals; @service router; @service store; + @service limit; @tracked statusFilter = 'active'; @tracked filteredNewsletters = []; @@ -91,7 +92,21 @@ export default class NewsletterManagementComponent extends Component { } @action - unarchiveNewsletter(newsletter) { + async unarchiveNewsletter(newsletter) { + try { + await this.limit.limiter.errorIfWouldGoOverLimit('newsletters'); + } catch (error) { + if (error.errorType === 'HostLimitError') { + // Not allowed: we reached the limit here + this.modals.open('modals/limits/multiple-newsletters', { + message: error.message + }); + return; + } + + throw error; + } + this.confirmUnarchiveModal = this.modals.open(ConfirmUnarchiveModal, { newsletter, unarchiveNewsletterTask: this.unarchiveNewsletterTask diff --git a/ghost/admin/app/routes/settings/newsletters/new-newsletter.js b/ghost/admin/app/routes/settings/newsletters/new-newsletter.js index 6945b3d450..f10b23d290 100644 --- a/ghost/admin/app/routes/settings/newsletters/new-newsletter.js +++ b/ghost/admin/app/routes/settings/newsletters/new-newsletter.js @@ -8,9 +8,29 @@ export default class NewNewsletterRoute extends AdminRoute { @service router; @service settings; @service store; + @service limit; newsletterModal = null; + /** + * Before we allow the creation of a new newsletter, we should check the limits and return to the newsletters page if required. + */ + async beforeModel() { + try { + await this.limit.limiter.errorIfWouldGoOverLimit('newsletters'); + } catch (error) { + if (error.errorType === 'HostLimitError') { + // Not allowed: we reached the limit here + this.modals.open('modals/limits/multiple-newsletters', { + message: error.message + }); + return this.replaceWith('settings.newsletters'); + } + + throw error; + } + } + model() { return this.store.createRecord('newsletter'); } diff --git a/ghost/admin/app/services/limit.js b/ghost/admin/app/services/limit.js index 43766150c2..70657868a8 100644 --- a/ghost/admin/app/services/limit.js +++ b/ghost/admin/app/services/limit.js @@ -72,6 +72,10 @@ export default class LimitsService extends Service { limits.members.currentCountQuery = bind(this, this.getMembersCount); } + if (limits.newsletters) { + limits.newsletters.currentCountQuery = bind(this, this.getNewslettersCount); + } + return limits; } @@ -93,4 +97,9 @@ export default class LimitsService extends Service { return counts.total; } + + async getNewslettersCount() { + const activeNewsletters = await this.store.query('newsletter', {filter: 'status:active', limit: 'all'}); + return activeNewsletters.length; + } } diff --git a/ghost/admin/package.json b/ghost/admin/package.json index 9105ff7352..35cd61ffab 100644 --- a/ghost/admin/package.json +++ b/ghost/admin/package.json @@ -42,7 +42,7 @@ "@tryghost/helpers": "1.1.64", "@tryghost/kg-clean-basic-html": "2.2.10", "@tryghost/kg-parser-plugins": "2.11.6", - "@tryghost/limit-service": "1.0.10", + "@tryghost/limit-service": "1.1.3", "@tryghost/members-csv": "1.2.10", "@tryghost/mobiledoc-kit": "0.12.5-ghost.1", "@tryghost/nql": "0.9.2", diff --git a/ghost/admin/yarn.lock b/ghost/admin/yarn.lock index f559358826..ccbe7c7751 100644 --- a/ghost/admin/yarn.lock +++ b/ghost/admin/yarn.lock @@ -2047,10 +2047,10 @@ dependencies: "@tryghost/kg-clean-basic-html" "^2.2.10" -"@tryghost/limit-service@1.0.10": - version "1.0.10" - resolved "https://registry.yarnpkg.com/@tryghost/limit-service/-/limit-service-1.0.10.tgz#a22ff0c62599d849472f1a073650bc19e34cd7be" - integrity sha512-sZrlBRBgzSNg5QM+GULK40wU0x+GxinUYiyf/kMWGAalCdfziYBCQx5aJYz0lBOiMWiM0xkT5FFLPIC7fPSe4w== +"@tryghost/limit-service@1.1.3": + version "1.1.3" + resolved "https://registry.yarnpkg.com/@tryghost/limit-service/-/limit-service-1.1.3.tgz#9ce9187af6c83ada6575bcc4972a71e083f3bdc5" + integrity sha512-KM1jB6iL09XJeEvt4btdoNepQgeJw51/PWhAYBVbFj6Cuo4+82QLrZwkIWAhay440A3RSgOI4D0vL/WRog0jLg== dependencies: "@tryghost/errors" "^1.2.1" lodash "^4.17.21" @@ -7212,7 +7212,6 @@ ember-power-calendar@^0.16.3: ember-power-datepicker@cibernox/ember-power-datepicker: version "0.8.1" - uid da580474a2c449b715444934ddb626b7c07f46a7 resolved "https://codeload.github.com/cibernox/ember-power-datepicker/tar.gz/da580474a2c449b715444934ddb626b7c07f46a7" dependencies: ember-basic-dropdown "^3.0.11" @@ -9088,7 +9087,6 @@ gonzales-pe@4.2.4: "google-caja-bower@https://github.com/acburdine/google-caja-bower#ghost": version "6011.0.0" - uid "275cb75249f038492094a499756a73719ae071fd" resolved "https://github.com/acburdine/google-caja-bower#275cb75249f038492094a499756a73719ae071fd" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: @@ -10407,7 +10405,6 @@ just-extend@^4.0.2: "keymaster@https://github.com/madrobby/keymaster.git": version "1.6.3" - uid f8f43ddafad663b505dc0908e72853bcf8daea49 resolved "https://github.com/madrobby/keymaster.git#f8f43ddafad663b505dc0908e72853bcf8daea49" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: @@ -14036,7 +14033,6 @@ simple-swizzle@^0.2.2: "simplemde@https://github.com/kevinansfield/simplemde-markdown-editor.git#ghost": version "1.11.2" - uid "4c39702de7d97f9b32d5c101f39237b6dab7c3ee" resolved "https://github.com/kevinansfield/simplemde-markdown-editor.git#4c39702de7d97f9b32d5c101f39237b6dab7c3ee" sinon@^9.0.0: