diff --git a/ghost/email-service/package.json b/ghost/email-service/package.json index b0f7373968..9113290111 100644 --- a/ghost/email-service/package.json +++ b/ghost/email-service/package.json @@ -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" } } diff --git a/ghost/members-api/lib/repositories/member.js b/ghost/members-api/lib/repositories/member.js index 5c78b4fbf3..ba266fb3e2 100644 --- a/ghost/members-api/lib/repositories/member.js +++ b/ghost/members-api/lib/repositories/member.js @@ -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) { diff --git a/ghost/members-events-service/lib/last-seen-at-updater.js b/ghost/members-events-service/lib/last-seen-at-updater.js index ee92b03aaa..34f95b0a3b 100644 --- a/ghost/members-events-service/lib/last-seen-at-updater.js +++ b/ghost/members-events-service/lib/last-seen-at-updater.js @@ -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); + } } /** diff --git a/ghost/members-events-service/package.json b/ghost/members-events-service/package.json index 5b57a30632..508d4fa64a 100644 --- a/ghost/members-events-service/package.json +++ b/ghost/members-events-service/package.json @@ -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" } }