calamarcopollo
Version:
Save the chicken foundation
360 lines (330 loc) • 14 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.tripDialogReply = undefined;
var _moment = require('moment');
var _moment2 = _interopRequireDefault(_moment);
var _replies = require('../replies');
var _latinize = require('latinize');
var _latinize2 = _interopRequireDefault(_latinize);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const CLICKBUS_URL = process.env.CLICKBUS_URL;
const CLICKBUS_SVG_LOGO_URL = process.env.CLICKBUS_SVG_LOGO_URL || 'https://m.clickbus.com.br/app/public/img/buslines/br/';
const MORE_RESULTS_IMAGE_URL = process.env.MORE_RESULTS_IMAGE_URL;
const buildFacebookElements = (origin, destination, session, searchUrl, trips) => {
if (!trips || !trips.length) {
console.log('buildFacebookElements', trips);
return [];
}
console.log('buildFacebookElements', trips.length);
const result = trips.map(trip => {
const {
price,
arrivalTime,
arrivalPlace,
departurePlace,
departureTime,
busCompanyName,
// busCompanyLogo,
busType,
availableSeats,
duration,
scheduleId
} = trip;
const busCompanyLogoName = (0, _latinize2.default)(busCompanyName).replace(/ |%20/ig, '-').toLowerCase();
const busCompanyLogo = `${ CLICKBUS_SVG_LOGO_URL }${ busCompanyLogoName }.svg`;
const departure = {
time: (0, _moment2.default)(departureTime).format('DD/MM HH:mm'),
name: departurePlace
};
const arrival = {
time: (0, _moment2.default)(arrivalTime).format('DD/MM HH:mm'),
name: arrivalPlace
};
const company = busCompanyName;
const seats = availableSeats;
const formattedPrice = `R$${ price.slice(0, -2) },${ price.slice(-2) }`;
const title = _replies.replies.trip.listTitle(company, departureTime, availableSeats, duration, formattedPrice, busType);
const subtitle = _replies.replies.trip.listItemFb(company, departure, arrival, seats, duration, true);
const baseURL = `${ process.env.BOT_URL }${ process.env.POST_TO_CLICKBUS_HACK_PATH }`;
const decodedScheduleTrip = new Buffer(scheduleId, 'base64').toString('utf8');
const trips0 = decodedScheduleTrip.split('--').map((item, index) => {
if ([2, 4, 8, 9].includes(index)) {
return `"${ item }"`;
}
if (index === 7) {
return item === '1';
}
return parseInt(item, 10);
}).toString();
const postBody = {
originSlug: origin,
destinationSlug: destination,
trips0,
store: process.env.CLICKBUS_STORE,
platform: process.env.CLICKBUS_PLATFORM
};
const postURL = process.env.CLICKBUS_WEB_POST_URL;
const failUrl = searchUrl;
const url = `${ baseURL }?body=${ JSON.stringify(postBody) }&url=${ postURL }&session=${ session }&failUrl=${ failUrl }`;
return {
title,
image_url: busCompanyLogo,
buttons: [{
type: 'web_url',
url,
title: _replies.replies.trip.detail()
}],
subtitle
};
});
return result.slice(0, 9).concat(buildLastFacebookElement(searchUrl));
};
const buildLastFacebookElement = url => ({
title: _replies.replies.trip.moreResultsTitle(),
image_url: MORE_RESULTS_IMAGE_URL,
buttons: [{
type: 'web_url',
url,
title: _replies.replies.trip.moreResultsButton()
}]
});
const busTypeValueIds = {
convencional: [1],
'semi-leito': [2, 3],
leito: [4, 5, 6, 7, 8, 9]
};
const sortTripByDepartureTime = (tripA, tripB) => tripA.departureTime.isBefore(tripB.departureTime) ? -1 : 1;
const sortTripsByPriceAscending = (tripA, tripB) => {
const priceA = parseInt(tripA.price, 10);
const priceB = parseInt(tripB.price, 10);
if (priceA < priceB) {
return -1;
}
if (priceA > priceB) {
return 1;
}
return sortTripByDepartureTime(tripA, tripB);
};
const sortTripsByPriceDescending = (tripA, tripB) => {
const priceA = parseInt(tripA.price, 10);
const priceB = parseInt(tripB.price, 10);
if (priceA > priceB) {
return -1;
}
if (priceA < priceB) {
return 1;
}
return sortTripByDepartureTime(tripA, tripB);
};
const getExpandedResults = (sortedTrips, filteredTripsAfter, filteredTripsBetween, filteredTripsByBusType) => {
let excludedFilters = [];
if (filteredTripsByBusType) {
if (filteredTripsByBusType.length > 0) {
const result = {
excludedFilters,
results: filteredTripsByBusType
};
return result;
}
excludedFilters.push('busTypeFilters');
}
if (filteredTripsBetween) {
if (filteredTripsBetween.length > 0) {
const result = {
excludedFilters,
results: filteredTripsBetween
};
return result;
}
excludedFilters.push('timeFilterTo');
}
if (filteredTripsAfter) {
if (filteredTripsAfter.length > 0) {
return {
excludedFilters,
results: filteredTripsAfter
};
}
excludedFilters.push('timeFilterFrom');
}
return {
excludedFilters,
results: sortedTrips
};
};
const filterByBusType = (trips, busTypeFilters) => {
const hasBustypeFilters = busTypeFilters && busTypeFilters.length;
return hasBustypeFilters ? trips.filter(trip => {
const busTypeId = parseInt(trip.busTypeId, 10);
// array flatten in js http://stackoverflow.com/a/10865042/2052311
const busTypeIds = [].concat.apply([], busTypeFilters.map(busTypeEntity => busTypeValueIds[busTypeEntity.value]));
const result = busTypeIds.indexOf(busTypeId) !== -1;
return result;
}) : trips;
};
const tripDialogReply = context => {
const {
origin,
originMeta,
destination,
destinationMeta,
timeFilter,
priceFilter,
busTypeFilters,
apiError,
trips,
shortUrl,
sessionCookie
} = context;
// console.log('tripDialogReply context', context);
const hasOrigin = origin !== undefined;
const hasDestination = destination !== undefined;
const hasApiError = apiError !== undefined;
const hasTrips = trips !== undefined;
const hasNoTrips = hasTrips && !trips.length;
const hasBustypeFilters = busTypeFilters && busTypeFilters.length;
const hasPriceFilter = priceFilter !== undefined;
if (hasApiError) {
// console.log('hasApiError, return', apiError);
return _replies.replies.trip.apiError(apiError);
}
if (!hasOrigin && !hasDestination) {
// console.log('no places, return');
return _replies.replies.trip.noPlaces();
}
if (hasOrigin && !originMeta) {
// console.log('no slug (origin), return', origin);
return _replies.replies.trip.noSlug(origin);
}
if (hasDestination && !destinationMeta) {
// console.log('no slug (destination), return', destination);
return _replies.replies.trip.noSlug(destination);
}
if (hasOrigin && !hasDestination) {
// console.log('no destination, return');
return _replies.replies.trip.noDestination();
}
if (hasDestination && !hasOrigin) {
// console.log('no origin, return');
return _replies.replies.trip.noOrigin();
}
const day = timeFilter && timeFilter.from ? (0, _moment2.default)(timeFilter.from.value) : (0, _moment2.default)();
const departureDay = day.format('YYYY-MM-DD');
if (hasDestination && hasOrigin && !hasTrips) {
const from = originMeta.slugs[0];
const to = destinationMeta.slugs[0];
const url = `${ CLICKBUS_URL }/trips?from=${ from }&to=${ to }&departure=${ departureDay }`;
// console.log('need to make api call, return', url);
return {
url,
departureDay
};
}
if (!originMeta || !destinationMeta) {
// console.log('missing metadata', origin, destination);
return _replies.replies.trip.noTrips(origin, destination);
}
if (hasDestination && hasOrigin && hasTrips && hasNoTrips) {
// console.log('has metadata but api returned 0 results', shortUrl);
return _replies.replies.trip.noTripsWithUrl(origin, destination, shortUrl);
}
// console.log('build hasBustypeFilters array');
const btfValues = hasBustypeFilters ? busTypeFilters.reduce((prev, curr) => prev.indexOf(curr.value) === -1 ? prev.concat(curr.value) : prev, []) : null;
// console.log('filteredTripsByBusType.length', filteredTripsByBusType.length, trips.length);
const sortByPrice = hasPriceFilter && priceFilter.value !== 'maiorPreco' ? sortTripsByPriceAscending : sortTripsByPriceDescending;
const sortedTrips = hasPriceFilter ? trips.sort(sortByPrice) : trips;
if (hasDestination && hasOrigin && hasTrips && timeFilter) {
const hasIntervalFrom = timeFilter.from && timeFilter.from.value && timeFilter.from.grain !== 'day';
const hasIntervalTo = timeFilter.to && timeFilter.to.value && timeFilter.to.grain !== 'day';
if (hasIntervalFrom) {
// Filter trips after a day time
const filteredTripsAfter = sortedTrips.filter(trip => trip.departureTime.isSameOrAfter(timeFilter.from.value));
if (hasIntervalTo) {
// Filter trips after a day time and before another time
const filteredTripsBetween = filteredTripsAfter.filter(trip => trip.departureTime.isSameOrBefore(timeFilter.to.value));
const {
results,
excludedFilters
} = getExpandedResults(sortedTrips, filteredTripsAfter, filteredTripsBetween, filterByBusType(filteredTripsBetween, busTypeFilters));
console.log('excludedFilters', excludedFilters);
const structuredRely = buildFacebookElements(originMeta.slugs[0], destinationMeta.slugs[0], sessionCookie, shortUrl, results);
const textReply = _replies.replies.trip.filteredDepartureList(origin, destination, results, shortUrl, {
day,
timeFilterFrom: (0, _moment2.default)(timeFilter.from.value),
timeFilterTo: (0, _moment2.default)(timeFilter.to.value),
busTypeFilters: btfValues,
priceFilter,
excludedFilters
});
return {
textReply,
structuredRely
};
}
console.log('!hasIntervalTo . . . . .');
const {
results,
excludedFilters
} = getExpandedResults(sortedTrips, filteredTripsAfter, null, filterByBusType(filteredTripsAfter, busTypeFilters));
console.log('excludedFilters', excludedFilters, filterByBusType(filteredTripsAfter, busTypeFilters).length);
const structuredRely = buildFacebookElements(originMeta.slugs[0], destinationMeta.slugs[0], sessionCookie, shortUrl, results);
const textReply = _replies.replies.trip.filteredDepartureList(origin, destination, results, shortUrl, {
day,
timeFilterFrom: (0, _moment2.default)(timeFilter.from.value),
timeFilterTo: null,
busTypeFilters: btfValues,
priceFilter,
excludedFilters
});
return {
textReply,
structuredRely
};
}
if (!hasIntervalFrom && hasIntervalTo) {
// Filter trips before a day time
const filteredTripsBefore = sortedTrips.filter(trip => trip.departureTime.isSameOrBefore(timeFilter.to.value));
console.log('---filteredTripsBefore', filteredTripsBefore.length, sortedTrips.length);
const {
results,
excludedFilters
} = getExpandedResults(sortedTrips, sortedTrips, filteredTripsBefore, filterByBusType(filteredTripsBefore, busTypeFilters));
console.log('excludedFilters', excludedFilters);
const structuredRely = buildFacebookElements(originMeta.slugs[0], destinationMeta.slugs[0], sessionCookie, shortUrl, results);
const textReply = _replies.replies.trip.filteredDepartureList(origin, destination, results, shortUrl, {
day,
timeFilterFrom: (0, _moment2.default)(timeFilter.from.value),
timeFilterTo: null,
busTypeFilters: btfValues,
priceFilter,
excludedFilters
});
return {
textReply,
structuredRely
};
}
}
const {
results,
excludedFilters
} = getExpandedResults(sortedTrips, null, null, filterByBusType(sortedTrips, busTypeFilters));
console.log('excludedFilters', excludedFilters);
const structuredRely = buildFacebookElements(originMeta.slugs[0], destinationMeta.slugs[0], sessionCookie, shortUrl, results);
// console.log('structuredRely', JSON.stringify(structuredRely));
const textReply = _replies.replies.trip.filteredDepartureList(origin, destination, results, shortUrl, {
day,
timeFilterFrom: null,
timeFilterTo: null,
busTypeFilters: btfValues,
priceFilter,
excludedFilters
});
return {
textReply,
structuredRely
};
};
exports.tripDialogReply = tripDialogReply;