--- /dev/null
+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
+++ /dev/null
-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;
--- /dev/null
+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;