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');
--- /dev/null
+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;
+
+++ /dev/null
-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;
-
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 {
->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();