Files
Verso/services/web/app/src/Features/Analytics/EmailChangeHelper.mjs
T
Andrew RumbleandCopybot 912324f560 Convert to ESM
GitOrigin-RevId: b58b02f9e9c8d47909e95c3ade8e1bf33ed46c80
2025-11-06 09:05:47 +00:00

126 lines
3.2 KiB
JavaScript

// @ts-check
import UserGetter from '../User/UserGetter.mjs'
import AnalyticsManager from './AnalyticsManager.mjs'
const { registerEmailChange } = AnalyticsManager
/**
* @typedef {object} EmailData
* @property {string} email
* @property {Date} createdAt
* @property {Date} confirmedAt
* @property {boolean} default
*/
/**
* @typedef {object} EventData
* @property {Date} [emailCreatedAt] ISO string of when the email was created
* @property {Date} [emailConfirmedAt] ISO string of when the email was confirmed
* @property {Date} [emailDeletedAt] ISO string of when the email was deleted
* @property {boolean} [isPrimary] Whether the email is the primary email
*/
/**
* @typedef {import('./types').EmailChangePayload} EmailChangePayload
*/
/**
*
* @param {string} userId
* @param {string} email
* @param {EventData} eventData
* @returns {Promise<void>}
*/
async function registerEmailUpdate(userId, email, eventData = {}) {
const emailChangeEvent = await makeEmailChangeEvent(userId, email, eventData)
registerEmailChange({
...emailChangeEvent,
action: 'updated',
})
}
/**
*
* @param {string} userId
* @param {string} email
* @param {EventData} eventData
* @returns {Promise<Omit<EmailChangePayload, 'action'>>}
*/
async function makeEmailChangeEvent(userId, email, eventData) {
const userEmails = await UserGetter.promises.getUserFullEmails(userId)
const emailData = userEmails.find(userEmail => userEmail.email === email)
const filledEventData = fillMissingEventData(eventData, emailData)
return {
userId,
email,
createdAt: new Date().toISOString(),
emailCreatedAt: filledEventData?.emailCreatedAt?.toISOString() ?? null,
emailConfirmedAt: filledEventData?.emailConfirmedAt?.toISOString() ?? null,
emailDeletedAt: filledEventData?.emailDeletedAt?.toISOString() ?? null,
isPrimary: filledEventData?.isPrimary ?? false,
}
}
/**
*
* @param {string} userId
* @param {string} email
* @param {EventData} eventData
* @returns {Promise<void>}
*/
async function registerEmailCreation(userId, email, eventData = {}) {
const emailChangeEvent = await makeEmailChangeEvent(userId, email, eventData)
registerEmailChange({
...emailChangeEvent,
action: 'created',
})
}
/**
*
* @param {string} userId
* @param {string} email
* @param {EventData} eventData
* @returns {Promise<void>}
*/
async function registerEmailDeletion(userId, email, eventData = {}) {
const emailChangeEvent = await makeEmailChangeEvent(userId, email, eventData)
registerEmailChange({
...emailChangeEvent,
action: 'deleted',
})
}
/**
*
* @param {EventData} eventData
* @param {EmailData | null} emailData
* @return {EventData}
*/
function fillMissingEventData(eventData, emailData) {
if (emailData) {
if (!eventData.emailCreatedAt) {
eventData.emailCreatedAt = emailData.createdAt
}
if (!eventData.emailConfirmedAt && emailData.confirmedAt) {
eventData.emailConfirmedAt = emailData.confirmedAt
}
if (eventData.isPrimary === undefined) {
eventData.isPrimary = emailData.default
}
}
return eventData
}
export default {
registerEmailUpdate,
registerEmailCreation,
registerEmailDeletion,
}