diff --git a/ghost/offers/lib/application/OfferRepository.js b/ghost/offers/lib/application/OfferRepository.js index f27f4e5e68..1a79985323 100644 --- a/ghost/offers/lib/application/OfferRepository.js +++ b/ghost/offers/lib/application/OfferRepository.js @@ -1,8 +1,6 @@ const {flowRight} = require('lodash'); const {mapKeyValues, mapQuery} = require('@tryghost/mongo-utils'); 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 OfferStatus = require('../domain/models/OfferStatus'); @@ -202,19 +200,13 @@ class OfferRepository { active: offer.status.equals(OfferStatus.create('active')) }; - if (offer.codeChanged) { - const event = OfferCodeChangeEvent.create({ - offerId: offer.id, - previousCode: offer.oldCode, - currentCode: offer.code - }); - DomainEvents.dispatch(event); - } - if (offer.isNew) { await this.OfferModel.add(data, options); - const event = OfferCreatedEvent.create({offer}); + } else { + await this.OfferModel.edit(data, {...options, id: data.id}); + } + for (const event of offer.events) { if (options.transacting) { // Only dispatch the event after the transaction has finished // Because else the offer won't be committed to the database yet @@ -224,8 +216,6 @@ class OfferRepository { } else { DomainEvents.dispatch(event); } - } else { - await this.OfferModel.edit(data, {...options, id: data.id}); } } } diff --git a/ghost/offers/lib/domain/models/Offer.js b/ghost/offers/lib/domain/models/Offer.js index ebef1d0c9c..879f6c4046 100644 --- a/ghost/offers/lib/domain/models/Offer.js +++ b/ghost/offers/lib/domain/models/Offer.js @@ -11,6 +11,8 @@ const OfferType = require('./OfferType'); const OfferDuration = require('./OfferDuration'); const OfferCurrency = require('./OfferCurrency'); const OfferStatus = require('./OfferStatus'); +const OfferCreatedEvent = require('../events/OfferCreatedEvent'); +const OfferCodeChangeEvent = require('../events/OfferCodeChangeEvent'); /** * @typedef {object} OfferProps @@ -100,6 +102,7 @@ class OfferTier { } class Offer { + events = []; get id() { return this.props.id.toHexString(); } @@ -195,6 +198,13 @@ class Offer { message: `Offer 'code' must be unique. Please change and try again.` }); } + + this.events.push(OfferCodeChangeEvent.create({ + offerId: this.id, + previousCode: this.props.code, + currentCode: code + })); + this.changed.code = this.props.code; this.props.code = code; } @@ -232,6 +242,11 @@ class Offer { /** @type OfferCode */ code: null }; + if (options.isNew) { + this.events.push(OfferCreatedEvent.create({ + offer: this + })); + } } /**