🐛 Fixed member import newsletter subscription prefs (#17208)

fixes https://github.com/TryGhost/Product/issues/2947

When an import is performed and a member already exists:
- If `subscribe_to_emails` is set to `true` and the existing member
already has newsletter subscriptions, these are preserved
- If `subscribe_to_emails` is set to `true` and the existing member does
not already have newsletter subscriptions, no new subscriptions are
added in case the member has previously unsubscribed
- If `subscribe_to_emails` is set to `false` the existing member will be
unsubscribed from all newsletters regardless of their preference
This commit is contained in:
Michael Barrett 2023-07-06 08:45:56 +01:00 committed by GitHub
parent f6aeff6524
commit b49cf14287
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 98 additions and 1 deletions

View File

@ -138,11 +138,24 @@ module.exports = class MembersCSVImporter {
};
const existingMember = await membersRepository.get({email: memberValues.email}, {
...options,
withRelated: ['labels']
withRelated: ['labels', 'newsletters']
});
let member;
if (existingMember) {
const existingLabels = existingMember.related('labels') ? existingMember.related('labels').toJSON() : [];
const existingNewsletters = existingMember.related('newsletters');
// Preserve member's existing newsletter subscription preferences
if (existingNewsletters.length > 0 && memberValues.subscribed) {
memberValues.newsletters = existingNewsletters.toJSON();
}
// If member does not have any subscriptions, assume they have previously unsubscribed
// and do not re-subscribe them
if (!existingNewsletters.length && memberValues.subscribed) {
memberValues.subscribed = false;
}
member = await membersRepository.update({
...memberValues,
labels: existingLabels.concat(memberValues.labels)

View File

@ -343,5 +343,89 @@ describe('Importer', function () {
assert.equal(result.imported, 1);
assert.equal(result.errors.length, 0);
});
it ('respects existing member newsletter subscription preferences', async function () {
const importer = buildMockImporterInstance();
const newsletters = [
{id: 'newsletter_1'},
{id: 'newsletter_2'}
];
const newslettersCollection = {
length: newsletters.length,
toJSON: sinon.stub().returns(newsletters)
};
const member = {
related: sinon.stub()
};
member.related.withArgs('labels').returns(null);
member.related.withArgs('newsletters').returns(newslettersCollection);
membersRepositoryStub.get = sinon.stub();
membersRepositoryStub.get
.withArgs({email: 'jbloggs@example.com'})
.resolves(member);
await importer.perform(`${csvPath}/subscribed-to-emails-header.csv`, defaultAllowedFields);
assert.deepEqual(membersRepositoryStub.update.args[0][0].newsletters, newsletters);
});
it ('does not add subscriptions for existing member when they do not have any subscriptions', async function () {
const importer = buildMockImporterInstance();
const member = {
related: sinon.stub()
};
member.related.withArgs('labels').returns(null);
member.related.withArgs('newsletters').returns({length: 0});
membersRepositoryStub.get = sinon.stub();
membersRepositoryStub.get
.withArgs({email: 'jbloggs@example.com'})
.resolves(member);
await importer.perform(`${csvPath}/subscribed-to-emails-header.csv`, defaultAllowedFields);
assert.deepEqual(membersRepositoryStub.update.args[0][0].subscribed, false);
});
it ('removes existing member newsletter subscriptions when set to not be subscribed', async function () {
const importer = buildMockImporterInstance();
const newsletters = [
{id: 'newsletter_1'},
{id: 'newsletter_2'}
];
const newslettersCollection = {
length: newsletters.length,
toJSON: sinon.stub().returns(newsletters)
};
const member = {
related: sinon.stub()
};
member.related.withArgs('labels').returns(null);
member.related.withArgs('newsletters').returns(newslettersCollection);
membersRepositoryStub.get = sinon.stub();
membersRepositoryStub.get
.withArgs({email: 'test@example.com'})
.resolves(member);
await importer.perform(`${csvPath}/subscribed-to-emails-header.csv`, defaultAllowedFields);
assert.equal(membersRepositoryStub.update.args[0][0].subscribed, false);
assert.equal(membersRepositoryStub.update.args[0][0].newsletters, undefined);
});
});
});