export async function initializeUserAnnouncements()

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;
  }
}