'use strict';
const hl = require('highland');
const fs = hl.streamifyAll(require('fs'));
const path = require('path');
const R = require('ramda');
const restify = require("restify");
const refReplace = R.curry(function(schemasURL, schemaString) {
const ref = R.head(R.match(/"\$ref":\s?"[^"]*"/g, schemaString));
const contentType = !R.isNil(ref) ? R.head(R.match(/\/\w*/g, ref)) : '';
if (R.isNil(ref)) {
return schemaString;
}
return refReplace(schemasURL, schemaString.replace(ref, '\"ref\": \"' + schemasURL + contentType + '\"'));
});
module.exports = {
getSchemaList: (req, res, next) => {
const schemasURL = `http://${req.headers.host}/schemas/`;
return fs.readdirStream(path.resolve('schemas'))
.sequence()
.map(fileName => [fileName.replace('.json', ''), `${schemasURL}${fileName.replace('.json', '')}`])
.collect()
.map(R.fromPairs)
.toCallback((err, result) => {
Iif (err) {
next(new restify.InternalServerError(err));
} else {
res.charSet('utf-8');
res.send(result);
}
});
},
getSchema: (req, res, next) => {
const schemasURL = `http://${req.headers.host}/schemas`;
return fs.readFileStream(path.resolve(`schemas/${req.params.contentType}.json`), 'utf8')
.map(R.pipe(
refReplace(schemasURL),
R.replace(/\"ref\"\:/g, '\"\$ref\"\:'),
JSON.parse
))
.toCallback((err, result) => {
if (err) {
next(new restify.ResourceNotFoundError('No schema found'));
} else {
res.charSet('utf-8');
res.send(result);
}
});
}
};
|