$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; });
$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');
--- /dev/null
+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;
+
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";
->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