OSDN Git Service

implement Repositry API for admin
authorhylom <hylom@users.sourceforge.jp>
Fri, 25 Aug 2017 12:30:46 +0000 (21:30 +0900)
committerhylom <hylom@users.sourceforge.jp>
Fri, 25 Aug 2017 12:30:46 +0000 (21:30 +0900)
src/newslash_web/lib/Newslash/Web.pm
src/newslash_web/lib/Newslash/Web/Controller/API/Admin/Repository.pm [new file with mode: 0644]
src/newslash_web/t/api/feeds.t

index 155d003..4c4209b 100644 (file)
@@ -229,6 +229,8 @@ sub startup {
     $admin->get('/feed')->to('admin-feed#index');
     $admin->get('/blocking')->to('admin-blocking#index');
 
+    $admin->get('/repository/export')->to('admin-repository#export');
+
     # Admin API
     # pages under /api/v1/admin needs seclev equal or greater than 10000;
     my $admin_api = $r->under('/api/v1/admin' => sub { my $c = shift; $c->stash(seclev => 10000); return 1; });
@@ -237,6 +239,9 @@ sub startup {
     $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('/repository/export')->to('API::Admin::Repository#export');
+    $admin_api->get('/repository/import')->to('API::Admin::Repository#import');
+
     # API
     my $api = $r->under('/api/v1');
     $api->get('/sidebars')->to('admin-sidebar#list');
diff --git a/src/newslash_web/lib/Newslash/Web/Controller/API/Admin/Repository.pm b/src/newslash_web/lib/Newslash/Web/Controller/API/Admin/Repository.pm
new file mode 100644 (file)
index 0000000..a45e63c
--- /dev/null
@@ -0,0 +1,81 @@
+package Newslash::Web::Controller::API::Admin::Repository;
+use Mojo::Base 'Mojolicious::Controller';
+use Mojo::Util qw(dumper);
+
+use File::Spec;
+
+sub export {
+    my $c = shift;
+    my $param = $c->req->params->to_hash;
+
+    my $target = $param->{target};
+    my $message;
+
+    # check parameters
+    $message = "no_target_given" if !$target;
+
+    my $repo_path = $c->app->config->{Repository}->{path};
+    $message = "repository_not_configured" if !$repo_path;
+
+    if ($message) {
+        $c->render(json => {error => 1, message => $target});
+        $c->rendered(400);
+        return;
+    }
+
+
+    if ($target eq 'feeds') {
+        my $file_path = File::Spec->catfile($repo_path, "feeds.json");
+        my $rs = $c->app->model('feeds')->export_all($file_path);
+        if (!$rs) {
+            $c->render(json => { error => 1, message => "export_failed" });
+            $c->rendered(500);
+            return;
+        }
+        $c->render(json => {});
+        return;
+    }
+
+    $c->render(json => { error => 1, message => "invalid_target" });
+    $c->rendered(400);
+    return;
+}
+
+sub import {
+    my $c = shift;
+    my $param = $c->req->params->to_hash;
+
+    my $target = $param->{target};
+    my $message;
+
+    # check parameters
+    $message = "no_target_given" if !$target;
+
+    my $repo_path = $c->app->config->{Repository}->{path};
+    $message = "repository_not_configured" if !$repo_path;
+
+    if ($message) {
+        $c->render(json => {error => 1, message => $target});
+        $c->rendered(400);
+        return;
+    }
+
+    if ($target eq 'feeds') {
+        my $file_path = File::Spec->catfile($repo_path, "feeds.json");
+        my $rs = $c->app->model('feeds')->import_all($file_path);
+        if (!$rs) {
+            $c->render(json => { error => 1, message => "import_failed" });
+            $c->rendered(500);
+            return;
+        }
+        $c->render(json => {});
+        return;
+    }
+
+    $c->render(json => { error => 1, message => "invalid_target" });
+    $c->rendered(400);
+    return;
+}
+
+1;
+
index 4e1ba59..b6891e4 100644 (file)
@@ -21,7 +21,7 @@ if ($t->app->mode eq 'test') {
     ok($admin, "create admin user");
 }
 
-subtest 'create/select/update/delete feeds and items' => sub {
+subtest 'create/select/update/delete/exports feeds and items' => sub {
     plan skip_all => "mode is not 'test'" if ($t->app->mode ne 'test');
 
     my $test_title = "テストのFeed";
@@ -97,6 +97,17 @@ subtest 'create/select/update/delete feeds and items' => sub {
       ->json_is('/item/title' => "新しいタイトル")
       ->json_is('/item/description' => "新しい説明");
 
+    # export
+    unlink("/var/newslash/repository/feeds.json");
+    $t->get_ok("/api/v1/admin/repository/export?target=feeds")
+      ->status_is(200);
+    ok(-e "/var/newslash/repository/feeds.json", "feeds.json generated");
+
+    # import
+    $t->get_ok("/api/v1/admin/repository/import?target=feeds")
+      ->status_is(200);
+    unlink("/var/newslash/repository/feeds.json");
+
     # delete
     $params = { action => "delete",
                 feed_id => $feed_id