UNPKG

@windingtree/wt-read-api

Version:

API to interact with the Winding Tree platform

138 lines (126 loc) 4.42 kB
const YAML = require('yamljs'); const path = require('path'); const _ = require('lodash'); const { mapAirlineFieldsFromQuery, mapHotelFieldsFromQuery, } = require('./property-mapping'); const swaggerDocument = YAML.load(path.resolve(__dirname, '../../docs/swagger.yaml')); const getListOfFieldsFromSwagger = (schema) => { try { if (swaggerDocument.components.schemas[schema].allOf) { let res = []; for (const subSchema of swaggerDocument.components.schemas[schema].allOf) { if (subSchema.$ref) { const normalizedName = subSchema.$ref.replace('#/components/schemas/', ''); const properties = getListOfFieldsFromSwagger(normalizedName); res = res.concat(properties); } else { res = res.concat(Object.keys(subSchema.properties)); } } return res; } return Object.keys(swaggerDocument.components.schemas[schema].properties); } catch (e) { console.log(`No schema properties found for ${schema}`); return []; } }; const HOTEL_DEFAULT_FIELDS_LIST = [ 'id', 'location', 'name', ]; const HOTEL_DEFAULT_FIELDS = HOTEL_DEFAULT_FIELDS_LIST.concat([ 'description', 'contacts', 'address', 'currency', 'images', 'amenities', 'updatedAt', ]); const HOTEL_ONCHAIN_FIELDS = ['owner', 'created']; const HOTEL_DESCRIPTION_FIELDS = getListOfFieldsFromSwagger('windingtree-wt-hotel-schemas-HotelDescriptionBase'); const HOTEL_DATAINDEX_FIELDS = getListOfFieldsFromSwagger('windingtree-wt-hotel-schemas-HotelDataIndex'); const AIRLINE_DEFAULT_FIELDS_LIST = [ 'id', 'name', 'code', 'defaultCancellationAmount', 'contacts', ]; const AIRLINE_DEFAULT_FIELDS = AIRLINE_DEFAULT_FIELDS_LIST.concat(['code', 'currency']); const AIRLINE_ONCHAIN_FIELDS = ['owner', 'created']; const AIRLINE_DESCRIPTION_FIELDS = getListOfFieldsFromSwagger('windingtree-wt-airline-schemas-AirlineDescriptionBase'); const AIRLINE_DATAINDEX_FIELDS = getListOfFieldsFromSwagger('windingtree-wt-airline-schemas-AirlineDataIndex'); const _calculateFields = (fields, mappingSpec, onChainFieldsSpec = [], descriptionFieldsSpec = [], dataIndexFieldsSpec = [], toDropSpec = []) => { const mappedFields = mappingSpec(fields); return { mapped: mappedFields, onChain: mappedFields.map((f) => onChainFieldsSpec.indexOf(f) > -1 ? f : null).filter((f) => !!f), toFlatten: mappedFields.map((f) => { let firstPart = f; if (f.indexOf('.') > -1) { firstPart = f.substring(0, f.indexOf('.')); } if (descriptionFieldsSpec.indexOf(firstPart) > -1) { return `descriptionUri.${f}`; } if (dataIndexFieldsSpec.indexOf(firstPart) > -1) { return f; } return null; }).filter((f) => !!f), toDrop: mappedFields.map((f) => toDropSpec.indexOf(f) > -1 ? f : null).filter((f) => !!f), }; }; const _airlineFields = (fields, defaults) => { fields = fields || defaults; const fieldsArray = Array.isArray(fields) ? fields : fields.split(','); const required = ['dataFormatVersion']; return _calculateFields( _.uniq(fieldsArray.concat(required)), mapAirlineFieldsFromQuery, AIRLINE_ONCHAIN_FIELDS, AIRLINE_DESCRIPTION_FIELDS, AIRLINE_DATAINDEX_FIELDS, required.map((f) => fields.indexOf(f) === -1 ? f : null) ); }; const _hotelFields = (fields, defaults) => { fields = fields || defaults; const fieldsArray = Array.isArray(fields) ? fields : fields.split(','); const required = ['dataFormatVersion', 'guarantee']; return _calculateFields( _.uniq(fieldsArray.concat(required)), mapHotelFieldsFromQuery, HOTEL_ONCHAIN_FIELDS, HOTEL_DESCRIPTION_FIELDS, HOTEL_DATAINDEX_FIELDS, required.map((f) => fields.indexOf(f) === -1 ? f : null) ); }; // TODO always include dataFormatVersion, guarantee const calculateHotelFields = (fields) => { return _hotelFields(fields, HOTEL_DEFAULT_FIELDS); }; const calculateHotelsFields = (fields) => { return _hotelFields(fields, HOTEL_DEFAULT_FIELDS_LIST); }; const calculateAirlineFields = (fields) => { return _airlineFields(fields, AIRLINE_DEFAULT_FIELDS); }; const calculateAirlinesFields = (fields) => { return _airlineFields(fields, AIRLINE_DEFAULT_FIELDS_LIST); }; module.exports = { _calculateFields, _airlineFields, _hotelFields, calculateAirlineFields, calculateAirlinesFields, calculateHotelFields, calculateHotelsFields, };