Implements ShowAction, Library
This commit is contained in:
parent
da0a827e7e
commit
a8b13820f1
@ -3,5 +3,6 @@
|
|||||||
"debugLevel":"debug",
|
"debugLevel":"debug",
|
||||||
"endpoints": {
|
"endpoints": {
|
||||||
"library":"endpoint/library.js"
|
"library":"endpoint/library.js"
|
||||||
}
|
},
|
||||||
|
"urlPrefix": "http://127.0.0.1:8080/bouquins"
|
||||||
}
|
}
|
||||||
|
@ -59,7 +59,6 @@ Action.prototype = Object.create(EventEmitter.prototype, {
|
|||||||
value: function(callback) {
|
value: function(callback) {
|
||||||
logger.debug('prepare Action');
|
logger.debug('prepare Action');
|
||||||
// TODO impl per action type
|
// TODO impl per action type
|
||||||
|
|
||||||
// default: OK, no headers
|
// default: OK, no headers
|
||||||
callback(null, 200, {});
|
callback(null, 200, {});
|
||||||
},
|
},
|
||||||
@ -89,7 +88,90 @@ function ShowAction() {
|
|||||||
Action.call(this, 'show');
|
Action.call(this, 'show');
|
||||||
};
|
};
|
||||||
// inherits Action
|
// inherits Action
|
||||||
ShowAction.prototype = Object.create(Action.prototype);
|
ShowAction.prototype = Object.create(Action.prototype, {
|
||||||
|
/**
|
||||||
|
* Resource id.
|
||||||
|
*/
|
||||||
|
resId: { value: null, enumerable: true, configurable: true, writable: true },
|
||||||
|
/**
|
||||||
|
* Resource.
|
||||||
|
*/
|
||||||
|
res: { value: null, enumerable: true, configurable: true, writable: true },
|
||||||
|
/**
|
||||||
|
* Prepare show action.
|
||||||
|
* Headers:
|
||||||
|
* - Link: related resource.
|
||||||
|
*/
|
||||||
|
prepare: {
|
||||||
|
value: function(callback) {
|
||||||
|
var self = this;
|
||||||
|
if (this.resId) {
|
||||||
|
this.loadResource(this.resId, function(err, res) {
|
||||||
|
self.res = res;
|
||||||
|
//TODO err
|
||||||
|
var link = '';
|
||||||
|
var rels = self.getRelated(res); // { type: 'author', path: '/author/id'}
|
||||||
|
logger.debug(rels);
|
||||||
|
rels.forEach(function (e) {
|
||||||
|
if (link.length > 0) link+=', ';
|
||||||
|
link += '<' + config.urlPrefix + e.path + '>; rel=' + e.type;
|
||||||
|
});
|
||||||
|
var headers = {};
|
||||||
|
if (link.length > 0) {
|
||||||
|
headers.Link = link;
|
||||||
|
}
|
||||||
|
callback(null, 200, headers);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
//TODO error?
|
||||||
|
callback(null, '5OO', {});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true,
|
||||||
|
writable: true
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* Load resource.
|
||||||
|
* @param resource id
|
||||||
|
* @param callback <function(err, resource)>
|
||||||
|
*/
|
||||||
|
loadResource: {
|
||||||
|
value: function(resId, callback){
|
||||||
|
//implement
|
||||||
|
callback(new Error('Cannot load resource ' + resId));
|
||||||
|
},
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true,
|
||||||
|
writable: true
|
||||||
|
},
|
||||||
|
/**
|
||||||
|
* Get related resources.
|
||||||
|
* @param res resource
|
||||||
|
* @return related resources { type: 'author', path: '/author/id'}
|
||||||
|
*/
|
||||||
|
getRelated: {
|
||||||
|
value: function(res){
|
||||||
|
return [];
|
||||||
|
},
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true,
|
||||||
|
writable: true
|
||||||
|
},
|
||||||
|
|
||||||
|
doAction: {
|
||||||
|
value: function(){
|
||||||
|
logger.debug('doAction');
|
||||||
|
this.emit('data', this.res);
|
||||||
|
this.emit('end');
|
||||||
|
},
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true,
|
||||||
|
writable: true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
ShowAction: ShowAction
|
ShowAction: ShowAction
|
||||||
|
@ -34,6 +34,9 @@ Endpoint.prototype = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return target is a collection of resources.
|
||||||
|
*/
|
||||||
targetCollection : function(pathname) {
|
targetCollection : function(pathname) {
|
||||||
// TODO
|
// TODO
|
||||||
return false;
|
return false;
|
||||||
@ -43,7 +46,7 @@ Endpoint.prototype = {
|
|||||||
* Bind action to endpoint resource.
|
* Bind action to endpoint resource.
|
||||||
*/
|
*/
|
||||||
bind : function(action, callback) {
|
bind : function(action, callback) {
|
||||||
//TODO
|
// implemented
|
||||||
callback(null, action);
|
callback(null, action);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -6,5 +6,39 @@ function Library() {
|
|||||||
Endpoint.call(this);
|
Endpoint.call(this);
|
||||||
}
|
}
|
||||||
Library.prototype = Object.create(Endpoint.prototype, {
|
Library.prototype = Object.create(Endpoint.prototype, {
|
||||||
|
|
||||||
|
bind: {
|
||||||
|
value: function(action, callback) {
|
||||||
|
if (action.name == 'show') {
|
||||||
|
action.resId = 'library';
|
||||||
|
action.loadResource = function(resId, callback) {
|
||||||
|
//TODO load from db
|
||||||
|
callback(null, {
|
||||||
|
name: 'Bibliothèque Meutel'
|
||||||
|
});
|
||||||
|
};
|
||||||
|
action.getRelated = function(res){
|
||||||
|
return new Array(
|
||||||
|
// authors list
|
||||||
|
{ type: 'authors', path: '/author/' },
|
||||||
|
// books list
|
||||||
|
{ type: 'books', path: '/books/' },
|
||||||
|
// tags list
|
||||||
|
{ type: 'tags', path: '/tags/' },
|
||||||
|
// series list
|
||||||
|
{ type: 'series', path: '/series/' },
|
||||||
|
// user favorites
|
||||||
|
{ type: 'favorites', path:'/favorites/'}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
callback(null, action);
|
||||||
|
},
|
||||||
|
enumerable: true,
|
||||||
|
configurable: true,
|
||||||
|
writable: true
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
exports = module.exports = new Library();
|
exports = module.exports = new Library();
|
||||||
|
@ -26,14 +26,15 @@ Outputter.prototype = {
|
|||||||
* Available before calling outputTo().
|
* Available before calling outputTo().
|
||||||
*/
|
*/
|
||||||
addHeader: function (name, value) {},
|
addHeader: function (name, value) {},
|
||||||
|
/**
|
||||||
|
* Init before outputing.
|
||||||
|
*/
|
||||||
|
init: function () {},
|
||||||
/**
|
/**
|
||||||
* Listen action 'data' event.
|
* Listen action 'data' event.
|
||||||
* Receive resource instance to output.
|
* Receive resource instance to output.
|
||||||
*/
|
*/
|
||||||
output: function (resource) {
|
output: function (resource) { },
|
||||||
//TODO
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Listen action 'end' event.
|
* Listen action 'end' event.
|
||||||
@ -41,7 +42,6 @@ Outputter.prototype = {
|
|||||||
*/
|
*/
|
||||||
end: function() {
|
end: function() {
|
||||||
logger.debug('Action ended');
|
logger.debug('Action ended');
|
||||||
//TODO
|
|
||||||
this.out.end();
|
this.out.end();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -63,6 +63,16 @@ var JSONOutputter = function() {
|
|||||||
};
|
};
|
||||||
// inherits Outputter
|
// inherits Outputter
|
||||||
JSONOutputter.prototype = Object.create(Outputter.prototype, {
|
JSONOutputter.prototype = Object.create(Outputter.prototype, {
|
||||||
|
output: {
|
||||||
|
value: function(resource) {
|
||||||
|
this.out.write(JSON.stringify(resource));
|
||||||
|
}, enumerable: true, configurable: true, writable: true
|
||||||
|
},
|
||||||
|
init: {
|
||||||
|
value: function() {
|
||||||
|
this.addHeader('Content-Type', 'application/json');
|
||||||
|
}, enumerable: true, configurable: true, writable: true
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -104,7 +104,7 @@ Router.prototype = {
|
|||||||
// allow outputter to set headers
|
// allow outputter to set headers
|
||||||
outputter.addHeader = function(name, value) {
|
outputter.addHeader = function(name, value) {
|
||||||
if (resp.headersSent) {
|
if (resp.headersSent) {
|
||||||
logger.warn('Header already sent, ignoring: ' + name);
|
logger.error('Header already sent, ignoring: ' + name);
|
||||||
} else {
|
} else {
|
||||||
resp.setHeader(name, value);
|
resp.setHeader(name, value);
|
||||||
}
|
}
|
||||||
@ -117,6 +117,7 @@ Router.prototype = {
|
|||||||
}
|
}
|
||||||
// when request data received, prepare action, send headers, exec action
|
// when request data received, prepare action, send headers, exec action
|
||||||
req.on('end', function() {
|
req.on('end', function() {
|
||||||
|
outputter.init();
|
||||||
action.prepare(function(err, statusCode, headers){
|
action.prepare(function(err, statusCode, headers){
|
||||||
//TODO err
|
//TODO err
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user