TryGhost/Ghost

View on GitHub
ghost/offers/lib/application/OfferMapper.js

Summary

Maintainability
A
0 mins
Test Coverage
/**
 * @typedef {import('../domain/models/Offer')} Offer
 */

/**
 * @typedef {object} OfferDTO
 * @prop {string} id
 * @prop {string} name
 * @prop {string} code
 *
 * @prop {string} display_title
 * @prop {string} display_description
 *
 * @prop {'percent'|'fixed'|'trial'} type
 *
 * @prop {'month'|'year'} cadence
 * @prop {number} amount
 *
 * @prop {boolean} currency_restriction
 * @prop {string} currency
 *
 * @prop {'once'|'repeating'|'forever'|'trial'} duration
 * @prop {null|number} duration_in_months
 *
 * @prop {'active'|'archived'} status
 * @prop {number} redemption_count
 *
 * @prop {object} tier
 * @prop {string} tier.id
 * @prop {string} tier.name
 * @prop {string} created_at
 * @prop {string|null} last_redeemed
 */

class OfferMapper {
    /**
     * @param {Offer} offer
     * @returns {OfferDTO}
     */
    static toDTO(offer) {
        return {
            id: offer.id,
            name: offer.name.value,
            code: offer.code.value,
            display_title: offer.displayTitle.value,
            display_description: offer.displayDescription.value,
            type: offer.type.value,
            cadence: offer.cadence.value,
            amount: offer.amount.value,
            duration: offer.duration.value.type,
            duration_in_months: offer.duration.value.type === 'repeating' ? offer.duration.value.months : null,
            currency_restriction: offer.type.value === 'fixed',
            currency: offer.type.value === 'fixed' ? offer.currency.value : null,
            status: offer.status.value,
            redemption_count: offer.redemptionCount,
            tier: {
                id: offer.tier.id,
                name: offer.tier.name
            },
            created_at: offer.createdAt,
            last_redeemed: offer.lastRedeemed
        };
    }
}

module.exports = OfferMapper;