src/server/lib/newsletters.ts (61 lines of code) (raw):

import { GeoLocation } from '@/shared/model/Geolocation'; import { NewsLetter, Newsletters } from '@/shared/model/Newsletter'; import { readUserNewsletters, read as getNewsletters, } from './idapi/newsletters'; import { Literal } from '@/shared/types'; // map of newsletters to country codes // undefined also included as key, in case of fallback // We're currently only using the 'AU' and 'US' keys - whether the newsletters page // is shown is controlled by getNextWelcomeFlowPage in lib/welcome.ts. export const NewsletterMap = new Map< GeoLocation | undefined, Literal<typeof Newsletters>[] >([ [undefined, []], ['ROW', []], ['GB', []], [ 'AU', [ Newsletters.MORNING_MAIL_AU, Newsletters.AFTERNOON_UPDATE_AU, Newsletters.SAVED_FOR_LATER_AU, Newsletters.THE_CRUNCH_AU, ], ], ['EU', []], [ 'US', [ Newsletters.HEADLINES_US, Newsletters.THE_STAKES_US, Newsletters.WELL_ACTUALLY, Newsletters.TRUMP_ON_TRIAL_US, ], ], ]); export const getUserNewsletterSubscriptions = async ({ newslettersOnPage, accessToken, }: { newslettersOnPage: string[]; accessToken: string; }): Promise<NewsLetter[]> => { const allNewsletters = await getNewsletters(); const userNewsletterSubscriptions = await readUserNewsletters({ accessToken, }); return newslettersOnPage .map((id) => allNewsletters.find((newsletter) => newsletter.id === id)) .map((newsletter) => { if (newsletter) { // eslint-disable-next-line functional/no-let -- mutation required to update newsletter with user newsletter data, TODO: potential for refactoring to avoid let let updated = newsletter; if (userNewsletterSubscriptions.includes(newsletter.id)) { updated = { ...updated, subscribed: true, }; } return updated; } }) .filter(Boolean) as NewsLetter[]; };