Ghost/ghost/offers/index.js
Fabien O'Carroll ff2da8a417 Added and emitted events for Offer Created
refs https://github.com/TryGhost/Team/issues/1166

Since we removed the creation of coupons from the Offers module, we must
emit events so that the Payments module can handle creating Coupons when
Offers are created.

We also export the events from the module so that they can be listened
to by the Payments module.

We also export other internals of the module so that the types can be
used.
2021-10-21 15:40:55 +02:00

78 lines
2.4 KiB
JavaScript

const DomainEvents = require('@tryghost/domain-events');
const OfferCodeChangeEvent = require('./lib/domain/events/OfferCodeChange');
const OfferCreatedEvent = require('./lib/domain/events/OfferCreated');
const OfferRepository = require('./lib/application/OfferRepository');
const OffersAPI = require('./lib/application/OffersAPI');
class OffersModule {
/**
* @param {OffersAPI} offersAPI
* @param {import('@tryghost/express-dynamic-redirects')} redirectManager
* @param {OfferRepository} 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.OfferModel
* @param {any} deps.OfferRedemptionModel
*
* @returns {OffersModule}
*/
static create(deps) {
const repository = new OfferRepository(deps.OfferModel, deps.OfferRedemptionModel);
const offersAPI = new OffersAPI(repository);
return new OffersModule(offersAPI, deps.redirectManager, repository);
}
static events = {
OfferCreatedEvent,
OfferCodeChangeEvent
};
static OfferRepository = OfferRepository;
static OffersAPI = OffersAPI;
}
module.exports = OffersModule;