import TravelStop from '../entity/TravelStop'; import TravelStopTypes from '../enums/TravelStopType'; import TravelStopAdapterInterface from './TravelStopAdapterInterface'; import StopAdapterInterface from '../../Stop/adapter/StopAdapterInterface'; import TravelStopPricingAdapterInterface from '../../TravelStopPricing/adapter/TravelStopPricingAdapterInterface'; import TravelStopPricing from '../../TravelStopPricing/entity/TravelStopPricing'; import StopIsNotEitherPickupOrDropoffException from '../../common/exceptions/StopIsNotEitherPickupOrDropoffException'; export default class TravelStopAdapter implements TravelStopAdapterInterface { protected stopAdapter: StopAdapterInterface; protected travelStopPricingAdapter: TravelStopPricingAdapterInterface; constructor(stopAdapter: StopAdapterInterface, travelStopPricingAdapter: TravelStopPricingAdapterInterface) { this.stopAdapter = stopAdapter; this.travelStopPricingAdapter = travelStopPricingAdapter; } adapt(json: any, instance: TravelStop): TravelStop { instance.id = json.id; instance.stop = this.stopAdapter.transformToEntity(json.location); instance.stop_order = json.stop_order; instance.distance = +json.meters_distance; instance.time_to_reach = +json.minutes_distance; instance.type = this.getTypeFromIsPickupIsDropoff(json); return instance; } prepare(instance: TravelStop): object { let stopStypeConfiguration = this.getIsPickupIsDropoffConfigJson(instance); return { id: instance.id, ...stopStypeConfiguration, location_id: instance.stop.id, prices: instance.pricings.map((eachPricing: TravelStopPricing) => this.travelStopPricingAdapter.prepare(eachPricing)), minutes_distance: +instance.time_to_reach || 0, meters_distance: +instance.distance || 0, }; } private getTypeFromIsPickupIsDropoff(json: any): TravelStopTypes { if (json.is_pickup && json.is_dropoff) { return TravelStopTypes.TYPE_BOTH; } else if (json.is_pickup && !json.is_dropoff) { return TravelStopTypes.TYPE_PICKUP; } else if (!json.is_pickup && json.is_dropoff) { return TravelStopTypes.TYPE_DROPOFF; } throw new StopIsNotEitherPickupOrDropoffException(); } private getIsPickupIsDropoffConfigJson(instance: TravelStop): object { if (instance.type === TravelStopTypes.TYPE_BOTH) { return { is_pickup: true, is_dropoff: true }; } else if (instance.type === TravelStopTypes.TYPE_PICKUP) { return { is_pickup: true, is_dropoff: false }; } else if (instance.type === TravelStopTypes.TYPE_DROPOFF) { return { is_pickup: false, is_dropoff: true }; } throw new StopIsNotEitherPickupOrDropoffException(); } }