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:
parent
0943daad72
commit
02168b41ce
7 changed files with 70 additions and 45 deletions
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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')
|
||||
};
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/**
|
||||
* @typedef {Object} UrlService
|
||||
* @prop {(resourceId: string) => Object} getResource
|
||||
* @prop {(resourceId: string, options) => Object} getResource
|
||||
* @prop {(resourceId: string, options) => string} getUrlByResourceId
|
||||
*
|
||||
*/
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue