diff --git a/packages/core/strapi/lib/commands/__tests__/data-transfer/export.test.js b/packages/core/strapi/lib/commands/__tests__/data-transfer/export.test.js index 56e1e7fec7..43f4a8292c 100644 --- a/packages/core/strapi/lib/commands/__tests__/data-transfer/export.test.js +++ b/packages/core/strapi/lib/commands/__tests__/data-transfer/export.test.js @@ -55,6 +55,7 @@ describe('Export', () => { // mock utils const mockUtils = { + getTransferTelemetryPayload: jest.fn().mockReturnValue({}), loadersFactory: jest.fn().mockReturnValue({ updateLoader: jest.fn() }), formatDiagnostic: jest.fn(), createStrapiInstance() { diff --git a/packages/core/strapi/lib/commands/__tests__/data-transfer/import.test.js b/packages/core/strapi/lib/commands/__tests__/data-transfer/import.test.js index 58668c64f4..6b2a726233 100644 --- a/packages/core/strapi/lib/commands/__tests__/data-transfer/import.test.js +++ b/packages/core/strapi/lib/commands/__tests__/data-transfer/import.test.js @@ -63,6 +63,7 @@ describe('Import', () => { // mock utils const mockUtils = { + getTransferTelemetryPayload: jest.fn().mockReturnValue({}), loadersFactory: jest.fn().mockReturnValue({ updateLoader: jest.fn() }), formatDiagnostic: jest.fn(), createStrapiInstance: jest.fn().mockReturnValue({ diff --git a/packages/core/strapi/lib/commands/__tests__/data-transfer/transfer.test.js b/packages/core/strapi/lib/commands/__tests__/data-transfer/transfer.test.js index 33fd7880dd..c05c60f947 100644 --- a/packages/core/strapi/lib/commands/__tests__/data-transfer/transfer.test.js +++ b/packages/core/strapi/lib/commands/__tests__/data-transfer/transfer.test.js @@ -5,6 +5,7 @@ const { expectExit } = require('./shared/transfer.test.utils'); describe('Transfer', () => { // mock utils const mockUtils = { + getTransferTelemetryPayload: jest.fn().mockReturnValue({}), loadersFactory: jest.fn().mockReturnValue({ updateLoader: jest.fn() }), formatDiagnostic: jest.fn(), createStrapiInstance() { diff --git a/packages/core/strapi/lib/commands/transfer/export.js b/packages/core/strapi/lib/commands/transfer/export.js index 769b140797..f4f2a712d7 100644 --- a/packages/core/strapi/lib/commands/transfer/export.js +++ b/packages/core/strapi/lib/commands/transfer/export.js @@ -24,6 +24,7 @@ const { loadersFactory, exitMessageText, abortTransfer, + getTransferTelemetryPayload, } = require('./utils'); const { exitWith } = require('../utils/helpers'); /** @@ -103,19 +104,10 @@ module.exports = async (opts) => { updateLoader(stage, data); }); - const getTelemetryPayload = (/* payload */) => { - return { - eventProperties: { - source: engine.sourceProvider.name, - destination: engine.destinationProvider.name, - }, - }; - }; - progress.on('transfer::start', async () => { console.log(`Starting export...`); - await strapi.telemetry.send('didDEITSProcessStart', getTelemetryPayload()); + await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine)); }); let results; @@ -134,11 +126,13 @@ module.exports = async (opts) => { throw new TransferEngineTransferError(`Export file not created "${outFile}"`); } } catch { - await strapi.telemetry.send('didDEITSProcessFail', getTelemetryPayload()); + await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine)); exitWith(1, exitMessageText('export', true)); } - await strapi.telemetry.send('didDEITSProcessFinish', getTelemetryPayload()); + // Note: we need to await telemetry or else the process ends before it is sent + await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine)); + try { const table = buildTransferTable(results.engine); console.log(table.toString()); diff --git a/packages/core/strapi/lib/commands/transfer/import.js b/packages/core/strapi/lib/commands/transfer/import.js index 5a649cf4ed..173dd734fe 100644 --- a/packages/core/strapi/lib/commands/transfer/import.js +++ b/packages/core/strapi/lib/commands/transfer/import.js @@ -20,6 +20,7 @@ const { loadersFactory, exitMessageText, abortTransfer, + getTransferTelemetryPayload, } = require('./utils'); const { exitWith } = require('../utils/helpers'); @@ -122,18 +123,12 @@ module.exports = async (opts) => { updateLoader(stage, data); }); - const getTelemetryPayload = () => { - return { - eventProperties: { - source: engine.sourceProvider.name, - destination: engine.destinationProvider.name, - }, - }; - }; - progress.on('transfer::start', async () => { console.log('Starting import...'); - await strapiInstance.telemetry.send('didDEITSProcessStart', getTelemetryPayload()); + await strapiInstance.telemetry.send( + 'didDEITSProcessStart', + getTransferTelemetryPayload(engine) + ); }); let results; @@ -146,7 +141,7 @@ module.exports = async (opts) => { results = await engine.transfer(); } catch (e) { - await strapiInstance.telemetry.send('didDEITSProcessFail', getTelemetryPayload()); + await strapiInstance.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine)); exitWith(1, exitMessageText('import', true)); } @@ -157,7 +152,8 @@ module.exports = async (opts) => { console.error('There was an error displaying the results of the transfer.'); } - await strapiInstance.telemetry.send('didDEITSProcessFinish', getTelemetryPayload()); + // Note: we need to await telemetry or else the process ends before it is sent + await strapiInstance.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine)); await strapiInstance.destroy(); exitWith(0, exitMessageText('import')); diff --git a/packages/core/strapi/lib/commands/transfer/transfer.js b/packages/core/strapi/lib/commands/transfer/transfer.js index 9ced25ffd9..a59b5a7bcf 100644 --- a/packages/core/strapi/lib/commands/transfer/transfer.js +++ b/packages/core/strapi/lib/commands/transfer/transfer.js @@ -21,6 +21,7 @@ const { loadersFactory, exitMessageText, abortTransfer, + getTransferTelemetryPayload, } = require('./utils'); const { exitWith } = require('../utils/helpers'); @@ -161,10 +162,14 @@ module.exports = async (opts) => { updateLoader(stage, data).fail(); }); - let results; - try { + progress.on('transfer::start', async () => { console.log(`Starting transfer...`); + await strapi.telemetry.send('didDEITSProcessStart', getTransferTelemetryPayload(engine)); + }); + + let results; + try { // Abort transfer if user interrupts process ['SIGTERM', 'SIGINT', 'SIGQUIT'].forEach((signal) => { process.removeAllListeners(signal); @@ -173,10 +178,19 @@ module.exports = async (opts) => { results = await engine.transfer(); } catch (e) { + await strapi.telemetry.send('didDEITSProcessFail', getTransferTelemetryPayload(engine)); exitWith(1, exitMessageText('transfer', true)); } - const table = buildTransferTable(results.engine); - console.log(table.toString()); + // Note: we need to await telemetry or else the process ends before it is sent + await strapi.telemetry.send('didDEITSProcessFinish', getTransferTelemetryPayload(engine)); + + try { + const table = buildTransferTable(results.engine); + console.log(table.toString()); + } catch (e) { + console.error('There was an error displaying the results of the transfer.'); + } + exitWith(0, exitMessageText('transfer')); }; diff --git a/packages/core/strapi/lib/commands/transfer/utils.js b/packages/core/strapi/lib/commands/transfer/utils.js index b42f1b3022..54acf1dad7 100644 --- a/packages/core/strapi/lib/commands/transfer/utils.js +++ b/packages/core/strapi/lib/commands/transfer/utils.js @@ -242,10 +242,26 @@ const loadersFactory = (defaultLoaders = {}) => { }; }; +/** + * Get the telemetry data to be sent for a didDEITSProcess* event from an initialized transfer engine object + * + * @param {import('@strapi/data-transfer/types').ITransferEngine} engine Initialized transfer engine + * @returns {object} Telemetry properties object + */ +const getTransferTelemetryPayload = (engine) => { + return { + eventProperties: { + source: engine?.sourceProvider?.name, + destination: engine?.destinationProvider?.name, + }, + }; +}; + module.exports = { loadersFactory, buildTransferTable, getDefaultExportName, + getTransferTelemetryPayload, DEFAULT_IGNORED_CONTENT_TYPES, createStrapiInstance, excludeOption,