@windingtree/wt-read-api
Version:
API to interact with the Winding Tree platform
112 lines (108 loc) • 3.77 kB
JavaScript
const { Http404Error, HttpValidationError } = require('../errors');
const { DataFormatValidator } = require('../services/validation');
const { formatError } = require('../services/utils');
const { config } = require('../config');
const {
VALIDATION_WARNING_HEADER,
SCHEMA_PATH,
FLIGHT_INSTANCE_MODEL,
} = require('../constants');
const find = async (req, res, next) => {
const { flightId, flightInstanceId } = req.params;
try {
const airlineApis = await res.locals.wt.airline.getWindingTreeApi();
const apiContents = (await airlineApis.airline[0].toPlainObject(['flightsUri.items.flightInstancesUri'])).contents;
if (!apiContents.flightsUri) {
return next(new Http404Error('flightNotFound', 'Flights not found'));
}
const flights = apiContents.flightsUri.contents;
const flight = flights.items.find(f => f.id === flightId);
if (!flight) {
return next(new Http404Error('flightNotFound', 'Flight not found'));
}
const flightInstance = flight.flightInstancesUri.contents.find(i => i.id === flightInstanceId);
if (!flightInstance) {
return next(new Http404Error('flightInstanceNotFound', 'Flight instance not found'));
}
const swaggerDocument = await DataFormatValidator.loadSchemaFromPath(SCHEMA_PATH, FLIGHT_INSTANCE_MODEL);
try {
DataFormatValidator.validate(
flightInstance,
FLIGHT_INSTANCE_MODEL,
swaggerDocument.components.schemas,
config.dataFormatVersions.airlines,
apiContents.dataFormatVersion,
'flight instance',
);
} catch (e) {
if (e instanceof HttpValidationError) {
const err = formatError(e);
err.data = flightInstance;
if (e.data && e.data.valid) {
return res.set(VALIDATION_WARNING_HEADER, e.data.errors).status(200).json(err.toPlainObject());
} else {
return res.status(err.status).json(err.toPlainObject());
}
} else {
next(e);
}
}
res.status(200).json(flightInstance);
} catch (e) {
next(e);
}
};
const findAll = async (req, res, next) => {
const { flightId } = req.params;
try {
const airlineApis = await res.locals.wt.airline.getWindingTreeApi();
const apiContents = (await airlineApis.airline[0].toPlainObject(['flightsUri.items.flightInstancesUri'])).contents;
if (!apiContents.flightsUri) {
return next(new Http404Error('flightNotFound', 'Flights not found'));
}
const flights = apiContents.flightsUri.contents;
const flight = flights.items.find(f => f.id === flightId);
if (!flight) {
return next(new Http404Error('flightNotFound', 'Flight not found'));
}
const instances = [], warnings = [], errors = [];
const swaggerDocument = await DataFormatValidator.loadSchemaFromPath(SCHEMA_PATH, FLIGHT_INSTANCE_MODEL);
for (const instance of flight.flightInstancesUri.contents) {
try {
DataFormatValidator.validate(
instance,
FLIGHT_INSTANCE_MODEL,
swaggerDocument.components.schemas,
config.dataFormatVersions.airlines,
apiContents.dataFormatVersion,
'flight instance',
);
instances.push(instance);
} catch (e) {
if (e instanceof HttpValidationError) {
const err = formatError(e);
err.data = instance;
if (e.data && e.data.valid) {
warnings.push(err);
} else {
err.data = { id: err.data.id };
errors.push(err);
}
} else {
next(e);
}
}
}
res.status(200).json({
items: instances,
warnings: warnings,
errors: errors,
});
} catch (e) {
next(e);
}
};
module.exports = {
find,
findAll,
};