0
Fork 0
mirror of https://github.com/TryGhost/Ghost.git synced 2025-03-18 02:21:47 -05:00

Improved dependency structure of member-attribution package

refs https://github.com/TryGhost/Ghost/pull/15266#discussion_r950337271

- Moved dependency building to the the service wrapper
- Don't listen for events inside the constructor
- Used a models option to pass around models to make constructors more readable
This commit is contained in:
Simon Backx 2022-08-22 11:36:24 +02:00
parent 0943daad72
commit 02168b41ce
7 changed files with 70 additions and 45 deletions

View file

@ -1,26 +1,49 @@
const urlService = require('../url');
const labsService = require('../../../shared/labs');
const DomainEvents = require('@tryghost/domain-events');
class MemberAttributionServiceWrapper {
init() {
if (this.service) {
if (this.eventHandler) {
// Prevent creating duplicate DomainEvents subscribers
return;
}
const MemberAttributionService = require('@tryghost/member-attribution');
// Wire up all the dependencies
const {MemberAttributionService, UrlTranslator, AttributionBuilder, EventHandler} = require('@tryghost/member-attribution');
const models = require('../../models');
// For now we don't need to expose anything (yet)
const urlTranslator = new UrlTranslator({
urlService,
models: {
Post: models.Post,
User: models.User,
Tag: models.Tag
}
});
const attributionBuilder = new AttributionBuilder({urlTranslator});
// Expose the service
this.service = new MemberAttributionService({
Post: models.Post,
User: models.User,
Tag: models.Tag,
MemberCreatedEvent: models.MemberCreatedEvent,
SubscriptionCreatedEvent: models.SubscriptionCreatedEvent,
urlService,
models: {
MemberCreatedEvent: models.MemberCreatedEvent,
SubscriptionCreatedEvent: models.SubscriptionCreatedEvent
},
attributionBuilder,
labsService
});
// Listen for events and store them in the database
this.eventHandler = new EventHandler({
models: {
MemberCreatedEvent: models.MemberCreatedEvent,
SubscriptionCreatedEvent: models.SubscriptionCreatedEvent
},
DomainEvents,
labsService
});
this.eventHandler.subscribe();
}
}

View file

@ -1 +1,6 @@
module.exports = require('./lib/service');
module.exports = {
MemberAttributionService: require('./lib/service'),
EventHandler: require('./lib/event-handler'),
AttributionBuilder: require('./lib/attribution'),
UrlTranslator: require('./lib/url-translator')
};

View file

@ -16,13 +16,8 @@ class Attribution {
* @param {'page'|'post'|'author'|'tag'|'url'} [data.type]
*/
constructor({id, url, type}, {urlTranslator}) {
/** @type {string|null} */
this.id = id;
/** @type {string|null} */
this.url = url;
/** @type {'page'|'post'|'author'|'tag'|'url'} */
this.type = type;
/**

View file

@ -1,9 +1,17 @@
const {MemberCreatedEvent, SubscriptionCreatedEvent} = require('@tryghost/member-events');
class MemberAttributionEventHandler {
constructor({MemberCreatedEvent: MemberCreatedEventModel, SubscriptionCreatedEvent: SubscriptionCreatedEventModel, DomainEvents, labsService}) {
this._MemberCreatedEventModel = MemberCreatedEventModel;
this._SubscriptionCreatedEvent = SubscriptionCreatedEventModel;
/**
*
* @param {Object} deps
* @param {Object} deps.DomainEvents
* @param {Object} deps.labsService
* @param {Object} deps.models
* @param {Object} deps.models.MemberCreatedEvent
* @param {Object} deps.models.SubscriptionCreatedEvent
*/
constructor({DomainEvents, labsService, models}) {
this.models = models;
this.DomainEvents = DomainEvents;
this.labsService = labsService;
}
@ -18,7 +26,7 @@ class MemberAttributionEventHandler {
attribution = {};
}
await this._MemberCreatedEventModel.add({
await this.models.MemberCreatedEvent.add({
member_id: event.data.memberId,
created_at: event.timestamp,
attribution_id: attribution?.id ?? null,
@ -37,7 +45,7 @@ class MemberAttributionEventHandler {
attribution = {};
}
await this._SubscriptionCreatedEvent.add({
await this.models.SubscriptionCreatedEvent.add({
member_id: event.data.memberId,
subscription_id: event.data.subscriptionId,
created_at: event.timestamp,

View file

@ -1,24 +1,18 @@
const MemberAttributionEventHandler = require('./event-handler');
const DomainEvents = require('@tryghost/domain-events');
const UrlTranslator = require('./url-translator');
const AttributionBuilder = require('./attribution');
const UrlHistory = require('./history');
class MemberAttributionService {
constructor({Post, User, Tag, MemberCreatedEvent, SubscriptionCreatedEvent, urlService, labsService}) {
const eventHandler = new MemberAttributionEventHandler({MemberCreatedEvent, SubscriptionCreatedEvent, DomainEvents, labsService});
eventHandler.subscribe();
this.urlService = urlService;
this.models = {MemberCreatedEvent, SubscriptionCreatedEvent};
const urlTranslator = new UrlTranslator({
urlService,
models: {
Post, User, Tag
}
});
this.attributionBuilder = new AttributionBuilder({urlTranslator});
/**
*
* @param {Object} deps
* @param {Object} deps.attributionBuilder
* @param {Object} deps.labsService
* @param {Object} deps.models
* @param {Object} deps.models.MemberCreatedEvent
* @param {Object} deps.models.SubscriptionCreatedEvent
*/
constructor({attributionBuilder, models}) {
this.models = models;
this.attributionBuilder = attributionBuilder;
}
/**

View file

@ -1,6 +1,6 @@
/**
* @typedef {Object} UrlService
* @prop {(resourceId: string) => Object} getResource
* @prop {(resourceId: string, options) => Object} getResource
* @prop {(resourceId: string, options) => string} getUrlByResourceId
*
*/

View file

@ -29,7 +29,7 @@ describe('MemberAttributionEventHandler', function () {
const subscribeSpy = sinon.spy(DomainEvents, 'subscribe');
const eventHandler = new MemberAttributionEventHandler({
DomainEvents,
MemberCreatedEvent: MemberCreatedEventModel,
models: {MemberCreatedEvent: MemberCreatedEventModel},
labsService
});
eventHandler.subscribe();
@ -63,7 +63,7 @@ describe('MemberAttributionEventHandler', function () {
const subscribeSpy = sinon.spy(DomainEvents, 'subscribe');
const eventHandler = new MemberAttributionEventHandler({
DomainEvents,
MemberCreatedEvent: MemberCreatedEventModel,
models: {MemberCreatedEvent: MemberCreatedEventModel},
labsService
});
eventHandler.subscribe();
@ -100,7 +100,7 @@ describe('MemberAttributionEventHandler', function () {
const subscribeSpy = sinon.spy(DomainEvents, 'subscribe');
const eventHandler = new MemberAttributionEventHandler({
DomainEvents,
MemberCreatedEvent: MemberCreatedEventModel,
models: {MemberCreatedEvent: MemberCreatedEventModel},
labsService
});
eventHandler.subscribe();
@ -134,7 +134,7 @@ describe('MemberAttributionEventHandler', function () {
const subscribeSpy = sinon.spy(DomainEvents, 'subscribe');
const eventHandler = new MemberAttributionEventHandler({
DomainEvents,
SubscriptionCreatedEvent: SubscriptionCreatedEventModel,
models: {SubscriptionCreatedEvent: SubscriptionCreatedEventModel},
labsService
});
eventHandler.subscribe();
@ -168,7 +168,7 @@ describe('MemberAttributionEventHandler', function () {
const subscribeSpy = sinon.spy(DomainEvents, 'subscribe');
const eventHandler = new MemberAttributionEventHandler({
DomainEvents,
SubscriptionCreatedEvent: SubscriptionCreatedEventModel,
models: {SubscriptionCreatedEvent: SubscriptionCreatedEventModel},
labsService
});
eventHandler.subscribe();
@ -205,7 +205,7 @@ describe('MemberAttributionEventHandler', function () {
const subscribeSpy = sinon.spy(DomainEvents, 'subscribe');
const eventHandler = new MemberAttributionEventHandler({
DomainEvents,
SubscriptionCreatedEvent: SubscriptionCreatedEventModel,
models: {SubscriptionCreatedEvent: SubscriptionCreatedEventModel},
labsService
});
eventHandler.subscribe();