diff --git a/ghost/offers/lib/domain/errors/index.js b/ghost/offers/lib/domain/errors/index.js index 918046a936..31fa970310 100644 --- a/ghost/offers/lib/domain/errors/index.js +++ b/ghost/offers/lib/domain/errors/index.js @@ -22,6 +22,7 @@ class InvalidOfferTierName extends InvalidPropError {} class InvalidOfferCadence extends InvalidPropError {} class InvalidOfferDuration extends InvalidPropError {} class InvalidOfferCoupon extends InvalidPropError {} +class InvalidOfferStatus extends InvalidPropError {} module.exports = { InvalidOfferName, @@ -34,5 +35,6 @@ module.exports = { InvalidOfferCadence, InvalidOfferDuration, InvalidOfferTierName, - InvalidOfferCoupon + InvalidOfferCoupon, + InvalidOfferStatus }; diff --git a/ghost/offers/lib/domain/models/Offer.js b/ghost/offers/lib/domain/models/Offer.js index c6f2e1b7c4..7c127f7fba 100644 --- a/ghost/offers/lib/domain/models/Offer.js +++ b/ghost/offers/lib/domain/models/Offer.js @@ -10,6 +10,7 @@ const OfferCadence = require('./OfferCadence'); const OfferType = require('./OfferType'); const OfferDuration = require('./OfferDuration'); const OfferCurrency = require('./OfferCurrency'); +const OfferStatus = require('./OfferStatus'); /** * @typedef {object} OfferProps @@ -24,6 +25,7 @@ const OfferCurrency = require('./OfferCurrency'); * @prop {OfferDuration} duration * @prop {OfferCurrency} [currency] * @prop {string} [stripe_coupon_id] + * @prop {OfferStatus} status * @prop {OfferTier} tier */ @@ -41,6 +43,7 @@ const OfferCurrency = require('./OfferCurrency'); * @prop {number} duration_in_months * @prop {string} currency * @prop {string} [stripe_coupon_id] + * @prop {string} status * @prop {TierProps|OfferTier} tier */ @@ -117,6 +120,14 @@ class Offer { return this.props.duration; } + get status() { + return this.props.status; + } + + set status(value) { + this.props.status = value; + } + get oldCode() { return this.changed.code; } @@ -248,6 +259,7 @@ class Offer { const type = OfferType.create(data.type); const cadence = OfferCadence.create(data.cadence); const duration = OfferDuration.create(data.duration, data.duration_in_months); + const status = OfferStatus.create(data.status); if (cadence.value === 'year' && duration.value.type === 'repeating') { throw new errors.InvalidOfferDuration({ @@ -306,7 +318,8 @@ class Offer { duration, currency, tier, - stripe_coupon_id: couponId + stripe_coupon_id: couponId, + status }, {isNew}); } } diff --git a/ghost/offers/lib/domain/models/OfferStatus.js b/ghost/offers/lib/domain/models/OfferStatus.js new file mode 100644 index 0000000000..5b63453ba3 --- /dev/null +++ b/ghost/offers/lib/domain/models/OfferStatus.js @@ -0,0 +1,23 @@ +const ValueObject = require('./shared/ValueObject'); +const InvalidOfferStatus = require('../errors').InvalidOfferStatus; + +/** @extends ValueObject<'active'|'archived'> */ +class OfferStatus extends ValueObject { + /** @param {unknown} status */ + static create(status) { + if (typeof status !== 'string') { + throw new InvalidOfferStatus({ + message: 'Offer `status` must be a string.' + }); + } + + if (status !== 'active' && status !== 'archived') { + throw new InvalidOfferStatus({ + message: 'Offer `status` must be either "active" or "archived".' + }); + } + return new OfferStatus(status); + } +} + +module.exports = OfferStatus;