AnalyticsController.mjs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import metrics from '@overleaf/metrics'
  2. import AnalyticsManager from './AnalyticsManager.mjs'
  3. import SessionManager from '../Authentication/SessionManager.mjs'
  4. import GeoIpLookup from '../../infrastructure/GeoIpLookup.mjs'
  5. import Features from '../../infrastructure/Features.mjs'
  6. import { expressify } from '@overleaf/promise-utils'
  7. import AccountMappingHelper from './AccountMappingHelper.mjs'
  8. async function registerSalesforceMapping(req, res, next) {
  9. if (!Features.hasFeature('analytics')) {
  10. return res.sendStatus(202)
  11. }
  12. const { createdAt, salesforceId, v1Id } = req.body
  13. AnalyticsManager.registerAccountMapping(
  14. AccountMappingHelper.generateV1Mapping(v1Id, salesforceId, createdAt)
  15. )
  16. res.sendStatus(202)
  17. }
  18. async function updateEditingSession(req, res, next) {
  19. if (!Features.hasFeature('analytics')) {
  20. return res.sendStatus(202)
  21. }
  22. const userId = SessionManager.getLoggedInUserId(req.session)
  23. const { projectId } = req.params
  24. const segmentation = req.body.segmentation || {}
  25. let countryCode = null
  26. if (userId) {
  27. try {
  28. const geoDetails = await GeoIpLookup.promises.getDetails(req.ip)
  29. if (geoDetails && geoDetails.country_code) {
  30. countryCode = geoDetails.country_code
  31. }
  32. AnalyticsManager.updateEditingSession(
  33. userId,
  34. projectId,
  35. countryCode,
  36. segmentation
  37. )
  38. } catch (error) {
  39. metrics.inc('analytics_geo_ip_lookup_errors')
  40. }
  41. }
  42. res.sendStatus(202)
  43. }
  44. function recordEvent(req, res, next) {
  45. if (!Features.hasFeature('analytics')) {
  46. return res.sendStatus(202)
  47. }
  48. delete req.body._csrf
  49. AnalyticsManager.recordEventForSession(
  50. req.session,
  51. req.params.event,
  52. req.body
  53. )
  54. res.sendStatus(202)
  55. }
  56. export default {
  57. registerSalesforceMapping: expressify(registerSalesforceMapping),
  58. updateEditingSession: expressify(updateEditingSession),
  59. recordEvent,
  60. }