0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-01-27 22:49:56 -05:00

Added newsletter information in member subscribe events

refs https://github.com/TryGhost/Team/issues/1478

- When creating or editing a member, we'll add the newsletter ids to the subscribe events
- When susbcribing to multiple newsletters, we'll create multiple subscribe events
- When removing newsletters from a member, we'll create one or more subscribe events
- Tests in https://github.com/TryGhost/Ghost/pull/14579
This commit is contained in:
Simon Backx 2022-04-26 08:40:19 +02:00
parent 2c546613c6
commit 6a6cc28e3d

View file

@ -251,14 +251,19 @@ module.exports = class MemberRepository {
...eventData ...eventData
}, options); }, options);
if (member.get('subscribed')) { const newsletters = member.related('newsletters').models;
for (const newsletter of newsletters) {
await this._MemberSubscribeEvent.add({ await this._MemberSubscribeEvent.add({
member_id: member.id, member_id: member.id,
newsletter_id: newsletter.id,
subscribed: true, subscribed: true,
source, source,
...eventData ...eventData
}, options); }, options);
}
if (newsletters && newsletters.length > 0) {
DomainEvents.dispatch(MemberSubscribeEvent.create({ DomainEvents.dispatch(MemberSubscribeEvent.create({
memberId: member.id, memberId: member.id,
source: source source: source
@ -337,6 +342,23 @@ module.exports = class MemberRepository {
} }
} }
// Keep track of the newsletters that were added and removed of a member so we can generate the corresponding events
let newslettersToAdd = [];
let newslettersToRemove = [];
if (data.newsletters) {
const member = await this._Member.findOne({
id: options.id
}, sharedOptions);
const existingNewsletters = await member.related('newsletters').fetch(sharedOptions);
const existingNewsletterIds = existingNewsletters.map(newsletter => newsletter.id);
const incomingNewsletterIds = data.newsletters.map(newsletter => newsletter.id);
newslettersToAdd = _.differenceWith(incomingNewsletterIds, existingNewsletterIds);
newslettersToRemove = _.differenceWith(existingNewsletterIds, incomingNewsletterIds);
}
const member = await this._Member.edit({ const member = await this._Member.edit({
...memberData, ...memberData,
...memberStatusData ...memberStatusData
@ -358,25 +380,38 @@ module.exports = class MemberRepository {
}, options); }, options);
} }
// member._changed.subscribed has a value if the `subscribed` attribute is passed in the update call, regardless of the previous value // Add subscribe events for all (un)subscribed newsletters
if (member.attributes.subscribed !== member._previousAttributes.subscribed) { const context = options && options.context || {};
const context = options && options.context || {}; let source;
let source; if (context.internal) {
if (context.internal) { source = 'system';
source = 'system'; } else if (context.user) {
} else if (context.user) { source = 'admin';
source = 'admin'; } else if (context.api_key) {
} else if (context.api_key) { source = 'api';
source = 'api'; } else {
} else { source = 'member';
source = 'member'; }
}
for (const newsletterToAdd of newslettersToAdd) {
await this._MemberSubscribeEvent.add({ await this._MemberSubscribeEvent.add({
member_id: member.id, member_id: member.id,
subscribed: member.get('subscribed'), newsletter_id: newsletterToAdd,
subscribed: true,
source source
}, sharedOptions); }, sharedOptions);
}
for (const newsletterToRemove of newslettersToRemove) {
await this._MemberSubscribeEvent.add({
member_id: member.id,
newsletter_id: newsletterToRemove,
subscribed: false,
source
}, sharedOptions);
}
if (newslettersToAdd.length > 0 || newslettersToRemove.length > 0) {
DomainEvents.dispatch(MemberSubscribeEvent.create({ DomainEvents.dispatch(MemberSubscribeEvent.create({
memberId: member.id, memberId: member.id,
source: source source: source