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