diff --git a/ghost/offers/index.js b/ghost/offers/index.js index 392d599306..9676fba259 100644 --- a/ghost/offers/index.js +++ b/ghost/offers/index.js @@ -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; diff --git a/ghost/offers/lib/application/OfferRepository.js b/ghost/offers/lib/application/OfferRepository.js index 09df0972ed..4c782dcc0c 100644 --- a/ghost/offers/lib/application/OfferRepository.js +++ b/ghost/offers/lib/application/OfferRepository.js @@ -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}); } diff --git a/ghost/offers/lib/domain/events/OfferCreated.js b/ghost/offers/lib/domain/events/OfferCreated.js new file mode 100644 index 0000000000..c07437f24d --- /dev/null +++ b/ghost/offers/lib/domain/events/OfferCreated.js @@ -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;