| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- const logger = require('@overleaf/logger')
- const util = require('util')
- const { AffiliationError } = require('../Errors/Errors')
- const Features = require('../../infrastructure/Features')
- const { User } = require('../../models/User')
- const UserDeleter = require('./UserDeleter')
- const UserGetter = require('./UserGetter')
- const UserUpdater = require('./UserUpdater')
- const Analytics = require('../Analytics/AnalyticsManager')
- const SplitTestHandler = require('../SplitTests/SplitTestHandler')
- const UserOnboardingEmailManager = require('./UserOnboardingEmailManager')
- const UserPostRegistrationAnalyticsManager = require('./UserPostRegistrationAnalyticsManager')
- const OError = require('@overleaf/o-error')
- async function _addAffiliation(user, affiliationOptions) {
- try {
- await UserUpdater.promises.addAffiliationForNewUser(
- user._id,
- user.email,
- affiliationOptions
- )
- } catch (error) {
- throw new AffiliationError('add affiliation failed').withCause(error)
- }
- try {
- user = await UserGetter.promises.getUser(user._id)
- } catch (error) {
- logger.error(
- OError.tag(error, 'could not get fresh user data', {
- userId: user._id,
- email: user.email,
- })
- )
- }
- return user
- }
- async function recordRegistrationEvent(user) {
- SplitTestHandler.promises
- .getAssignmentForUser(user._id, 'highlight-sso')
- .then(assignment => {
- const segmentation = {
- highlightSSO: assignment.variant === 'active',
- }
- if (user.thirdPartyIdentifiers && user.thirdPartyIdentifiers.length > 0) {
- segmentation.provider = user.thirdPartyIdentifiers[0].providerId
- }
- return Analytics.recordEventForUser(
- user._id,
- 'user-registered',
- segmentation
- )
- })
- .catch(err =>
- logger.warn(
- { err },
- 'there was an error recording `user-registered` event'
- )
- )
- }
- async function createNewUser(attributes, options = {}) {
- let user = new User()
- if (attributes.first_name == null || attributes.first_name === '') {
- attributes.first_name = attributes.email.split('@')[0]
- }
- Object.assign(user, attributes)
- user.ace.syntaxValidation = true
- if (user.featureSwitches != null) {
- user.featureSwitches.pdfng = true
- }
- const reversedHostname = user.email.split('@')[1].split('').reverse().join('')
- const emailData = {
- email: user.email,
- createdAt: new Date(),
- reversedHostname,
- }
- if (Features.hasFeature('affiliations')) {
- emailData.affiliationUnchecked = true
- }
- if (
- attributes.samlIdentifiers &&
- attributes.samlIdentifiers[0] &&
- attributes.samlIdentifiers[0].providerId
- ) {
- emailData.samlProviderId = attributes.samlIdentifiers[0].providerId
- }
- user.emails = [emailData]
- user = await user.save()
- if (Features.hasFeature('affiliations')) {
- try {
- user = await _addAffiliation(user, options.affiliationOptions || {})
- } catch (error) {
- if (options.requireAffiliation) {
- await UserDeleter.promises.deleteMongoUser(user._id)
- throw OError.tag(error)
- } else {
- logger.error(OError.tag(error))
- }
- }
- }
- await recordRegistrationEvent(user)
- await Analytics.setUserPropertyForUser(user._id, 'created-at', new Date())
- await Analytics.setUserPropertyForUser(user._id, 'user-id', user._id)
- if (attributes.analyticsId) {
- await Analytics.setUserPropertyForUser(
- user._id,
- 'analytics-id',
- attributes.analyticsId
- )
- }
- if (Features.hasFeature('saas')) {
- try {
- await UserOnboardingEmailManager.scheduleOnboardingEmail(user)
- await UserPostRegistrationAnalyticsManager.schedulePostRegistrationAnalytics(
- user
- )
- } catch (error) {
- logger.error(
- OError.tag(error, 'Failed to schedule sending of onboarding email', {
- userId: user._id,
- })
- )
- }
- }
- return user
- }
- const UserCreator = {
- createNewUser: util.callbackify(createNewUser),
- promises: {
- createNewUser,
- },
- }
- module.exports = UserCreator
|