import JourneyGroupAdapterInterface from './JourneyGroupAdapterInterface'; import JourneyGroup from '../entity/JourneyGroup'; import Journey from '../../Journey/entity/Journey'; import ConcessionAdapterInterface from '../../Concession/adapter/ConcessionAdapterInterface'; import JourneyAdapterInterface from '../../Journey/adapter/JourneyAdapterInterface'; import JourneyGroupType from '../enums/JourneyGroupTypes'; export default class JourneyGroupAdapter implements JourneyGroupAdapterInterface { journeyAdapter: JourneyAdapterInterface; concessionAdapter: ConcessionAdapterInterface; constructor(journeyAdapter: JourneyAdapterInterface, concessionAdapter: ConcessionAdapterInterface) { this.journeyAdapter = journeyAdapter; this.concessionAdapter = concessionAdapter; } adapt(json: any, instance: JourneyGroup): JourneyGroup { instance.id = json.journey_group_id || json.id; // TODO: This should be ID. instance.name = json.name; instance.journeys = (json.journeys || []).map(each => this.journeyAdapter.transformToEntity(each)); instance.concessions = (json.concessions || []).map(each => this.concessionAdapter.transformToEntity(each)); instance.type = (json.journeys || []).length === 2 ? JourneyGroupType.RETURN : JourneyGroupType.ONE_WAY; instance.has_concessions_edited = json.concessions_overridden; return instance; } prepare(instance: JourneyGroup): object { let filteredEnabledJourneys = instance.journeys.filter(each => each.enabled); let object = { id: instance.id, journey_group_id: instance.id, // TODO: Ask BE to remove this. name: instance.name, for_sale_only_return: instance.settings.allow_return_only, for_sale_only_outbound: instance.settings.allow_outbound_only, for_sale_return_and_outbound: instance.settings.allow_return, journeys: filteredEnabledJourneys.map((each: Journey, index) => { let instancePrepared = this.journeyAdapter.prepare(each); if (filteredEnabledJourneys.length === 2) { if (index === 0) { instancePrepared.is_outbound_of = filteredEnabledJourneys[1].id; instancePrepared.is_return_of = filteredEnabledJourneys[0].id; } else { instancePrepared.is_outbound_of = filteredEnabledJourneys[0].id; instancePrepared.is_return_of = filteredEnabledJourneys[1].id; } } // Needed. instancePrepared.type = each.type; return instancePrepared; }), concessions: instance.concessions ? instance.concessions.map(each => this.concessionAdapter.prepare(each)) : void 0, sales_options: { outbound_only: instance.settings.allow_outbound_only, return_only: instance.settings.allow_return_only, return_and_outbound: instance.settings.allow_return, } }; return object; } transformToEntity(json: any): JourneyGroup { return this.adapt(json, new JourneyGroup()); } transformToPayload(instance: JourneyGroup): any { return this.prepare(instance); } transformGetByTravelProductId(json: any): JourneyGroup { let instance = new JourneyGroup(); instance.id = json.id; instance.name = json.name; instance.journeys = json.journeys; instance.type = (json.journeys || []).length === 2 ? JourneyGroupType.RETURN : JourneyGroupType.ONE_WAY; return instance; } }