OSDN Git Service

plugin: add RequestBodyConditon and rename ReqBaker to NSRPC
authorhylom <hylom@users.sourceforge.jp>
Thu, 7 Jun 2018 12:21:10 +0000 (21:21 +0900)
committerhylom <hylom@users.sourceforge.jp>
Thu, 7 Jun 2018 12:21:10 +0000 (21:21 +0900)
src/newslash_web/lib/Newslash/Plugin/NSRPC.pm [new file with mode: 0644]
src/newslash_web/lib/Newslash/Plugin/ReqBaker.pm [deleted file]
src/newslash_web/lib/Newslash/Plugin/RequestBodyCondition.pm [new file with mode: 0644]

diff --git a/src/newslash_web/lib/Newslash/Plugin/NSRPC.pm b/src/newslash_web/lib/Newslash/Plugin/NSRPC.pm
new file mode 100644 (file)
index 0000000..d15985e
--- /dev/null
@@ -0,0 +1,120 @@
+package Newslash::Plugin::NSRPC;
+use Mojo::Base 'Mojolicious::Plugin';
+use Data::Dumper;
+
+sub register {
+    my ($self, $app, $conf) = @_;
+    $self->{app} = $app;
+    $app->helper(rpc => sub { state $ns_rpc = $self; });
+}
+
+sub _get_model {
+    my ($self, $model_name) = @_;
+    my $model = $self->{app}->model($model_name);
+    return $model;
+}
+
+sub _req_handler {
+    my ($self, $c, $model, $action) = @_;
+
+    if (my $func = $model->can($action)) {
+        my $params = {};
+        if ($c->req->method eq 'GET') {
+            $params = $c->req->params->to_hash;
+        }
+        else {
+            if ($c->req->headers->content_type =~ m|^application/json|) {
+                $params = $c->req->json;
+            }
+            else {
+                $params = $c->req->params->to_hash;
+            }
+        }
+
+        my $rs = $func->($model, %$params);
+        if (!$rs) {
+            $c->render(json => { error => 1, message => "query_failed" });
+            $c->rendered(400);
+            return;
+        }
+
+        if (!ref($rs)) {
+            $c->render(json => { id => $rs });
+            return;
+        }
+        elsif (ref($rs) eq "ARRAY") {
+            $c->render(json => { items => $rs });
+            return;
+        }
+        elsif (ref($rs) eq "HASH") {
+            $c->render(json => { item => $rs });
+            return;
+        }
+        $c->render(json => { result => $rs });
+        return;
+    }
+
+    $c->render(json => { error => 1, message => "invalid_action" });
+    $c->rendered(500);
+    return;
+}
+
+sub route_to_model {
+    my ($self, $route, $model_name, $action) = @_;
+
+    if (!$model_name) {
+        $self->{app}->error("NSRPC: invalid model_name");
+        return;
+    }
+
+    my $model = $self->_get_model($model_name);
+    if (!$model) {
+        $self->{app}->error("no valid model for $model_name");
+        return;
+    }
+
+    $route->to(cb => sub {
+                   $self->_req_handler(shift, $model, $action);
+               });
+    return $self;
+}
+
+1;
+
+=encoding utf8
+
+=head1 NAME
+
+Newslash::Plugin::NSRPC - Newslash RPC Helper
+
+=head1 SYNOPSIS
+
+  # Mojolicious
+  $app->plugin('Newslash::Plugin::NSRPC');
+
+=head1 DESCRIPTION
+
+L<Newslash::Plugin::NSRPC> porvides Newslash original Remote Procedure Call (NS-RPC) system.
+
+NS-RPC is is similar to JSON-RPC, but more loose. Currently, this plugin support only
+routing to model method.
+
+=head1 METHODS
+
+=head2 register
+
+  $plugin->register(Mojolicious->new);
+
+Register NSRPC as 'rpc' in L<Mojolicious> application.
+
+=head2 add_route
+
+  $app->rpc->route_to_model($route, "some_model_name", "method");
+
+Add route for access to given method of model.
+
+=head1 SEE ALSO
+
+L<Mojolicious>, L<Mojolicious::Guides>, L<http://mojolicious.org>.
+
+=cut
diff --git a/src/newslash_web/lib/Newslash/Plugin/ReqBaker.pm b/src/newslash_web/lib/Newslash/Plugin/ReqBaker.pm
deleted file mode 100644 (file)
index 5f577be..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-package Newslash::Plugin::ReqBaker;
-use Mojo::Base 'Mojolicious::Plugin';
-use Data::Dumper;
-
-sub register {
-    my ($self, $app, $conf) = @_;
-    $self->{app} = $app;
-    $app->helper(baker => sub { state $req_baker = $self; });
-
-    $app->routes->add_condition(bake => sub {
-                                    my ($route, $c, $captures, $cond) = @_;
-                                    my $params = $c->req->json;
-                                    return if !$params;
-
-                                    for my $k (keys %$cond) {
-                                        return if !$params->{$k};
-                                        return if $params->{$k} ne $cond->{$k};
-                                    }
-
-                                    return 1;
-                                });
-}
-
-sub _get_model {
-    my ($self, $model_name) = @_;
-    my $model = $self->{app}->model($model_name);
-    return $model;
-}
-
-sub _req_handler {
-    my ($self, $c, $model, $action) = @_;
-
-    if (my $func = $model->can($action)) {
-        my $params = $c->req->json;
-        #my $params = $c->req->params->to_hash;
-
-        my $rs = $func->($model, %$params);
-        if (!$rs) {
-            $c->render(json => { error => 1, message => "query_failed" });
-            $c->rendered(400);
-            return;
-        }
-
-        if (!ref($rs)) {
-            $c->render(json => { id => $rs });
-            return;
-        }
-        elsif (ref($rs) eq "ARRAY") {
-            $c->render(json => { items => $rs });
-            return;
-        }
-        $c->render(json => { result => $rs });
-        return;
-    }
-
-    $c->render(json => { error => 1, message => "invalid_action" });
-    $c->rendered(500);
-    return;
-}
-
-sub add_route {
-    my ($self, $route, $model_name, $action) = @_;
-
-    if (!$model_name) {
-        $self->{app}->error("ReqBaker: invalid model_name");
-        return;
-    }
-
-    my $model = $self->_get_model($model_name);
-    if (!$model) {
-        $self->{app}->error("no valid model for $model_name");
-        return;
-    }
-
-    $route->to(cb => sub {
-                   $self->_req_handler(shift, $model, $action);
-               });
-    return $self;
-}
-
-
-1;
diff --git a/src/newslash_web/lib/Newslash/Plugin/RequestBodyCondition.pm b/src/newslash_web/lib/Newslash/Plugin/RequestBodyCondition.pm
new file mode 100644 (file)
index 0000000..55ca983
--- /dev/null
@@ -0,0 +1,23 @@
+package Newslash::Plugin::RequestBodyCondition;
+use Mojo::Base 'Mojolicious::Plugin';
+use Data::Dumper;
+
+sub register {
+    my ($self, $app, $conf) = @_;
+    $self->{app} = $app;
+
+    $app->routes->add_condition(request_body => sub {
+                                    my ($route, $c, $captures, $cond) = @_;
+                                    my $params = $c->req->json;
+                                    return if !$params;
+
+                                    for my $k (keys %$cond) {
+                                        return if !$params->{$k};
+                                        return if $params->{$k} ne $cond->{$k};
+                                    }
+
+                                    return 1;
+                                });
+}
+
+1;