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.
This commit is contained in:
Fabien O'Carroll 2021-10-21 14:22:27 +02:00 committed by Fabien 'egg' O'Carroll
parent efe5164eff
commit ff2da8a417
3 changed files with 49 additions and 1 deletions

View File

@ -1,5 +1,6 @@
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');
@ -30,6 +31,14 @@ class OffersModule {
);
});
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) {
@ -54,6 +63,15 @@ class OffersModule {
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;

View File

@ -2,6 +2,7 @@ const {flowRight} = require('lodash');
const {mapKeyValues, mapQuery} = require('@nexes/mongo-utils');
const DomainEvents = require('@tryghost/domain-events');
const OfferCodeChangeEvent = require('../domain/events/OfferCodeChange');
const OfferCreatedEvent = require('../domain/events/OfferCreated');
const Offer = require('../domain/models/Offer');
const OfferStatus = require('../domain/models/OfferStatus');
@ -179,7 +180,7 @@ class OfferRepository {
active: offer.status.equals(OfferStatus.create('active'))
};
if (offer.codeChanged || offer.isNew) {
if (offer.codeChanged) {
const event = OfferCodeChangeEvent.create({
offerId: offer.id,
previousCode: offer.oldCode,
@ -189,7 +190,9 @@ class OfferRepository {
}
if (offer.isNew) {
const event = OfferCreatedEvent.create({offer});
await this.OfferModel.add(data, options);
DomainEvents.dispatch(event);
} else {
await this.OfferModel.edit(data, {...options, id: data.id});
}

View File

@ -0,0 +1,27 @@
/** @typedef {import('../models/Offer')} Offer */
/**
* @typedef {object} OfferCreatedEventData
* @prop {Offer} offer
*/
class OfferCreatedEvent {
/**
* @param {OfferCreatedEventData} data
* @param {Date} timestamp
*/
constructor(data, timestamp) {
this.data = data;
this.timestamp = timestamp;
}
/**
* @param {OfferCreatedEventData} data
* @param {Date} [timestamp]
*/
static create(data, timestamp) {
return new OfferCreatedEvent(data, timestamp || new Date);
}
}
module.exports = OfferCreatedEvent;