mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-03-18 02:21:47 -05:00
🐛 Fixed errors of old events from deleted members (#15944)
refs https://ghost.slack.com/archives/C02G9E68C/p1670215917451249 When a member is deleted, and we receive an opened event for an email to that member. We threw an uncaught Bookshelf EmptyResponse error. - This change makes fetching the member not a requirement when handling that event in the last seen at updater. - It also adds try catches for all event listeners in the last seen at updater
This commit is contained in:
parent
2519f4b20d
commit
bededf4520
4 changed files with 35 additions and 10 deletions
|
@ -34,6 +34,7 @@
|
|||
"@tryghost/color-utils": "0.1.21",
|
||||
"@tryghost/html-to-plaintext": "0.0.0",
|
||||
"juice": "8.1.0",
|
||||
"cheerio": "0.22.0"
|
||||
"cheerio": "0.22.0",
|
||||
"@tryghost/logging": "2.3.2"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -431,7 +431,7 @@ module.exports = class MemberRepository {
|
|||
if (requiredRelations.length > 0) {
|
||||
initialMember = await this._Member.findOne({
|
||||
id: options.id
|
||||
}, {...sharedOptions, withRelated: requiredRelations});
|
||||
}, {...sharedOptions, withRelated: requiredRelations, require: false});
|
||||
|
||||
// Make sure we throw the right error if it doesn't exist
|
||||
if (!initialMember) {
|
||||
|
@ -729,7 +729,7 @@ module.exports = class MemberRepository {
|
|||
filter: `newsletter_id:${data.newsletter}+member_id:[${membersArr}]`
|
||||
});
|
||||
const toUnsubscribe = unsubscribeRows.map(row => row.id);
|
||||
|
||||
|
||||
return await this._MemberNewsletter.bulkDestroy(toUnsubscribe);
|
||||
}
|
||||
if (!hasNewsletterSelected) {
|
||||
|
|
|
@ -2,6 +2,7 @@ const {MemberPageViewEvent, MemberCommentEvent, MemberLinkClickEvent} = require(
|
|||
const moment = require('moment-timezone');
|
||||
const {IncorrectUsageError} = require('@tryghost/errors');
|
||||
const {EmailOpenedEvent} = require('@tryghost/email-events');
|
||||
const logging = require('@tryghost/logging');
|
||||
|
||||
/**
|
||||
* Listen for `MemberViewEvent` to update the `member.last_seen_at` timestamp
|
||||
|
@ -33,19 +34,39 @@ class LastSeenAtUpdater {
|
|||
*/
|
||||
subscribe(domainEvents) {
|
||||
domainEvents.subscribe(MemberPageViewEvent, async (event) => {
|
||||
await this.updateLastSeenAt(event.data.memberId, event.data.memberLastSeenAt, event.timestamp);
|
||||
try {
|
||||
await this.updateLastSeenAt(event.data.memberId, event.data.memberLastSeenAt, event.timestamp);
|
||||
} catch (err) {
|
||||
logging.error(`Error in LastSeenAtUpdater.MemberPageViewEvent listener for member ${event.data.memberId}`);
|
||||
logging.error(err);
|
||||
}
|
||||
});
|
||||
|
||||
domainEvents.subscribe(MemberLinkClickEvent, async (event) => {
|
||||
await this.updateLastSeenAt(event.data.memberId, event.data.memberLastSeenAt, event.timestamp);
|
||||
try {
|
||||
await this.updateLastSeenAt(event.data.memberId, event.data.memberLastSeenAt, event.timestamp);
|
||||
} catch (err) {
|
||||
logging.error(`Error in LastSeenAtUpdater.MemberLinkClickEvent listener for member ${event.data.memberId}`);
|
||||
logging.error(err);
|
||||
}
|
||||
});
|
||||
|
||||
domainEvents.subscribe(MemberCommentEvent, async (event) => {
|
||||
await this.updateLastCommentedAt(event.data.memberId, event.timestamp);
|
||||
try {
|
||||
await this.updateLastCommentedAt(event.data.memberId, event.timestamp);
|
||||
} catch (err) {
|
||||
logging.error(`Error in LastSeenAtUpdater.MemberCommentEvent listener for member ${event.data.memberId}`);
|
||||
logging.error(err);
|
||||
}
|
||||
});
|
||||
|
||||
domainEvents.subscribe(EmailOpenedEvent, async (event) => {
|
||||
await this.updateLastSeenAtWithoutKnownLastSeen(event.memberId, event.timestamp);
|
||||
try {
|
||||
await this.updateLastSeenAtWithoutKnownLastSeen(event.memberId, event.timestamp);
|
||||
} catch (err) {
|
||||
logging.error(`Error in LastSeenAtUpdater.EmailOpenedEvent listener for member ${event.memberId}, emailRecipientId ${event.emailRecipientId}`);
|
||||
logging.error(err);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -61,8 +82,10 @@ class LastSeenAtUpdater {
|
|||
// Fetch manually
|
||||
const membersApi = this._getMembersApi();
|
||||
const member = await membersApi.members.get({id: memberId}, {require: true});
|
||||
const memberLastSeenAt = member.get('last_seen_at');
|
||||
await this.updateLastSeenAt(memberId, memberLastSeenAt, timestamp);
|
||||
if (member) {
|
||||
const memberLastSeenAt = member.get('last_seen_at');
|
||||
await this.updateLastSeenAt(memberId, memberLastSeenAt, timestamp);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
"@tryghost/domain-events": "0.0.0",
|
||||
"@tryghost/errors": "1.2.18",
|
||||
"@tryghost/member-events": "0.0.0",
|
||||
"moment-timezone": "0.5.34"
|
||||
"moment-timezone": "0.5.34",
|
||||
"@tryghost/logging": "2.3.2"
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue