import metrics from '@overleaf/metrics' import AnalyticsManager from './AnalyticsManager.js' import SessionManager from '../Authentication/SessionManager.js' import GeoIpLookup from '../../infrastructure/GeoIpLookup.js' import Features from '../../infrastructure/Features.js' import { expressify } from '@overleaf/promise-utils' import AccountMappingHelper from './AccountMappingHelper.js' async function registerSalesforceMapping(req, res, next) { if (!Features.hasFeature('analytics')) { return res.sendStatus(202) } const { createdAt, salesforceId, v1Id } = req.body AnalyticsManager.registerAccountMapping( AccountMappingHelper.generateV1Mapping(v1Id, salesforceId, createdAt) ) res.sendStatus(202) } async function updateEditingSession(req, res, next) { if (!Features.hasFeature('analytics')) { return res.sendStatus(202) } const userId = SessionManager.getLoggedInUserId(req.session) const { projectId } = req.params const segmentation = req.body.segmentation || {} let countryCode = null if (userId) { try { const geoDetails = await GeoIpLookup.promises.getDetails(req.ip) if (geoDetails && geoDetails.country_code) { countryCode = geoDetails.country_code } AnalyticsManager.updateEditingSession( userId, projectId, countryCode, segmentation ) } catch (error) { metrics.inc('analytics_geo_ip_lookup_errors') } } res.sendStatus(202) } function recordEvent(req, res, next) { if (!Features.hasFeature('analytics')) { return res.sendStatus(202) } delete req.body._csrf AnalyticsManager.recordEventForSession( req.session, req.params.event, req.body ) res.sendStatus(202) } export default { registerSalesforceMapping: expressify(registerSalesforceMapping), updateEditingSession: expressify(updateEditingSession), recordEvent, }