Ghost/ghost/offers/lib/OffersModule.js

79 lines
2.3 KiB
JavaScript
Raw Normal View History

/* eslint-disable max-lines */
// @TODO: Reduce file length and remove the line above
const DomainEvents = require('@tryghost/domain-events');
const OfferCodeChangeEvent = require('./domain/events/OfferCodeChangeEvent');
const OfferCreatedEvent = require('./domain/events/OfferCreatedEvent');
const Offer = require('./domain/models/Offer');
const OffersAPI = require('./application/OffersAPI');
class OffersModule {
/**
* @param {OffersAPI} offersAPI
* @param {import('@tryghost/express-dynamic-redirects')} redirectManager
* @param {any} repository
*/
constructor(offersAPI, redirectManager, repository) {
this.api = offersAPI;
this.repository = repository;
this.redirectManager = redirectManager;
}
/**
* @returns {Promise<void>}
*/
async init() {
DomainEvents.subscribe(OfferCodeChangeEvent, (event) => {
if (event.data.previousCode) {
this.redirectManager.removeRedirect(`/${event.data.previousCode.value}`);
}
this.redirectManager.addRedirect(
`/${event.data.currentCode.value}`,
`/#/portal/offers/${event.data.offerId}`,
{permanent: false}
);
});
DomainEvents.subscribe(OfferCreatedEvent, (event) => {
this.redirectManager.addRedirect(
`/${event.data.offer.code.value}`,
`/#/portal/offers/${event.data.offer.id}`,
{permanent: false}
);
});
const offers = await this.repository.getAll();
for (const offer of offers) {
this.redirectManager.addRedirect(
`/${offer.code.value}`,
`/#/portal/offers/${offer.id}`,
{permanent: false}
);
}
}
/**
* @param {object} deps
* @param {import('@tryghost/express-dynamic-redirects')} deps.redirectManager
* @param {any} deps.repository
*
* @returns {OffersModule}
*/
static create(deps) {
const offersAPI = new OffersAPI(deps.repository);
return new OffersModule(offersAPI, deps.redirectManager, deps.repository);
}
static events = {
OfferCreatedEvent,
OfferCodeChangeEvent
};
static Offer = Offer;
static OffersAPI = OffersAPI;
}
module.exports = OffersModule;