email-alert-service: special-cases-for-single-page-notifications
Given a publishing event, we can see if there is an associated single-page subscriber-list for it with:
def find_subscriber_list(payload)
  return if payload.fetch("content_id", "").empty?
  return unless payload.fetch("locale", "en") == "en"
  Services.email_api_client.find_subscriber_list(content_id: payload["content_id"])
rescue GdsApi::HTTPNotFound
  nil
end
The locale check is because the email system excludes non-English content elsewhere, so we should only act on a publishing event if it's also for English content.
This lets us implement some special-case behaviour for these subscriber-lists.
Note that email-alert-api doesn't need to treat these subscriber-lists any differently to topic-based subscriber-lists. Nor does it need to know anything about the publishing workflow. email-alert-api just exposes generic API endpoints which work for all subscriber-lists, meaning we could potentially extend the functionality described here to topic-based subscriber-lists in the future, without any changes to email-alert-api.
We currently have no plans to do that, but keeping the possibility open ensures that we avoid building special cases in email-alert-api.
Unsubscribing users when a page is unpublished
When a publisher unpublishes a page, it triggers either a
gone.unpublish or redirect.unpublish event on the message queue.
The EmailUnpublishingProcessor monitors these *.unpublish# events.
When receiving an event it:
- Determines which unpublishing scenario it is: "published in error" (with or without an alternative URL) or "consolidated".
- Checks if there is a single-page subscriber-list for the page.
- Calls the email-alert-api bulk-unsubscribe endpoint for that subscriber-list, sending a message to users based on the unpublishing scenario.
email-alert-api used to handle unpublishing of topic-based subscriptions, but that feature was removed. We reinstated the handling of unpublishing events for single-page subscriptions only.
Notably, our feature is implemented by adding a generic "bulk
unsubscribe from this specific subscriber-list" endpoint to
email-alert-api, and keep the logic of which subscriber-list to
unsubscribe from isolated to email-alert-service (in the
UnpublishingAlert class).
See ADR 10 in email-alert-api for more information on how this feature differs from the previous one.
Keeping subscriber-list metadata up-to-date
When a page has its title or description changed, it triggers a
*.major.# or *.minor.# event on the message queue.  The
SubscriberListDetailsUpdateProcessor monitors these events.
When receiving an event it:
- Checks if there is a single-page subscriber-list for the page.
- Checks if the publishing event has changed the title or description.
- Calls the email-alert-api patch subscriber-list endpoint to set the new details.
We do not have anything comparable for topic-based subscriptions: for example, if the "Money" taxon is renamed, existing subscriber-lists will still use the name "Money".