Home Manual Reference Source Repository

src/plugins/easycurrency/resolvers/GeoserviceResolver.js

import CurrencyResolver from './CurrencyResolver';
import GeoService from '~/plugins/geoservice/GeoService';

import * as currencies from 'js-money/lib/currency.js';

/**
 * Gets currency information from the ESC Geoservice.
 * @private
 */
export default class GeoserviceResolver extends CurrencyResolver {
    /**
     * Create new instance of GeoserviceResolver.
     */
    constructor() {
        super();

        /** @type {Object} */
        this._rates = null;
        /** @type {Boolean} */
        this._requested = false;
        /** @type {Promise<Object, Error} */
        this._ratesPromise = null;

        this._geoService = new GeoService;
    }


    /**
     * Retrieves rates from the server.
     * Rates are cached in memory.
     * @return {Promise<Object, Error>}
     */
    async _getRates() {
        if (this._rates) {
            return this._rates;
        }

        if (!this._ratesPromise) {
            this._ratesPromise = (async () => {
                var rates = await this._geoService.getCurrencyInfo();
                this._rates = rates;
                return rates;
            })();
        }
        return await this._ratesPromise;
    }

    /**
     * List the available currencies.
     * @return {String[]}
     * @throws {Error} - CurrencyResolver should implement listCurrencyCodes
     */
    async listCurrencyCodes() {
        return Object.keys(currencies);
    }

    /**
     * Get conversion rate for a specific currency pair.
     * @param {String}	from
     * @param {String}	to
     * @return {Number}
     * @throws {Error} - CurrencyResolver should implement getConversionRate
     */
    async getConversionRate(from, to) {
        var info = await this._getRates();

        var baseToFrom = from == info.base ? 1 : info.rates[from];
        var fromToBase = 1 / baseToFrom;
        var baseToTo = to == info.base ? 1 : info.rates[to];

        var combinedRate = fromToBase * baseToTo;
        return combinedRate;
    }
}