[Groonga-commit] groonga/express-kotoumi [master] Define default REST commands on a pluggable system

アーカイブの一覧に戻る

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����������������������������...
ダウンロード 



More information about the Groonga-commit mailing list
アーカイブの一覧に戻る