OSDN Git Service

implement blocking related API
authorhylom <hylom@users.sourceforge.jp>
Tue, 29 Aug 2017 12:06:43 +0000 (21:06 +0900)
committerhylom <hylom@users.sourceforge.jp>
Tue, 29 Aug 2017 12:06:43 +0000 (21:06 +0900)
src/newslash_web/lib/Newslash/Web.pm
src/newslash_web/lib/Newslash/Web/Controller/API/Admin/Blocking.pm [new file with mode: 0644]
src/newslash_web/lib/Newslash/Web/Controller/API/Admin/Contents/Blocked.pm [deleted file]
src/newslash_web/t/api/submission.t

index 50b62ca..6d8902d 100644 (file)
@@ -236,8 +236,8 @@ sub startup {
     my $admin_api = $r->under('/api/v1/admin' => sub { my $c = shift; $c->stash(seclev => 10000); return 1; });
     $admin_api->get('/feed')->to('API::Admin::Feed#get');
     $admin_api->post('/feed')->to('API::Admin::Feed#post');
-    $admin_api->get('/contents/blocked')->to('API::Admin::Contents::Blocked#get');
-    $admin_api->post('/contents/blocked')->to('API::Admin::Contents::Blocked#post');
+    $admin_api->get('/blocking')->to('API::Admin::Blocking#get');
+    $admin_api->post('/blocking')->to('API::Admin::Blocking#post');
 
     $admin_api->get('/repository/export')->to('API::Admin::Repository#export');
     $admin_api->get('/repository/import')->to('API::Admin::Repository#import');
diff --git a/src/newslash_web/lib/Newslash/Web/Controller/API/Admin/Blocking.pm b/src/newslash_web/lib/Newslash/Web/Controller/API/Admin/Blocking.pm
new file mode 100644 (file)
index 0000000..9ad3e13
--- /dev/null
@@ -0,0 +1,130 @@
+package Newslash::Web::Controller::API::Admin::Blocking;
+use Mojo::Base 'Mojolicious::Controller';
+use Mojo::Util qw(dumper);
+
+sub get {
+    my $c = shift;
+    my $param = $c->req->params->to_hash;
+
+    my $limit = $param->{limit} || 20;
+    my $skip = $param->{skip} || 0;
+    my $type = $param->{type};
+
+    if (!$type) {
+        $c->render(json => {error => 1, message => "no_type_given"});
+        $c->rendered(400);
+        return;
+    }
+
+    my $model_name;
+    my $url_prefix;
+    my $id_key;
+
+    if ($type eq 'story') {
+        $model_name = 'stories';
+        $url_prefix = "/story/";
+        $id_key = "sid";
+    }
+    elsif ($type eq 'journal') {
+        $model_name = 'journals';
+        $url_prefix = "/journal/";
+        $id_key = "journal_id";
+    }
+    elsif ($type eq 'submission') {
+        $model_name = 'submissions';
+        $url_prefix = "/submission/";
+        $id_key = "subid";
+    }
+    else {
+        $c->render(json => {error => 1, message => "invalid_type"});
+        $c->rendered(400);
+        return;
+    }
+
+
+    my $model = $c->app->model($model_name);
+    my $items = $model->select(public => "no",
+                               order_by => { "create_time" => "DESC" },
+                               limit => $limit,
+                               skip => $skip,
+                              );
+    if (!$items || ref($items) ne "ARRAY") {
+        $c->rendered(500);
+        return;
+    }
+
+    for my $item (@$items) {
+        $item->{url} = $url_prefix . $item->{$id_key} . "/";
+    }
+
+    $c->render(json => {type => $type, items => $items});
+    return;
+}
+
+sub post {
+    my $c = shift;
+    my $data = $c->req->json;
+    my $action = $data->{action};
+    my $type = $data->{type};
+    my $id = $data->{id};
+
+    my $message = "";
+
+    $message = "no_action_given" if !$action;
+    $message = "no_type_given" if !$type;
+    $message = "no_id_given" if !$id;
+
+    if ($message) {
+        $c->render(json => {error => 1, message => "no_action_given"});
+        $c->rendered(400);
+        return;
+    }
+
+    if ($action eq "block") {
+        return $c->_change_state($type, $id, "no");
+    }
+    elsif ($action eq "unblock") {
+        return $c->_change_state($type, $id, "yes");
+    }
+
+    $c->render(json => {error => 1, message => "invalid_action"});
+    $c->rendered(400);
+    return;
+
+}
+
+sub _change_state {
+    my ($c, $type, $id, $public) = @_;
+
+    my $model_name;
+    if ($type eq 'story') {
+        $model_name = 'stories';
+    }
+    elsif ($type eq 'journal') {
+        $model_name = 'journals';
+    }
+    elsif ($type eq 'submission') {
+        $model_name = 'submissions';
+    }
+    else {
+        $c->render(json => {error => 1, message => "invalid_type"});
+        $c->rendered(400);
+        return;
+    }
+
+    my $rs = $c->app->model($model_name)->update(id => $id,
+                                                 public => $public);
+    if (!$rs) {
+        $c->render(json => {error => 1, message => "update_failed"});
+        $c->rendered(500);
+        return;
+    }
+    $c->render(json => { type => $type, id => $id, result => $rs });
+    $c->rendered(200);
+    return 1;
+}
+
+
+
+1;
+
diff --git a/src/newslash_web/lib/Newslash/Web/Controller/API/Admin/Contents/Blocked.pm b/src/newslash_web/lib/Newslash/Web/Controller/API/Admin/Contents/Blocked.pm
deleted file mode 100644 (file)
index d552d60..0000000
+++ /dev/null
@@ -1,150 +0,0 @@
-package Newslash::Web::Controller::API::Admin::Contents::Blocked;
-use Mojo::Base 'Mojolicious::Controller';
-use Mojo::Util qw(dumper);
-
-sub get {
-    my $c = shift;
-    my $param = $c->req->params->to_hash;
-
-    my $limit = $param->{limit} || 20;
-    my $skip = $param->{skip} || 0;
-    my $type = $param->{type};
-
-    if (!$type) {
-        $c->render(json => {error => 1, message => "no_type_given"});
-        $c->rendered(400);
-        return;
-    }
-
-    my $items;
-    if ($type eq 'story') {
-        my $stories = $c->app->model('stories');
-        $items = $stories->select(public => "no",
-                                  limit => $limit,
-                                  skip => $skip,
-                               );
-    }
-    elsif ($type eq 'journal') {
-        my $journals = $c->app->model('journals');
-        $items = $journals->select(public => "no",
-                                   limit => $limit,
-                                   skip => $skip,
-                                  );
-    }
-    }
-    elsif ($type eq 'submission') {
-        my $submissions = $c->app->model('submissions');
-        $items = $submissions->select(public => "no",
-                                      order_by => { "timestamp" => "DESC" },
-                                      limit => $limit,
-                                      skip => $skip,
-                                     );
-        if (!$items || ref($items) ne "ARRAY") {
-            $c->rendered(500);
-            return;
-        }
-        for my $item (@$items) {
-            $item->{url} = "/submission/" . $item->{subid} . "/";
-        }
-    }
-    else {
-        $c->render(json => {error => 1, message => "invalid_type"});
-        $c->rendered(400);
-        return;
-    }
-
-    $c->render(json => {type => $type, items => $items});
-    return;
-}
-
-sub post {
-    my $c = shift;
-    my $data = $c->req->json;
-    my $action = $data->{action};
-    my $type = $data->{type};
-    my $id = $data->{id};
-
-    my $message = "";
-
-    $message = "no_action_given" if !$action;
-    $message = "no_type_given" if !$type;
-    $message = "no_id_given" if !$id;
-
-    if ($message) {
-        $c->render(json => {error => 1, message => "no_action_given"});
-        $c->rendered(400);
-        return;
-    }
-
-    if ($action eq "block") {
-        return $c->_block($type, $id);
-    }
-    elsif ($action eq "unblock") {
-        return $c->_unblock($type, $id);
-    }
-
-    $c->render(json => {error => 1, message => "invalid_action"});
-    $c->rendered(400);
-    return;
-
-}
-
-sub _block {
-    my ($c, $type, $id) = @_;
-
-    if ($type eq "story") {
-        my $rs = $c->app->model('stories')->update(id => id,
-                                                   public => 'no');
-        $c->render(json => { type => "story", id => $id, result => $rs });
-        $c->rendered(200);
-        return 1;
-    }
-    elsif ($type eq "jorunal") {
-        my $rs = $c->app->model('jorunals')->update(id => id,
-                                                    public => 'no');
-        $c->render(json => { type => "journal", id => $id, result => $rs });
-        $c->rendered(200);
-        return 1;
-    }
-    elsif ($type eq "submission") {
-        my $rs = $c->app->model('submissions')->update(id => id,
-                                                       public => 'no');
-        $c->render(json => { type => "submission", id => $id, result => $rs });
-        $c->rendered(200);
-        return 1;
-    }
-
-    return;
-}
-
-
-sub _unblock {
-    my ($c, $type, $id) = @_;
-
-    if ($type eq "story") {
-        my $rs = $c->app->model('stories')->update(id => id,
-                                                   public => 'yes');
-        $c->render(json => { type => "story", id => $id, result => $rs });
-        $c->rendered(200);
-        return 1;
-    }
-    elsif ($type eq "jorunal") {
-        my $rs = $c->app->model('jorunals')->update(id => id,
-                                                    public => 'yes');
-        $c->render(json => { type => "journal", id => $id, result => $rs });
-        $c->rendered(200);
-        return 1;
-    }
-    elsif ($type eq "submission") {
-        my $rs = $c->app->model('submissions')->update(id => id,
-                                                       public => 'yes');
-        $c->render(json => { type => "submission", id => $id, result => $rs });
-        $c->rendered(200);
-        return 1;
-    }
-
-    return;
-}
-
-1;
-
index 708b25a..7991da3 100644 (file)
@@ -6,15 +6,18 @@ use Mojo::Date;
 use Test::More;
 use Test::Mojo;
 use Data::Dumper;
-use Newslash::Util::Test qw(create_admin_user create_user delete_user);
+use Newslash::Util::TestMan;
 
 use POSIX qw(strftime);
-
 my $t = Test::Mojo->new('Newslash::Web');
 
+my $test_man = Newslash::Util::TestMan->new($t);
+my ($admin, $user);
+my $test_passwd = "foobar";
+
 if ($t->app->mode eq 'test') {
-#    my $user = create_user($t->app, "test01", "foobar");
-#    ok($user, "create test user");
+    $admin = $test_man->create_admin("apisubtestadmin", $test_passwd);
+    ok($admin, "create admin user");
 }
 
 subtest 'create/preview/get submission' => sub {
@@ -63,11 +66,54 @@ subtest 'create/preview/get submission' => sub {
       ->json_has('/item/submission_id');
     diag $t->tx->res->json->{message} if $t->tx->res->code != 200;
     is($t->tx->res->json->{item}->{submission_id}, $sub_id, "valid submission id");
-      #print STDERR Dumper
+
+    # login as admin
+    $t->post_ok('/login' => {Accept => '*/*'} => form => {nickname => $admin->{nickname}, passwd => $test_passwd})
+      ->status_is(302);
+
+    # get blocked items
+    $t->get_ok('/api/v1/admin/blocking?type=submission')
+      ->status_is(200)
+      ->json_has('/items');
+    my $items = $t->tx->res->json->{items};
+    ok($items, "get blocked items");
+    my $blocks = @$items;
+
+    # block submission
+    my $data = { action => "block", type => "submission", id => $sub_id };
+    $t->post_ok('/api/v1/admin/blocking' => {Accept => '*/*'} => json => $data)
+      ->status_is(200)
+      ->json_has('/id')
+      ->json_is('/type' => "submission");
+
+    # get blocked items (2)
+    $t->get_ok('/api/v1/admin/blocking?type=submission')
+      ->status_is(200)
+      ->json_has('/items');
+    $items = $t->tx->res->json->{items};
+    ok($items, "get blocked items (2)");
+    is(@$items, $blocks + 1, "number of blocked items is incremented");
+
+    # block submission
+    $data->{action} = "unblock";
+    $t->post_ok('/api/v1/admin/blocking' => {Accept => '*/*'} => json => $data)
+      ->status_is(200)
+      ->json_has('/id')
+      ->json_is('/type' => "submission");
+
+    # get blocked items (3)
+    $t->get_ok('/api/v1/admin/blocking?type=submission')
+      ->status_is(200)
+      ->json_has('/items');
+    $items = $t->tx->res->json->{items};
+    ok($items, "get blocked items (3)");
+    is(@$items, $blocks, "number of blocked items is decremented");
+
+    # delete item
+    my $submissions = $t->app->model('submissions');
+    ok($submissions->hard_delete(submission_id => $sub_id), "delete item");
 };
 
-if ($t->app->mode eq 'test') {
-#    delete_user($t->app, "test01");
-}
+$test_man->cleanup;
 
 done_testing();