504fb1bfa1
no-issue This adds the concept of "Value Objects" to an Offers properties, allowing us to move validation out and ensure that an Offer will only ever have valid properties, without having to duplicate checks - or leave them to the persistent layer. This means we can fail early, as well as write unit tests for all of our validation.
50 lines
1.7 KiB
JavaScript
50 lines
1.7 KiB
JavaScript
const ValueObject = require('../../shared/ValueObject');
|
|
const InvalidOfferAmount = require('../../errors').InvalidOfferAmount;
|
|
|
|
/** @extends ValueObject<number> */
|
|
class OfferAmount extends ValueObject {}
|
|
|
|
class OfferPercentageAmount extends OfferAmount {
|
|
/** @param {unknown} amount */
|
|
static create(amount) {
|
|
if (typeof amount !== 'number') {
|
|
throw new InvalidOfferAmount({
|
|
message: 'Offer `amount` must be an integer between 0 and 100.'
|
|
});
|
|
}
|
|
if (!Number.isInteger(amount)) {
|
|
throw new InvalidOfferAmount({
|
|
message: 'Offer `amount` must be an integer between 0 and 100.'
|
|
});
|
|
}
|
|
if (amount < 0 || amount > 100) {
|
|
throw new InvalidOfferAmount({
|
|
message: 'Offer `amount` must be an integer between 0 and 100.'
|
|
});
|
|
}
|
|
return new OfferPercentageAmount(amount);
|
|
}
|
|
}
|
|
|
|
class OfferAbsoluteAmount extends OfferAmount {
|
|
/** @param {unknown} amount */
|
|
static create(amount) {
|
|
if (typeof amount !== 'number') {
|
|
throw new InvalidOfferAmount({
|
|
message: 'Offer `amount` must be a number greater than 0.'
|
|
});
|
|
}
|
|
if (amount < 0) {
|
|
throw new InvalidOfferAmount({
|
|
message: 'Offer `amount` must be a number greater than 0.'
|
|
});
|
|
}
|
|
const withTwoDecimalPlaces = +amount.toFixed(2);
|
|
return new OfferPercentageAmount(withTwoDecimalPlaces);
|
|
}
|
|
}
|
|
|
|
module.exports = OfferAmount;
|
|
module.exports.OfferPercentageAmount = OfferPercentageAmount;
|
|
module.exports.OfferAbsoluteAmount = OfferAbsoluteAmount;
|