Skip to content

Commit c54d526

Browse files
committed
add "privateTags" config option on swagger_raw to drop tagged objects, drops "x-private" by default
1 parent 4991248 commit c54d526

File tree

3 files changed

+66
-12
lines changed

3 files changed

+66
-12
lines changed

fittings/swagger_raw.js

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ var _ = require('lodash');
77
// default filter just drops all the x- labels
88
var DROP_SWAGGER_EXTENSIONS = /^(?!x-.*)/;
99

10+
// default filter drops anything labeled x-private
11+
var X_PRIVATE = ['x-private'];
12+
1013
module.exports = function create(fittingDef, bagpipes) {
1114

1215
debug('config: %j', fittingDef);
@@ -16,7 +19,8 @@ module.exports = function create(fittingDef, bagpipes) {
1619
filter = new RegExp(fittingDef.filter);
1720
}
1821
debug('swagger doc filter: %s', filter);
19-
var filteredSwagger = filterKeysRecursive(bagpipes.config.swaggerNodeRunner.swagger, filter);
22+
var privateTags = fittingDef.privateTags || X_PRIVATE;
23+
var filteredSwagger = filterKeysRecursive(bagpipes.config.swaggerNodeRunner.swagger, filter, privateTags);
2024

2125
if (!filteredSwagger) { return next(null, ''); }
2226

@@ -41,15 +45,25 @@ module.exports = function create(fittingDef, bagpipes) {
4145
}
4246
};
4347

44-
function filterKeysRecursive(object, regex) {
48+
function filterKeysRecursive(object, dropTagRegex, privateTags) {
4549
if (_.isPlainObject(object)) {
46-
var result = {};
47-
_.each(object, function(value, key) {
48-
if (regex.test(key)) {
49-
result[key] = filterKeysRecursive(value, regex);
50-
}
51-
});
52-
return result;
50+
if (_.any(privateTags, function(tag) { return object[tag]; })) {
51+
object = undefined;
52+
} else {
53+
var result = {};
54+
_.each(object, function(value, key) {
55+
if (dropTagRegex.test(key)) {
56+
var v = filterKeysRecursive(value, dropTagRegex, privateTags);
57+
if (v !== undefined) {
58+
result[key] = v;
59+
} else {
60+
debug('dropping object at %s', key);
61+
delete(result[key]);
62+
}
63+
}
64+
});
65+
return result;
66+
}
5367
}
5468
return object;
5569
}

test/assets/project/api/swagger/swagger.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ paths:
262262
/invalid_response_code:
263263
x-swagger-router-controller: hello_world
264264
get:
265+
x-hidden: true
265266
description: Returns 'Hello' to the caller
266267
operationId: hello
267268
parameters:
@@ -276,6 +277,7 @@ paths:
276277
schema:
277278
$ref: "#/definitions/ErrorResponse"
278279
/invalid_header:
280+
x-private: true
279281
x-swagger-router-controller: hello_world
280282
get:
281283
description: Returns 'Hello' to the caller

test/fittings/swagger_raw.js

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,18 @@ describe('swagger_raw', function() {
1616
var bagpipes = { config: { swaggerNodeRunner: { swagger: swagger }}};
1717
swaggerDoc = swagger_raw({}, bagpipes);
1818

19-
// hokey algorithm, but at least it's different than the one it's testing
2019
var filteredSwagger = _.cloneDeep(swagger);
21-
var OMIT = ['x-swagger-router-controller', 'x-swagger-pipe'];
20+
delete(filteredSwagger.paths['/invalid_header']);
21+
22+
// hokey algorithm, but at least it's different than the one it's testing
23+
var OMIT = ['x-swagger-router-controller', 'x-swagger-pipe', 'x-hidden', 'x-private'];
2224
_.forEach(filteredSwagger.paths, function(element, name) {
2325
filteredSwagger.paths[name] = _.omit(element, OMIT);
2426
_.forEach(filteredSwagger.paths[name], function(element, subName) {
2527
filteredSwagger.paths[name][subName] = _.omit(element, OMIT);
2628
});
2729
});
30+
2831
yaml = YAML.safeDump(filteredSwagger, { indent: 2 });
2932
json = JSON.stringify(filteredSwagger, null, 2);
3033
});
@@ -83,7 +86,42 @@ describe('swagger_raw', function() {
8386
should.not.exist(err);
8487
'application/yaml'.should.eql(context.headers['Content-Type']);
8588

86-
var yaml = YAML.safeDump(swagger, { indent: 2 });
89+
var filteredSwagger = _.cloneDeep(swagger);
90+
delete(filteredSwagger.paths['/invalid_header']);
91+
should.exist(filteredSwagger.paths['/invalid_response_code'].get)
92+
var yaml = YAML.safeDump(filteredSwagger, { indent: 2 });
93+
94+
output.should.eql(yaml);
95+
done();
96+
});
97+
});
98+
99+
it('should be able to modify privateTags & apply to operations', function(done) {
100+
101+
var context = {
102+
headers: {},
103+
request: {
104+
headers: { accept: 'application/yaml' }
105+
}
106+
};
107+
108+
config = {
109+
filter: '.*',
110+
privateTags: [ 'x-private', 'x-hidden' ]
111+
};
112+
113+
var bagpipes = { config: { swaggerNodeRunner: { swagger: swagger }}};
114+
var swaggerDoc = swagger_raw(config, bagpipes);
115+
116+
swaggerDoc(context, function(err, output) {
117+
should.not.exist(err);
118+
'application/yaml'.should.eql(context.headers['Content-Type']);
119+
120+
var filteredSwagger = _.cloneDeep(swagger);
121+
delete(filteredSwagger.paths['/invalid_header']);
122+
delete(filteredSwagger.paths['/invalid_response_code'].get);
123+
var yaml = YAML.safeDump(filteredSwagger, { indent: 2 });
124+
87125
output.should.eql(yaml);
88126
done();
89127
});

0 commit comments

Comments
 (0)