async function updateEmailPreferenceForSubscriber()

in src/db/tables/subscriber_email_preferences.ts [107:183]


async function updateEmailPreferenceForSubscriber(
  subscriberId: number,
  isFree: boolean,
  preference:
    | SubscriberFreeEmailPreferencesInput
    | SubscriberPlusEmailPreferencesInput,
) {
  logger.info("update_email_preference_for_subscriber", {
    subscriberId,
    isFree,
    preference,
  });

  let res;
  try {
    if (isFree) {
      const getRes = await getEmailPreferenceForSubscriber(subscriberId);
      if (!getRes.unsubscribe_token && !getRes.monthly_monitor_report_free_at) {
        // if new row has not been created before
        res = await addEmailPreferenceForSubscriber(
          subscriberId,
          preference as SubscriberFreeEmailPreferencesInput,
        );
      } else {
        logger.info("has_existing_unsubscribe_token", {
          subscriberId,
          preference,
        });

        res = (
          await knex("subscriber_email_preferences")
            .where("subscriber_id", subscriberId)
            .update({
              ...(preference as SubscriberFreeEmailPreferencesInput),
              // @ts-ignore knex.fn.now() results in it being set to a date,
              // even if it's not typed as a JS date object:
              monthly_monitor_report_free_at: knex.fn.now(),
            })
            .returning("*")
        )?.[0];
      }
      if (!res) {
        throw new Error(
          `Update subscriber ${subscriberId} failed, response: ${JSON.stringify(res)}`,
        );
      }
    } else {
      // TODO: modify after MNTOR-3557 - pref currently lives in two tables
      res = (
        await knex("subscribers")
          .where("id", subscriberId)
          .update({
            ...(preference as SubscriberPlusEmailPreferencesInput),
            // @ts-ignore knex.fn.now() results in it being set to a date,
            // even if it's not typed as a JS date object:
            updated_at: knex.fn.now(),
          })
          .returning("*")
      )?.[0];

      if (!res) {
        throw new Error(
          `Update subscriber ${subscriberId} failed, response: ${JSON.stringify(res)}`,
        );
      }
    }
    logger.debug("update_email_preference_for_subscriber_success");
  } catch (e) {
    logger.error("error_update_subscriber_email_preference", {
      message: (e as Error).message,
      stack_trace: (e as Error).stack,
    });

    throw e;
  }
  return res;
}