mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-03-11 02:12:21 -05:00
Added "emails" limit check when (re)sending a newsletter
refs https://github.com/TryGhost/Team/issues/588 - This check allows for a on/off switch to be set up on the instance and control limits around sending emails - An example configuration for such check would look like following in config's hostSettings section, e.g.: ``` "emails": { "disabled": true, "error": "Email sending has been temporarily disabled whilst your account is under review." } ```
This commit is contained in:
parent
fa327a7a85
commit
bc15f8c1bb
2 changed files with 51 additions and 0 deletions
|
@ -106,6 +106,10 @@ const sendTestEmail = async (postModel, toEmails, apiVersion) => {
|
|||
*/
|
||||
|
||||
const addEmail = async (postModel, options) => {
|
||||
if (limitService.isLimited('emails')) {
|
||||
await limitService.errorIfWouldGoOverLimit('emails');
|
||||
}
|
||||
|
||||
const knexOptions = _.pick(options, ['transacting', 'forUpdate']);
|
||||
const filterOptions = Object.assign({}, knexOptions, {limit: 1});
|
||||
|
||||
|
@ -258,6 +262,11 @@ async function sendEmailJob({emailModel, options}) {
|
|||
await limitService.errorIfIsOverLimit('members');
|
||||
}
|
||||
|
||||
// Check host limit for disabled emails or going over emails limit
|
||||
if (limitService.isLimited('emails')) {
|
||||
await limitService.errorIfWouldGoOverLimit('emails');
|
||||
}
|
||||
|
||||
// Create email batch and recipient rows unless this is a retry and they already exist
|
||||
const existingBatchCount = await emailModel.related('emailBatches').count('id');
|
||||
|
||||
|
|
|
@ -9,6 +9,7 @@ const testUtils = require('../../utils');
|
|||
const config = require('../../../core/shared/config');
|
||||
const models = require('../../../core/server/models');
|
||||
const localUtils = require('./utils');
|
||||
const configUtils = require('../../utils/configUtils');
|
||||
|
||||
describe('Posts API', function () {
|
||||
let request;
|
||||
|
@ -362,4 +363,45 @@ describe('Posts API', function () {
|
|||
.expect('Cache-Control', testUtils.cacheRules.private)
|
||||
.expect(404);
|
||||
});
|
||||
|
||||
describe('Host Settings: emails limits', function () {
|
||||
afterEach(function () {
|
||||
configUtils.set('hostSettings:limits', undefined);
|
||||
});
|
||||
|
||||
it('Request fails when emails limit is in place', async function () {
|
||||
configUtils.set('hostSettings:limits', {
|
||||
emails: {
|
||||
disabled: true,
|
||||
error: 'No email shalt be sent'
|
||||
}
|
||||
});
|
||||
|
||||
// NOTE: need to do a full reboot to reinitialize hostSettings
|
||||
await testUtils.startGhost();
|
||||
request = supertest.agent(config.get('url'));
|
||||
await localUtils.doAuth(request, 'users:extra', 'posts', 'emails');
|
||||
|
||||
const draftPostResponse = await request
|
||||
.get(localUtils.API.getApiQuery(`posts/${testUtils.DataGenerator.Content.posts[3].id}/`))
|
||||
.set('Origin', config.get('url'))
|
||||
.expect(200);
|
||||
|
||||
const draftPost = draftPostResponse.body.posts[0];
|
||||
|
||||
const response = await request
|
||||
.put(localUtils.API.getApiQuery(`posts/${draftPost.id}/?email_recipient_filter=all&send_email_when_published=true`))
|
||||
.set('Origin', config.get('url'))
|
||||
.send({posts: [{
|
||||
status: 'published',
|
||||
updated_at: draftPost.updated_at
|
||||
}]})
|
||||
.expect('Content-Type', /json/)
|
||||
.expect('Cache-Control', testUtils.cacheRules.private)
|
||||
.expect(403);
|
||||
|
||||
response.body.errors[0].type.should.equal('HostLimitError');
|
||||
response.body.errors[0].context.should.equal('No email shalt be sent');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
Loading…
Add table
Reference in a new issue