ee-soa-transport-rest
Advanced tools
Comparing version 0.2.5 to 0.3.0
@@ -217,3 +217,2 @@ var Class = require('ee-class'), | ||
, _setupSelects: function(base, request, original){ | ||
var selectHeader = original.getHeader('Select', true); | ||
@@ -229,13 +228,12 @@ if(selectHeader){ | ||
, _setupFilters: function(base, request, original) { | ||
var filterHeader = original.getHeader('Filter', true); | ||
if(filterHeader) { | ||
var filterVisitor = new visitor.FilterVisitor(base.getName()), | ||
filters = filterHeader.accept(filterVisitor); | ||
var filterHeader = original.getHeader('Filter', true); | ||
if(filterHeader) { | ||
var filterVisitor = new visitor.FilterVisitor(base.getName()), | ||
filters = filterHeader.accept(filterVisitor); | ||
request.setFilters(filters); | ||
} | ||
request.setFilters(filters); | ||
} | ||
} | ||
, _setupOrder: function(base, request, original){ | ||
var orderHeader = original.getHeader('Order', true); | ||
@@ -246,4 +244,4 @@ if(orderHeader){ | ||
var len = order.length, | ||
orderings = {}; | ||
var len = order.length, | ||
orderings = {}; | ||
@@ -250,0 +248,0 @@ for(var i=0; i<len; i++){ |
@@ -169,6 +169,7 @@ "use strict"; | ||
callback(); | ||
} catch(err){ | ||
callback(err); | ||
log(err); | ||
return callback(err); | ||
} | ||
return callback(); | ||
} | ||
@@ -232,2 +233,3 @@ | ||
, request: function(req, res, next){ | ||
var startTime = Date.now() | ||
@@ -237,3 +239,2 @@ , response = this._createEmptyResponse(); | ||
response.language = req.language; | ||
this._createInternalRequest(req, function(err, request){ | ||
@@ -250,3 +251,2 @@ if(err) { | ||
} | ||
// as soon as someone has ended the response stream | ||
@@ -260,2 +260,3 @@ // or did call the send method, we send it back to the client | ||
this.emit('request', request, response); | ||
@@ -262,0 +263,0 @@ }.bind(this)); |
"use strict"; | ||
var request = require('ee-soa-request') | ||
, types = require('ee-types'); | ||
/** | ||
* [ | ||
* { | ||
* event: { | ||
* id: 10 | ||
* , operator: '>' | ||
* } | ||
* , venue: { | ||
* address: { | ||
* postalcode: [ | ||
* { operator: '>', value: 4500 } | ||
* , {operator: '<', value: 5000 } | ||
* ] | ||
* } | ||
* } | ||
* } | ||
*/ | ||
var Types = require('ee-types') | ||
, Class = require('ee-class') | ||
var Class = require('ee-class'); | ||
, OrList = require('./OrList') | ||
, AndList = require('./AndList') | ||
, NormalizingVisitor = require('./NormalizingVisitor'); | ||
var FilterVisitor = { | ||
var FilterVisitor = module.exports = new Class({ | ||
baseEntity: null | ||
, namespaces: {} | ||
inherits: NormalizingVisitor | ||
, baseEntity: null | ||
, init: function initialize(baseEntity) { | ||
// initialize.parent(); | ||
this.baseEntity = baseEntity | ||
, setBaseEntity: function(entity){ | ||
this.baseEntity = entity || ''; | ||
return this; | ||
} | ||
, getBaseEntity: function(){ | ||
return this.baseEntity | ||
, visitFilterStatement: function(node){ | ||
return this.pushAll(node, new OrList()); | ||
} | ||
, setBaseEntity: function(baseEntity){ | ||
this.baseEntity = baseEntity; | ||
return this; | ||
, visitSequence: function(node){ | ||
return this.pushAll(node, new AndList()); | ||
} | ||
, visitFilterStatement: function(nodes){ | ||
this.namespaces = {}; | ||
var filters = new request.filter.FilterCollection(); | ||
for (var i = 0; i < nodes.length; i++) { | ||
var node = nodes[i]; | ||
node.accept(this); | ||
} | ||
// todo: transform this to a filter collection; | ||
return this.namespaces; | ||
, visitChoice: function(node){ | ||
return this.pushAll(node, new OrList()); | ||
} | ||
, visitNodeCollection: function(nodes){ | ||
var result = []; | ||
for (var i = 0; i < nodes.length; i++) { | ||
var node = nodes[i]; | ||
result.push(node.accept(this)) | ||
} | ||
return result; | ||
} | ||
, visitComparisonNode: function(node){ | ||
var current = this.namespaces, | ||
names = node.getProperty().accept(this), | ||
first = names[0], | ||
value = node.getValue(); | ||
, visitComparison: function(node){ | ||
var comp = { | ||
fields: node.identifier.accept(this) | ||
, function: node.comparator | ||
, value: node.value.accept(this) | ||
}; | ||
for (var i = 0; i < names.length-1; i++) { | ||
var name = names[i]; | ||
if(!current[name]){ | ||
current[name] = {}; | ||
} | ||
current = current[name]; | ||
if(Types.function(comp.value)){ | ||
var info = comp.value(); | ||
comp.function = info.name; | ||
comp.value = info.parameters; | ||
} | ||
name = names[i]; | ||
if(!current[name]){ | ||
current[name] = []; | ||
} | ||
current[name].push({ | ||
operator: node.getOperator() | ||
, value: value.accept(this) | ||
}); | ||
return comp; | ||
} | ||
, visitActionNode: function(node){ | ||
var parameters = node.getParameters().accept(this); | ||
return function(){ | ||
return { | ||
name: node.getName() | ||
, parameters: parameters | ||
}; | ||
}; | ||
name: node.getName() | ||
, parameters: node.parameters | ||
} | ||
} | ||
} | ||
, visitValueNode: function(node){ | ||
return node.getValue(); | ||
return node.value; | ||
} | ||
, visitVariableNode: function(node){ | ||
return this._getAndNormalizeNames(node); | ||
} | ||
, visitPropertyNode: function(node){ | ||
return this._getAndNormalizeNames(node); | ||
} | ||
, _getAndNormalizeNames: function(node){ | ||
var names = node.getNames().slice(0); | ||
if(names[0] === this.baseEntity){ | ||
names.shift(); | ||
} | ||
return names; | ||
} | ||
}; | ||
module.exports = new Class(FilterVisitor); | ||
}); |
"use strict"; | ||
var request = require('ee-soa-request') | ||
, types = require('ee-types'); | ||
var Class = require('ee-class'); | ||
var Class = require('ee-class') | ||
, NormalizingVisitor = require('./NormalizingVisitor'); | ||
/** | ||
@@ -10,24 +10,6 @@ * todo: implement hierarchical ordering | ||
*/ | ||
var OrderVisitor = { | ||
var OrderVisitor = module.exports = new Class({ | ||
baseEntity: null | ||
, namespaces: {} | ||
inherits: NormalizingVisitor | ||
, init: function initialize(baseEntity) { | ||
// initialize.parent(); | ||
this.baseEntity = baseEntity | ||
} | ||
, getBaseEntity: function(){ | ||
return this.baseEntity | ||
} | ||
, setBaseEntity: function(baseEntity){ | ||
this.baseEntity = baseEntity; | ||
return this; | ||
} | ||
/** | ||
* @param nodes | ||
* @returns {Array} | ||
*/ | ||
, visitOrderStatement: function(nodes){ | ||
@@ -43,21 +25,13 @@ var orderings = []; | ||
, visitVariableNode: function(node){ | ||
return { name: [ node.getName() ], direction: node.getTags().shift() || "ASC" }; | ||
, visitOrdering: function(node){ | ||
return { | ||
name: node.value.accept(this) | ||
, direction: node.direction | ||
} | ||
} | ||
, visitPropertyNode: function(node){ | ||
var names = this._getAndNormalizeNames(node); | ||
return { name: names, direction: node.getTags().shift() || "ASC" }; | ||
// todo: this is for compatibility reasons, but hopefully never used | ||
, visitActionNode: function(node){ | ||
return [ node.name ] | ||
} | ||
, _getAndNormalizeNames: function(node){ | ||
var names = node.getNames().slice(0); | ||
if(names[0] === this.baseEntity){ | ||
names.shift(this.baseEntity); | ||
} | ||
return names; | ||
} | ||
}; | ||
module.exports = new Class(OrderVisitor); | ||
}); |
"use strict"; | ||
var Class = require('ee-class'); | ||
var Class = require('ee-class') | ||
, NormalizingVisitor = require('./NormalizingVisitor'); | ||
var SelectVisitor = { | ||
var SelectVisitor = module.exports = new Class({ | ||
baseEntity: null, | ||
inherits: NormalizingVisitor | ||
init: function initialize(baseEntity) { | ||
// initialize.parent(); | ||
this.baseEntity = baseEntity | ||
} | ||
, getBaseEntity: function(){ | ||
return this.baseEntity | ||
} | ||
, setBaseEntity: function(baseEntity){ | ||
this.baseEntity = baseEntity | ||
return this; | ||
} | ||
, visitSelectStatement: function(node){ | ||
@@ -31,18 +18,2 @@ var names = [] | ||
, visitVariableNode: function(node){ | ||
return this._getAndNormalizeNames(node); | ||
} | ||
, visitPropertyNode: function(node){ | ||
return this._getAndNormalizeNames(node); | ||
} | ||
, _getAndNormalizeNames: function(node){ | ||
var names = node.getNames().slice(0); | ||
if(names[0] === this.baseEntity){ | ||
names.shift(this.baseEntity); | ||
} | ||
return names; | ||
} | ||
, _reduceSelections: function(fields){ | ||
@@ -101,4 +72,2 @@ if(!fields){ | ||
}; | ||
module.exports = new Class(SelectVisitor); | ||
}); |
{ | ||
"name" : "ee-soa-transport-rest" | ||
, "description" : "Rest specific transport implementation." | ||
, "version" : "0.2.5" | ||
, "version" : "0.3.0" | ||
, "homepage" : "https://github.com/eventEmitter/ee-soa-transport-rest" | ||
@@ -26,3 +26,3 @@ , "author" : "Michael Rüfenacht <ruefe@rcky.ch> (http://rcky.ch/)" | ||
, "em-formdata-collector" : "0.1.*" | ||
, "ee-rest-headers" : "0.1.x" | ||
, "ee-rest-headers" : "0.2.x" | ||
, "ee-soa-request" : "0.2.x" | ||
@@ -29,0 +29,0 @@ , "ee-templates" : "0.3.*" |
var assert = require('assert') | ||
, log = require('ee-log') | ||
, Class = require('ee-class') | ||
, Webserver = require('ee-webserver'); | ||
@@ -14,2 +15,7 @@ | ||
var Err = new Class({ | ||
inherits: Error | ||
}); | ||
function getOptions(){ | ||
@@ -31,10 +37,13 @@ return { | ||
var transport = new HTTPTransport({interface: 5, port:'8080'}); | ||
transport.use(new TestWebsite()); | ||
transport.on('request', function(request, response){ | ||
var transport = new HTTPTransport({interface: 5, port:'8080'}) | ||
, listener = function(request, response){ | ||
// just send the request back with some data | ||
response.send(response.statusCodes.OK, {test: 'succeeded'}); | ||
}); | ||
}; | ||
transport.use(new TestWebsite()); | ||
transport.on('request', listener); | ||
describe('Null Path Requests', function(){ | ||
@@ -78,2 +87,6 @@ | ||
}); | ||
it("should add a cache control header", function(){ | ||
assert.equal(mockResponse.headers['cache-control'], 'no-transform'); | ||
}); | ||
}); | ||
@@ -180,15 +193,19 @@ | ||
it("should parse the order headers", function(done){ | ||
transport.on('request', function(req, res){ | ||
var expected = { | ||
thing: { | ||
id: 'ASC' | ||
} | ||
, category: { | ||
location: { | ||
title: 'DESC' | ||
, postalcode: 'ASC' | ||
transport.off('request'); | ||
transport.on('request', function(req, response){ | ||
var order = { | ||
api: { | ||
thing: { | ||
id: "ASC" | ||
} | ||
, category: { | ||
location: { | ||
title: "DESC" | ||
, postalcode: "ASC" | ||
} | ||
} | ||
} | ||
}; | ||
assert.deepEqual(req.getOrder(), expected); | ||
assert.deepEqual(order, req.getOrder()); | ||
done(); | ||
@@ -199,2 +216,34 @@ }); | ||
}); | ||
describe('Select Headers Test', function(){ | ||
var options = getOptions(); | ||
options.url = '/api/'; | ||
options.headers.accept = 'application/json;q=1'; | ||
options.headers.select = 'thing.id, location.title, location.city.postalcode, id, version'; | ||
var mockRequest = new Webserver.testing.MockRequest(options) | ||
, testRequest = new Webserver.Request({request: mockRequest}) | ||
, responseOptions = {} | ||
, mockResponse = new Webserver.testing.MockResponse(responseOptions) | ||
, testResponse = new Webserver.Response({ | ||
request: testRequest | ||
, response: mockResponse | ||
}); | ||
it("should load without errors", function(done){ | ||
transport.onLoad(done); | ||
transport.useTransport(); | ||
}); | ||
it("should parse the select headers", function(done){ | ||
transport.off('request'); | ||
transport.on('request', function(req, res){ | ||
var test = null; | ||
assert(req.hasSubRequests()); | ||
done(); | ||
}); | ||
transport.testRequest(testRequest, testResponse); | ||
}); | ||
}); | ||
}); |
63450
38
1523
+ Addedee-class@1.4.0(transitive)
+ Addedee-log@0.3.11(transitive)
+ Addedee-rest-headers@0.2.5(transitive)
+ Addedee-types@2.2.1(transitive)
- Removedee-rest-headers@0.1.2(transitive)
Updatedee-rest-headers@0.2.x