YUKI Hiroshi
null+****@clear*****
Tue Feb 5 17:17:56 JST 2013
YUKI Hiroshi 2013-02-05 17:17:56 +0900 (Tue, 05 Feb 2013) New Revision: 08d5db8b2f29ee0ebff6f528abd681a807465f7d https://github.com/groonga/express-kotoumi/commit/08d5db8b2f29ee0ebff6f528abd681a807465f7d Log: Define default REST commands on a pluggable system Added files: lib/frontend/default-commands/rest.js Modified files: lib/frontend/rest-adaptor.js test/frontend-rest-adaptor.test.js test/rest-request-builder.test.js Renamed files: lib/frontend/default-commands/rest-request-builder.js (from lib/frontend/rest-request-builder.js) Renamed: lib/frontend/default-commands/rest-request-builder.js (+0 -0) 100% =================================================================== Added: lib/frontend/default-commands/rest.js (+44 -0) 100644 =================================================================== --- /dev/null +++ lib/frontend/default-commands/rest.js 2013-02-05 17:17:56 +0900 (661437d) @@ -0,0 +1,44 @@ +var requestBuilders = require('./rest-request-builder'); + +module.exports = { +// 'status': { +// method: 'GET', +// path: '/status/:target', +// requestBuilder: requestBuilders.status +// }, + 'search': { + method: 'GET', + path: '/tables/:tableName', + requestBuilder: requestBuilders.search + } //, +// 'createtable': { +// method: 'PUT', +// path: '/tables/:tableName', +// requestBuilder: requestBuilders.createTable +// }, +// 'removetable': { +// method: 'DELETE', +// path: '/tables/:tableName', +// requestBuilder: requestBuilders.removeTable +// }, +// 'createcolumn': { +// method: 'PUT', +// path: '/tables/:tableName/columns/:columnName', +// requestBuilder: requestBuilders.createColumn +// }, +// 'removecolumn': { +// method: 'DELETE', +// path: '/tables/:tableName/columns/:columnName', +// requestBuilder: requestBuilders.removeColumn +// }, +// 'loadrecord': { +// method: 'PUT', +// path: '/tables/:tableName/records/:key', +// requestBuilder: requestBuilders.loadRecord +// }, +// 'loadrecords': { +// method: 'PUT', +// path: '/tables/:tableName/records', +// requestBuilder: requestBuilders.loadRecords +// } +}; Modified: lib/frontend/rest-adaptor.js (+43 -23) =================================================================== --- lib/frontend/rest-adaptor.js 2013-02-05 16:34:33 +0900 (27cf394) +++ lib/frontend/rest-adaptor.js 2013-02-05 17:17:56 +0900 (dbf65f3) @@ -1,16 +1,19 @@ -var restRequestBuilders = require('./rest-request-builder'); +var defaultCommands = require('./default-commands/rest'); + +function createHandler(params) { + params = params || {}; + var connection = params.connection; + var command = params.command; + var requestBuilder = params.requestBuilder; -function createHandler(type, - requestBuilder, - connection) { if (!requestBuilder) - throw new Error('no request builder for ' + type); + throw new Error('no request builder for ' + command); return (function(request, response) { var message = requestBuilder(request); var timeout = message.timeout || null; connection.emitMessage( - type, + command, message, function(error, responseMessage) { if (error) { @@ -29,6 +32,18 @@ function createHandler(type, } exports.createHandler = createHandler; +function getRegisterationMethod(method) { + switch (method.toUpperCase()) { + case 'GET': return 'get'; + case 'PUT': return 'put'; + case 'POST': return 'post'; + case 'DELETE': return 'del'; + default: + throw new Error(method + ' is unsppported HTTP method!'); + } +} +exports.findRegisterationMethod = findRegisterationMethod; + exports.register = function(application, params) { params = params || {}; var connection = params.connection; @@ -38,23 +53,28 @@ exports.register = function(application, params) { var prefix = params.prefix || ''; prefix = prefix.replace(/\/$/, ''); - function createHandlerFor(type) { - if (params.handlers) - return params.handlers[type](connection); - else - return createHandler(type, restRequestBuilders[type], connection); - } + var commandSets = [defaultCommands].concat(params.plugins || []); + var unifiedCommandSets = {}; + commandSets.forEach(function(commandSet) { + if (typeof commandSets == 'string') + commandSets = require(commandSets); -// this.get(prefix + '/status/:target', createHandlerFor('status')); - - application.get(prefix + '/tables/:tableName', createHandlerFor('search')); - -// this.put(prefix + '/tables/:tableName', createHandlerFor('createtable')); -// this.del(prefix + '/tables/:tableName', createHandlerFor('removetable')); - -// this.put(prefix + '/tables/:tableName/columns/:columnName', createHandlerFor('createcolumn')); -// this.del(prefix + '/tables/:tableName/columns/:columnName', createHandlerFor('removecolumn')); + Object.keys(commandSets).forEach(function(command) { + var definition = commandSets[command]; + unifiedCommandSets[command] = definition; + }); + }); -// this.put(prefix + '/tables/:tableName/records/:key', createHandlerFor('loadrecord')); -// this.post(prefix + '/tables/:tableName/records', createHandlerFor('loadrecords')); + Object.keys(unifiedCommandSets).forEach(function(command) { + var definition = unifiedCommandSets[command]; + var method = getRegisterationMethod(definition.method); + application[method]( + prefix + definition.path, + createHandler({ + connection: connection, + command: command, + requestBuilder: definition.requestBuilder + }) + ); + }); } Modified: test/frontend-rest-adaptor.test.js (+5 -3) =================================================================== --- test/frontend-rest-adaptor.test.js 2013-02-05 16:34:33 +0900 (616aa98) +++ test/frontend-rest-adaptor.test.js 2013-02-05 17:17:56 +0900 (ae7d014) @@ -100,9 +100,11 @@ suite('REST API', function() { .takes('search', { requestMessage: true }, function() {}, {}) .ctrl(2, onReceive); var handler = restAdaptor - .createHandler('search', - requestBuilders.search, - connection); + .createHandler({ + command: 'search', + requestBuilder: requestBuilders.search, + connection: connection + }); var fakeRequest = { request: true }; var fakeResponse = nodemock Modified: test/rest-request-builder.test.js (+1 -1) =================================================================== --- test/rest-request-builder.test.js 2013-02-05 16:34:33 +0900 (943a52e) +++ test/rest-request-builder.test.js 2013-02-05 17:17:56 +0900 (9a90782) @@ -2,7 +2,7 @@ var assert = require('chai').assert; var utils = require('./test-utils'); -var builders = require('../lib/frontend/rest-request-builder'); +var builders = require('../lib/frontend/default-commands/rest-request-builder'); suite('building message from REST API request', function() { suite('search', function() { -------------- next part -------------- HTML����������������������������...ダウンロード