in src/db/tables/user_announcements.ts [51:132]
export async function initializeUserAnnouncements(
subscriber: SerializedSubscriber,
): Promise<UserAnnouncementWithDetails[]> {
try {
// Determine audience eligibility
const isUS = subscriber.signup_language?.includes("en-US");
const subscriptions = subscriber.fxa_profile_json?.subscriptions ?? [];
const isPremium = subscriptions.includes("monitor");
const hasRunScan = subscriber.onerep_profile_id !== null;
// Get all current announcement IDs for the user
const existingRows = await knex("user_announcements")
.where("user_id", subscriber.id)
.select("announcement_id");
const userAnnouncementIds = new Set(
existingRows.map((row) => row.announcement_id),
);
// Get all published announcements
const publishedAnnouncements = await knex("announcements")
.where("label", "published")
.select("*");
// Filter announcements by audience
const eligibleAnnouncements = publishedAnnouncements.filter((a) => {
switch (a.audience) {
case "us_only":
return isUS;
case "premium_users":
return isPremium;
case "free_users":
return !isPremium && isUS;
case "has_run_scan":
return hasRunScan;
case "has_not_run_scan":
return !hasRunScan;
case "non_us":
return !isUS;
case "all_users":
default:
return true;
}
});
const newAnnouncements = eligibleAnnouncements.filter(
(a) => !userAnnouncementIds.has(a.announcement_id),
);
// Insert missing announcements
if (newAnnouncements.length > 0) {
const insertData = newAnnouncements.map((a) => ({
user_id: subscriber.id,
announcement_id: a.announcement_id,
status: "new",
created_at: new Date(),
updated_at: new Date(),
}));
await knex("user_announcements").insert(insertData);
}
const results: UserAnnouncementWithDetails[] = await knex(
"user_announcements as ua",
)
.join("announcements as a", "ua.announcement_id", "a.announcement_id")
.where("ua.user_id", subscriber.id)
.select(
"a.*",
"ua.status",
"ua.seen_at",
"ua.cleared_at",
"ua.created_at as user_created_at",
"ua.updated_at as user_updated_at",
);
return results;
} catch (error) {
logger.error("Error initializing user announcements:", error);
throw error;
}
}