UNPKG

n8n

Version:

n8n Workflow Automation Tool

680 lines 34.1 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TelemetryEventRelay = void 0; const typedi_1 = require("typedi"); const event_service_1 = require("../events/event.service"); const telemetry_1 = require("../telemetry"); const config_1 = __importDefault(require("../config")); const node_os_1 = __importDefault(require("node:os")); const License_1 = require("../License"); const config_2 = require("@n8n/config"); const constants_1 = require("../constants"); const workflow_repository_1 = require("../databases/repositories/workflow.repository"); const psl_1 = require("psl"); const n8n_workflow_1 = require("n8n-workflow"); const NodeTypes_1 = require("../NodeTypes"); const sharedWorkflow_repository_1 = require("../databases/repositories/sharedWorkflow.repository"); const projectRelation_repository_1 = require("../databases/repositories/projectRelation.repository"); const sharedHookFunctions_1 = require("../executionLifecycleHooks/shared/sharedHookFunctions"); const event_relay_1 = require("./event-relay"); const change_case_1 = require("change-case"); let TelemetryEventRelay = class TelemetryEventRelay extends event_relay_1.EventRelay { constructor(eventService, telemetry, license, globalConfig, workflowRepository, nodeTypes, sharedWorkflowRepository, projectRelationRepository) { super(eventService); this.eventService = eventService; this.telemetry = telemetry; this.license = license; this.globalConfig = globalConfig; this.workflowRepository = workflowRepository; this.nodeTypes = nodeTypes; this.sharedWorkflowRepository = sharedWorkflowRepository; this.projectRelationRepository = projectRelationRepository; } async init() { if (!config_1.default.getEnv('diagnostics.enabled')) return; await this.telemetry.init(); this.setupListeners({ 'team-project-updated': (event) => this.teamProjectUpdated(event), 'team-project-deleted': (event) => this.teamProjectDeleted(event), 'team-project-created': (event) => this.teamProjectCreated(event), 'source-control-settings-updated': (event) => this.sourceControlSettingsUpdated(event), 'source-control-user-started-pull-ui': (event) => this.sourceControlUserStartedPullUi(event), 'source-control-user-finished-pull-ui': (event) => this.sourceControlUserFinishedPullUi(event), 'source-control-user-pulled-api': (event) => this.sourceControlUserPulledApi(event), 'source-control-user-started-push-ui': (event) => this.sourceControlUserStartedPushUi(event), 'source-control-user-finished-push-ui': (event) => this.sourceControlUserFinishedPushUi(event), 'license-renewal-attempted': (event) => this.licenseRenewalAttempted(event), 'variable-created': () => this.variableCreated(), 'external-secrets-provider-settings-saved': (event) => this.externalSecretsProviderSettingsSaved(event), 'public-api-invoked': (event) => this.publicApiInvoked(event), 'public-api-key-created': (event) => this.publicApiKeyCreated(event), 'public-api-key-deleted': (event) => this.publicApiKeyDeleted(event), 'community-package-installed': (event) => this.communityPackageInstalled(event), 'community-package-updated': (event) => this.communityPackageUpdated(event), 'community-package-deleted': (event) => this.communityPackageDeleted(event), 'credentials-created': (event) => this.credentialsCreated(event), 'credentials-shared': (event) => this.credentialsShared(event), 'credentials-updated': (event) => this.credentialsUpdated(event), 'credentials-deleted': (event) => this.credentialsDeleted(event), 'ldap-general-sync-finished': (event) => this.ldapGeneralSyncFinished(event), 'ldap-settings-updated': (event) => this.ldapSettingsUpdated(event), 'ldap-login-sync-failed': (event) => this.ldapLoginSyncFailed(event), 'login-failed-due-to-ldap-disabled': (event) => this.loginFailedDueToLdapDisabled(event), 'workflow-created': (event) => this.workflowCreated(event), 'workflow-deleted': (event) => this.workflowDeleted(event), 'workflow-sharing-updated': (event) => this.workflowSharingUpdated(event), 'workflow-saved': async (event) => await this.workflowSaved(event), 'server-started': async () => await this.serverStarted(), 'session-started': (event) => this.sessionStarted(event), 'instance-stopped': () => this.instanceStopped(), 'instance-owner-setup': async (event) => await this.instanceOwnerSetup(event), 'first-production-workflow-succeeded': (event) => this.firstProductionWorkflowSucceeded(event), 'first-workflow-data-loaded': (event) => this.firstWorkflowDataLoaded(event), 'workflow-post-execute': async (event) => await this.workflowPostExecute(event), 'user-changed-role': (event) => this.userChangedRole(event), 'user-retrieved-user': (event) => this.userRetrievedUser(event), 'user-retrieved-all-users': (event) => this.userRetrievedAllUsers(event), 'user-retrieved-execution': (event) => this.userRetrievedExecution(event), 'user-retrieved-all-executions': (event) => this.userRetrievedAllExecutions(event), 'user-retrieved-workflow': (event) => this.userRetrievedWorkflow(event), 'user-retrieved-all-workflows': (event) => this.userRetrievedAllWorkflows(event), 'user-updated': (event) => this.userUpdated(event), 'user-deleted': (event) => this.userDeleted(event), 'user-invited': (event) => this.userInvited(event), 'user-signed-up': (event) => this.userSignedUp(event), 'user-submitted-personalization-survey': (event) => this.userSubmittedPersonalizationSurvey(event), 'email-failed': (event) => this.emailFailed(event), 'user-transactional-email-sent': (event) => this.userTransactionalEmailSent(event), 'user-invite-email-click': (event) => this.userInviteEmailClick(event), 'user-password-reset-email-click': (event) => this.userPasswordResetEmailClick(event), 'user-password-reset-request-click': (event) => this.userPasswordResetRequestClick(event), }); } teamProjectUpdated({ userId, role, members, projectId, }) { this.telemetry.track('Project settings updated', { user_id: userId, role, members: members.map(({ userId: user_id, role }) => ({ user_id, role })), project_id: projectId, }); } teamProjectDeleted({ userId, role, projectId, removalType, targetProjectId, }) { this.telemetry.track('User deleted project', { user_id: userId, role, project_id: projectId, removal_type: removalType, target_project_id: targetProjectId, }); } teamProjectCreated({ userId, role }) { this.telemetry.track('User created project', { user_id: userId, role, }); } sourceControlSettingsUpdated({ branchName, readOnlyInstance, repoType, connected, }) { this.telemetry.track('User updated source control settings', { branch_name: branchName, read_only_instance: readOnlyInstance, repo_type: repoType, connected, }); } sourceControlUserStartedPullUi({ workflowUpdates, workflowConflicts, credConflicts, }) { this.telemetry.track('User started pull via UI', { workflow_updates: workflowUpdates, workflow_conflicts: workflowConflicts, cred_conflicts: credConflicts, }); } sourceControlUserFinishedPullUi({ workflowUpdates, }) { this.telemetry.track('User finished pull via UI', { workflow_updates: workflowUpdates, }); } sourceControlUserPulledApi({ workflowUpdates, forced, }) { this.telemetry.track('User pulled via API', { workflow_updates: workflowUpdates, forced, }); } sourceControlUserStartedPushUi({ workflowsEligible, workflowsEligibleWithConflicts, credsEligible, credsEligibleWithConflicts, variablesEligible, }) { this.telemetry.track('User started push via UI', { workflows_eligible: workflowsEligible, workflows_eligible_with_conflicts: workflowsEligibleWithConflicts, creds_eligible: credsEligible, creds_eligible_with_conflicts: credsEligibleWithConflicts, variables_eligible: variablesEligible, }); } sourceControlUserFinishedPushUi({ workflowsEligible, workflowsPushed, credsPushed, variablesPushed, }) { this.telemetry.track('User finished push via UI', { workflows_eligible: workflowsEligible, workflows_pushed: workflowsPushed, creds_pushed: credsPushed, variables_pushed: variablesPushed, }); } licenseRenewalAttempted({ success }) { this.telemetry.track('Instance attempted to refresh license', { success, }); } variableCreated() { this.telemetry.track('User created variable'); } externalSecretsProviderSettingsSaved({ userId, vaultType, isValid, isNew, errorMessage, }) { this.telemetry.track('User updated external secrets settings', { user_id: userId, vault_type: vaultType, is_valid: isValid, is_new: isNew, error_message: errorMessage, }); } publicApiInvoked({ userId, path, method, apiVersion, }) { this.telemetry.track('User invoked API', { user_id: userId, path, method, api_version: apiVersion, }); } publicApiKeyCreated(event) { const { user, publicApi } = event; this.telemetry.track('API key created', { user_id: user.id, public_api: publicApi, }); } publicApiKeyDeleted(event) { const { user, publicApi } = event; this.telemetry.track('API key deleted', { user_id: user.id, public_api: publicApi, }); } communityPackageInstalled({ user, inputString, packageName, success, packageVersion, packageNodeNames, packageAuthor, packageAuthorEmail, failureReason, }) { this.telemetry.track('cnr package install finished', { user_id: user.id, input_string: inputString, package_name: packageName, success, package_version: packageVersion, package_node_names: packageNodeNames, package_author: packageAuthor, package_author_email: packageAuthorEmail, failure_reason: failureReason, }); } communityPackageUpdated({ user, packageName, packageVersionCurrent, packageVersionNew, packageNodeNames, packageAuthor, packageAuthorEmail, }) { this.telemetry.track('cnr package updated', { user_id: user.id, package_name: packageName, package_version_current: packageVersionCurrent, package_version_new: packageVersionNew, package_node_names: packageNodeNames, package_author: packageAuthor, package_author_email: packageAuthorEmail, }); } communityPackageDeleted({ user, packageName, packageVersion, packageNodeNames, packageAuthor, packageAuthorEmail, }) { this.telemetry.track('cnr package deleted', { user_id: user.id, package_name: packageName, package_version: packageVersion, package_node_names: packageNodeNames, package_author: packageAuthor, package_author_email: packageAuthorEmail, }); } credentialsCreated({ user, credentialType, credentialId, projectId, projectType, }) { this.telemetry.track('User created credentials', { user_id: user.id, credential_type: credentialType, credential_id: credentialId, project_id: projectId, project_type: projectType, }); } credentialsShared({ user, credentialType, credentialId, userIdSharer, userIdsShareesAdded, shareesRemoved, }) { this.telemetry.track('User updated cred sharing', { user_id: user.id, credential_type: credentialType, credential_id: credentialId, user_id_sharer: userIdSharer, user_ids_sharees_added: userIdsShareesAdded, sharees_removed: shareesRemoved, }); } credentialsUpdated({ user, credentialId, credentialType, }) { this.telemetry.track('User updated credentials', { user_id: user.id, credential_type: credentialType, credential_id: credentialId, }); } credentialsDeleted({ user, credentialId, credentialType, }) { this.telemetry.track('User deleted credentials', { user_id: user.id, credential_type: credentialType, credential_id: credentialId, }); } ldapGeneralSyncFinished({ type, succeeded, usersSynced, error, }) { this.telemetry.track('Ldap general sync finished', { type, succeeded, users_synced: usersSynced, error, }); } ldapSettingsUpdated({ userId, loginIdAttribute, firstNameAttribute, lastNameAttribute, emailAttribute, ldapIdAttribute, searchPageSize, searchTimeout, synchronizationEnabled, synchronizationInterval, loginLabel, loginEnabled, }) { this.telemetry.track('User updated Ldap settings', { user_id: userId, loginIdAttribute, firstNameAttribute, lastNameAttribute, emailAttribute, ldapIdAttribute, searchPageSize, searchTimeout, synchronizationEnabled, synchronizationInterval, loginLabel, loginEnabled, }); } ldapLoginSyncFailed({ error }) { this.telemetry.track('Ldap login sync failed', { error }); } loginFailedDueToLdapDisabled({ userId, }) { this.telemetry.track('User login failed since ldap disabled', { user_ud: userId }); } workflowCreated({ user, workflow, publicApi, projectId, projectType, }) { const { nodeGraph } = n8n_workflow_1.TelemetryHelpers.generateNodesGraph(workflow, this.nodeTypes); this.telemetry.track('User created workflow', { user_id: user.id, workflow_id: workflow.id, node_graph_string: JSON.stringify(nodeGraph), public_api: publicApi, project_id: projectId, project_type: projectType, }); } workflowDeleted({ user, workflowId, publicApi }) { this.telemetry.track('User deleted workflow', { user_id: user.id, workflow_id: workflowId, public_api: publicApi, }); } workflowSharingUpdated({ workflowId, userIdSharer, userIdList, }) { this.telemetry.track('User updated workflow sharing', { workflow_id: workflowId, user_id_sharer: userIdSharer, user_id_list: userIdList, }); } async workflowSaved({ user, workflow, publicApi }) { var _a, _b; const isCloudDeployment = config_1.default.getEnv('deployment.type') === 'cloud'; const { nodeGraph } = n8n_workflow_1.TelemetryHelpers.generateNodesGraph(workflow, this.nodeTypes, { isCloudDeployment, }); let userRole = undefined; const role = await this.sharedWorkflowRepository.findSharingRole(user.id, workflow.id); if (role) { userRole = role === 'workflow:owner' ? 'owner' : 'sharee'; } else { const workflowOwner = await this.sharedWorkflowRepository.getWorkflowOwningProject(workflow.id); if (workflowOwner) { const projectRole = await this.projectRelationRepository.findProjectRole({ userId: user.id, projectId: workflowOwner.id, }); if (projectRole && projectRole !== 'project:personalOwner') { userRole = 'member'; } } } const notesCount = Object.keys(nodeGraph.notes).length; const overlappingCount = Object.values(nodeGraph.notes).filter((note) => note.overlapping).length; this.telemetry.track('User saved workflow', { user_id: user.id, workflow_id: workflow.id, node_graph_string: JSON.stringify(nodeGraph), notes_count_overlapping: overlappingCount, notes_count_non_overlapping: notesCount - overlappingCount, version_cli: constants_1.N8N_VERSION, num_tags: (_b = (_a = workflow.tags) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0, public_api: publicApi, sharing_role: userRole, }); } async workflowPostExecute({ workflow, runData, userId, }) { var _a, _b, _c, _d, _e, _f, _g, _h, _j; if (!workflow.id) { return; } if ((runData === null || runData === void 0 ? void 0 : runData.status) === 'waiting') { return; } const telemetryProperties = { workflow_id: workflow.id, is_manual: false, version_cli: constants_1.N8N_VERSION, success: false, }; if (userId) { telemetryProperties.user_id = userId; } if ((_b = (_a = runData === null || runData === void 0 ? void 0 : runData.data.resultData.error) === null || _a === void 0 ? void 0 : _a.message) === null || _b === void 0 ? void 0 : _b.includes('canceled')) { runData.status = 'canceled'; } telemetryProperties.success = !!(runData === null || runData === void 0 ? void 0 : runData.finished); const executionStatus = runData ? (0, sharedHookFunctions_1.determineFinalExecutionStatus)(runData) : 'unknown'; if (runData !== undefined) { telemetryProperties.execution_mode = runData.mode; telemetryProperties.is_manual = runData.mode === 'manual'; let nodeGraphResult = null; if (!telemetryProperties.success && (runData === null || runData === void 0 ? void 0 : runData.data.resultData.error)) { telemetryProperties.error_message = runData === null || runData === void 0 ? void 0 : runData.data.resultData.error.message; let errorNodeName = 'node' in (runData === null || runData === void 0 ? void 0 : runData.data.resultData.error) ? (_c = runData === null || runData === void 0 ? void 0 : runData.data.resultData.error.node) === null || _c === void 0 ? void 0 : _c.name : undefined; telemetryProperties.error_node_type = 'node' in (runData === null || runData === void 0 ? void 0 : runData.data.resultData.error) ? (_d = runData === null || runData === void 0 ? void 0 : runData.data.resultData.error.node) === null || _d === void 0 ? void 0 : _d.type : undefined; if (runData.data.resultData.lastNodeExecuted) { const lastNode = n8n_workflow_1.TelemetryHelpers.getNodeTypeForName(workflow, runData.data.resultData.lastNodeExecuted); if (lastNode !== undefined) { telemetryProperties.error_node_type = lastNode.type; errorNodeName = lastNode.name; } } if (telemetryProperties.is_manual) { nodeGraphResult = n8n_workflow_1.TelemetryHelpers.generateNodesGraph(workflow, this.nodeTypes); telemetryProperties.node_graph = nodeGraphResult.nodeGraph; telemetryProperties.node_graph_string = JSON.stringify(nodeGraphResult.nodeGraph); if (errorNodeName) { telemetryProperties.error_node_id = nodeGraphResult.nameIndices[errorNodeName]; } } } if (telemetryProperties.is_manual) { if (!nodeGraphResult) { nodeGraphResult = n8n_workflow_1.TelemetryHelpers.generateNodesGraph(workflow, this.nodeTypes); } let userRole = undefined; if (userId) { const role = await this.sharedWorkflowRepository.findSharingRole(userId, workflow.id); if (role) { userRole = role === 'workflow:owner' ? 'owner' : 'sharee'; } } const manualExecEventProperties = { user_id: userId, workflow_id: workflow.id, status: executionStatus, executionStatus: (_e = runData === null || runData === void 0 ? void 0 : runData.status) !== null && _e !== void 0 ? _e : 'unknown', error_message: telemetryProperties.error_message, error_node_type: telemetryProperties.error_node_type, node_graph_string: telemetryProperties.node_graph_string, error_node_id: telemetryProperties.error_node_id, webhook_domain: null, sharing_role: userRole, }; if (!manualExecEventProperties.node_graph_string) { nodeGraphResult = n8n_workflow_1.TelemetryHelpers.generateNodesGraph(workflow, this.nodeTypes); manualExecEventProperties.node_graph_string = JSON.stringify(nodeGraphResult.nodeGraph); } if ((_f = runData.data.startData) === null || _f === void 0 ? void 0 : _f.destinationNode) { const telemetryPayload = { ...manualExecEventProperties, node_type: (_h = n8n_workflow_1.TelemetryHelpers.getNodeTypeForName(workflow, (_g = runData.data.startData) === null || _g === void 0 ? void 0 : _g.destinationNode)) === null || _h === void 0 ? void 0 : _h.type, node_id: nodeGraphResult.nameIndices[(_j = runData.data.startData) === null || _j === void 0 ? void 0 : _j.destinationNode], }; this.telemetry.track('Manual node exec finished', telemetryPayload); } else { nodeGraphResult.webhookNodeNames.forEach((name) => { var _a, _b, _c, _d, _e, _f, _g; const execJson = (_f = (_e = (_d = (_c = (_b = (_a = runData.data.resultData.runData[name]) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.main) === null || _d === void 0 ? void 0 : _d[0]) === null || _e === void 0 ? void 0 : _e[0]) === null || _f === void 0 ? void 0 : _f.json; if (((_g = execJson === null || execJson === void 0 ? void 0 : execJson.headers) === null || _g === void 0 ? void 0 : _g.origin) && execJson.headers.origin !== '') { manualExecEventProperties.webhook_domain = (0, psl_1.get)(execJson.headers.origin.replace(/^https?:\/\//, '')); } }); this.telemetry.track('Manual workflow exec finished', manualExecEventProperties); } } } this.telemetry.trackWorkflowExecution(telemetryProperties); } async serverStarted() { const cpus = node_os_1.default.cpus(); const binaryDataConfig = config_1.default.getEnv('binaryDataManager'); const isS3Selected = config_1.default.getEnv('binaryDataManager.mode') === 's3'; const isS3Available = config_1.default.getEnv('binaryDataManager.availableModes').includes('s3'); const isS3Licensed = this.license.isBinaryDataS3Licensed(); const authenticationMethod = config_1.default.getEnv('userManagement.authenticationMethod'); const info = { version_cli: constants_1.N8N_VERSION, db_type: this.globalConfig.database.type, n8n_version_notifications_enabled: this.globalConfig.versionNotifications.enabled, n8n_disable_production_main_process: this.globalConfig.endpoints.disableProductionWebhooksOnMainProcess, system_info: { os: { type: node_os_1.default.type(), version: node_os_1.default.version(), }, memory: node_os_1.default.totalmem() / 1024, cpus: { count: cpus.length, model: cpus[0].model, speed: cpus[0].speed, }, }, execution_variables: { executions_mode: config_1.default.getEnv('executions.mode'), executions_timeout: config_1.default.getEnv('executions.timeout'), executions_timeout_max: config_1.default.getEnv('executions.maxTimeout'), executions_data_save_on_error: config_1.default.getEnv('executions.saveDataOnError'), executions_data_save_on_success: config_1.default.getEnv('executions.saveDataOnSuccess'), executions_data_save_on_progress: config_1.default.getEnv('executions.saveExecutionProgress'), executions_data_save_manual_executions: config_1.default.getEnv('executions.saveDataManualExecutions'), executions_data_prune: config_1.default.getEnv('executions.pruneData'), executions_data_max_age: config_1.default.getEnv('executions.pruneDataMaxAge'), }, n8n_deployment_type: config_1.default.getEnv('deployment.type'), n8n_binary_data_mode: binaryDataConfig.mode, smtp_set_up: this.globalConfig.userManagement.emails.mode === 'smtp', ldap_allowed: authenticationMethod === 'ldap', saml_enabled: authenticationMethod === 'saml', license_plan_name: this.license.getPlanName(), license_tenant_id: config_1.default.getEnv('license.tenantId'), binary_data_s3: isS3Available && isS3Selected && isS3Licensed, multi_main_setup_enabled: config_1.default.getEnv('multiMainSetup.enabled'), }; const firstWorkflow = await this.workflowRepository.findOne({ select: ['createdAt'], order: { createdAt: 'ASC' }, where: {}, }); this.telemetry.identify(info); this.telemetry.track('Instance started', { ...info, earliest_workflow_created: firstWorkflow === null || firstWorkflow === void 0 ? void 0 : firstWorkflow.createdAt, }); } sessionStarted({ pushRef }) { this.telemetry.track('Session started', { session_id: pushRef }); } instanceStopped() { this.telemetry.track('User instance stopped'); } async instanceOwnerSetup({ userId }) { this.telemetry.track('Owner finished instance setup', { user_id: userId }); } firstProductionWorkflowSucceeded({ projectId, workflowId, userId, }) { this.telemetry.track('Workflow first prod success', { project_id: projectId, workflow_id: workflowId, user_id: userId, }); } firstWorkflowDataLoaded({ userId, workflowId, nodeType, nodeId, credentialType, credentialId, }) { this.telemetry.track('Workflow first data fetched', { user_id: userId, workflow_id: workflowId, node_type: nodeType, node_id: nodeId, credential_type: credentialType, credential_id: credentialId, }); } userChangedRole({ userId, targetUserId, targetUserNewRole, publicApi, }) { this.telemetry.track('User changed role', { user_id: userId, target_user_id: targetUserId, target_user_new_role: targetUserNewRole, public_api: publicApi, }); } userRetrievedUser({ userId, publicApi }) { this.telemetry.track('User retrieved user', { user_id: userId, public_api: publicApi, }); } userRetrievedAllUsers({ userId, publicApi }) { this.telemetry.track('User retrieved all users', { user_id: userId, public_api: publicApi, }); } userRetrievedExecution({ userId, publicApi }) { this.telemetry.track('User retrieved execution', { user_id: userId, public_api: publicApi, }); } userRetrievedAllExecutions({ userId, publicApi, }) { this.telemetry.track('User retrieved all executions', { user_id: userId, public_api: publicApi, }); } userRetrievedWorkflow({ userId, publicApi }) { this.telemetry.track('User retrieved workflow', { user_id: userId, public_api: publicApi, }); } userRetrievedAllWorkflows({ userId, publicApi, }) { this.telemetry.track('User retrieved all workflows', { user_id: userId, public_api: publicApi, }); } userUpdated({ user, fieldsChanged }) { this.telemetry.track('User changed personal settings', { user_id: user.id, fields_changed: fieldsChanged, }); } userDeleted({ user, publicApi, targetUserOldStatus, migrationStrategy, targetUserId, migrationUserId, }) { this.telemetry.track('User deleted user', { user_id: user.id, public_api: publicApi, target_user_old_status: targetUserOldStatus, migration_strategy: migrationStrategy, target_user_id: targetUserId, migration_user_id: migrationUserId, }); } userInvited({ user, targetUserId, publicApi, emailSent, inviteeRole, }) { this.telemetry.track('User invited new user', { user_id: user.id, target_user_id: targetUserId, public_api: publicApi, email_sent: emailSent, invitee_role: inviteeRole, }); } userSignedUp({ user, userType, wasDisabledLdapUser }) { this.telemetry.track('User signed up', { user_id: user.id, user_type: userType, was_disabled_ldap_user: wasDisabledLdapUser, }); } userSubmittedPersonalizationSurvey({ userId, answers, }) { const camelCaseKeys = Object.keys(answers); const personalizationSurveyData = { user_id: userId }; camelCaseKeys.forEach((camelCaseKey) => { personalizationSurveyData[(0, change_case_1.snakeCase)(camelCaseKey)] = answers[camelCaseKey]; }); this.telemetry.track('User responded to personalization questions', personalizationSurveyData); } emailFailed({ user, messageType, publicApi }) { this.telemetry.track('Instance failed to send transactional email to user', { user_id: user.id, message_type: messageType, public_api: publicApi, }); } userTransactionalEmailSent({ userId, messageType, publicApi, }) { this.telemetry.track('User sent transactional email', { user_id: userId, message_type: messageType, public_api: publicApi, }); } userInviteEmailClick({ invitee }) { this.telemetry.track('User clicked invite link from email', { user_id: invitee.id, }); } userPasswordResetEmailClick({ user }) { this.telemetry.track('User clicked password reset link from email', { user_id: user.id, }); } userPasswordResetRequestClick({ user, }) { this.telemetry.track('User requested password reset while logged out', { user_id: user.id, }); } }; exports.TelemetryEventRelay = TelemetryEventRelay; exports.TelemetryEventRelay = TelemetryEventRelay = __decorate([ (0, typedi_1.Service)(), __metadata("design:paramtypes", [event_service_1.EventService, telemetry_1.Telemetry, License_1.License, config_2.GlobalConfig, workflow_repository_1.WorkflowRepository, NodeTypes_1.NodeTypes, sharedWorkflow_repository_1.SharedWorkflowRepository, projectRelation_repository_1.ProjectRelationRepository]) ], TelemetryEventRelay); //# sourceMappingURL=telemetry-event-relay.js.map