From 75874151fde450484b523a5a01ac4a57a645c048 Mon Sep 17 00:00:00 2001 From: Aileen Booker Date: Thu, 18 Jan 2024 07:42:02 -0400 Subject: [PATCH] Removed ModelEventsAnalytics refs https://linear.app/tryghost/issue/BIZ-6/[wip]-update-segment-events - With the removal of the `integration.added` event, we have no more model events remaining to listen to for our analytics - Removal of the function entirely seems the easier and more straightforward way --- .../services/segment/ModelEventsAnalytics.js | 93 ------------- .../core/server/services/segment/index.js | 14 -- .../segment/ModelEventsAnalytics.test.js | 130 ------------------ 3 files changed, 237 deletions(-) delete mode 100644 ghost/core/core/server/services/segment/ModelEventsAnalytics.js delete mode 100644 ghost/core/test/unit/server/services/segment/ModelEventsAnalytics.test.js diff --git a/ghost/core/core/server/services/segment/ModelEventsAnalytics.js b/ghost/core/core/server/services/segment/ModelEventsAnalytics.js deleted file mode 100644 index 336ca2a614..0000000000 --- a/ghost/core/core/server/services/segment/ModelEventsAnalytics.js +++ /dev/null @@ -1,93 +0,0 @@ -const _ = require('lodash'); - -/** - * @typedef {import('@tryghost/logging')} logging - */ - -/** - * @typedef {import('analytics-node')} analytics - */ - -/** - * @typedef {object} IExceptionHandler - * @prop {(err: Error) => void} captureException - */ - -/** - * @typedef {import('../../lib/common/events')} events - */ - -/** - * @typedef {object} IModelEventsAnalytics - * @param {analytics} analytics - * @param {logging} logging - * @param {object} trackDefaults - * @param {string} prefix - * @param {IExceptionHandler} exceptionHandler - * @param {events} events - * @prop {} subscribeToEvents - */ - -/** - * Listens to model events to layer on analytics - also uses the "fake" theme.uploaded - * event from the theme API - */ -module.exports = class ModelEventsAnalytics { - /** @type {analytics} */ - #analytics; - /** @type {object} */ - #trackDefaults; - /** @type {string} */ - #prefix; - /** @type {IExceptionHandler} */ - #exceptionHandler; - /** @type {events} */ - #events; - /** @type {logging} */ - #logging; - - /** - * @type {Array<{event: string, name: string, data?: object}>} - */ - #toTrack = [ - { - event: 'integration.added', - name: 'Custom Integration Added' - } - ]; - - constructor(deps) { - this.#analytics = deps.analytics; - this.#trackDefaults = deps.trackDefaults; - this.#prefix = deps.prefix; - this.#exceptionHandler = deps.exceptionHandler; - this.#events = deps.events; - this.#logging = deps.logging; - } - - async #handleEvent(event) { - try { - this.#analytics.track(event); - } catch (err) { - this.#logging.error(err); - this.#exceptionHandler.captureException(err); - } - } - - subscribeToEvents() { - this.#toTrack.forEach(({event, name, data = {}}) => { - this.#events.on(event, async (eventData = {}) => { - // extract desired properties from eventData and rename keys if necessary - const mappedData = _.mapValues(data || {}, v => eventData[v]); - - const eventToTrack = { - ...this.#trackDefaults, - event: this.#prefix + name, - ...mappedData - }; - - await this.#handleEvent(eventToTrack); - }); - }); - } -}; diff --git a/ghost/core/core/server/services/segment/index.js b/ghost/core/core/server/services/segment/index.js index e15d3a91ff..a087f5acb8 100644 --- a/ghost/core/core/server/services/segment/index.js +++ b/ghost/core/core/server/services/segment/index.js @@ -3,9 +3,7 @@ const config = require('../../../shared/config'); const sentry = require('../../../shared/sentry'); const logging = require('@tryghost/logging'); const DomainEvents = require('@tryghost/domain-events'); -const events = require('../../lib/common/events'); -const ModelEventsAnalytics = require('./ModelEventsAnalytics'); const DomainEventsAnalytics = require('./DomainEventsAnalytics'); module.exports.init = function () { @@ -22,18 +20,6 @@ module.exports.init = function () { logging }); - const modelEventsAnalytics = new ModelEventsAnalytics({ - analytics, - trackDefaults, - prefix, - exceptionHandler: sentry, - events, - logging - }); - - // Listen to model events - modelEventsAnalytics.subscribeToEvents(); - // Listen to domain events subscribeToDomainEvents.subscribeToEvents(); }; diff --git a/ghost/core/test/unit/server/services/segment/ModelEventsAnalytics.test.js b/ghost/core/test/unit/server/services/segment/ModelEventsAnalytics.test.js deleted file mode 100644 index 94db6aa0e8..0000000000 --- a/ghost/core/test/unit/server/services/segment/ModelEventsAnalytics.test.js +++ /dev/null @@ -1,130 +0,0 @@ -const assert = require('assert/strict'); -const sinon = require('sinon'); - -// To test -const ModelEventsAnalytics = require('../../../../../core/server/services/segment/ModelEventsAnalytics'); - -// Stubbed dependencies -const events = require('../../../../../core/server/lib/common/events'); - -describe('ModelEventsAnalytics', function () { - describe('Constructor', function () { - it('doesn\'t throw', function () { - new ModelEventsAnalytics({}); - }); - }); - - describe('Model events analytics service', function () { - let modelEventsAnalytics; - let analyticsStub; - let exceptionHandlerStub; - let loggingStub; - let eventStub; - - beforeEach(function () { - analyticsStub = sinon.stub(); - exceptionHandlerStub = sinon.stub(); - loggingStub = sinon.stub(); - eventStub = sinon.stub(); - }); - - afterEach(function () { - sinon.restore(); - }); - - it('subscribes to events', async function () { - modelEventsAnalytics = new ModelEventsAnalytics({ - analytics: analyticsStub, - trackDefaults: { - userId: '1234', - properties: {email: 'john@test.com'} - }, - prefix: 'Pro: ', - exceptionHandler: { - captureException: exceptionHandlerStub - }, - events: { - on: eventStub - }, - logging: { - error: loggingStub - } - }); - - modelEventsAnalytics.subscribeToEvents(); - - // as per #toTrack Array - assert(eventStub.callCount === 1); - assert(loggingStub.callCount === 0); - }); - - it('handles common model events', async function () { - modelEventsAnalytics = new ModelEventsAnalytics({ - analytics: { - track: analyticsStub - }, - trackDefaults: { - userId: '1234', - properties: {email: 'john@test.com'} - }, - prefix: 'Pro: ', - exceptionHandler: { - captureException: exceptionHandlerStub - }, - events, - logging: { - error: loggingStub - } - }); - - modelEventsAnalytics.subscribeToEvents(); - - events.emit('theme.uploaded', {name: 'Custom Super Theme'}); - events.emit('post.published'); - events.emit('page.published'); - events.emit('integration.added'); - - assert(analyticsStub.callCount === 1); - assert(analyticsStub.getCall(0).calledWithExactly({ - userId: '1234', - properties: {email: 'john@test.com'}, - event: 'Pro: Custom Integration Added' - })); - - events.emit('post.unpublished'); - - // Analytics should not be called again - assert(analyticsStub.callCount === 1); - assert(loggingStub.callCount === 0); - }); - - it('can handle tracking errors', async function () { - let error = new Error('Test error'); - modelEventsAnalytics = new ModelEventsAnalytics({ - analytics: { - track: analyticsStub.throws(error) - }, - trackDefaults: {}, - prefix: '', - exceptionHandler: { - captureException: exceptionHandlerStub - }, - events, - logging: { - error: loggingStub - } - }); - - modelEventsAnalytics.subscribeToEvents(); - - try { - events.emit('post.published'); - } catch (err) { - assert(analyticsStub.callCount === 1); - assert(exceptionHandlerStub.callCount === 1); - assert(exceptionHandlerStub.calledWith(error)); - assert(loggingStub.callCount === 1); - } - }); - }); -});