OSDN Git Service

Web: implement journal creation
authorhylom <hylom@users.sourceforge.jp>
Tue, 1 Nov 2016 11:28:26 +0000 (20:28 +0900)
committerhylom <hylom@users.sourceforge.jp>
Tue, 1 Nov 2016 11:28:55 +0000 (20:28 +0900)
src/newslash_web/lib/Newslash/Web.pm
src/newslash_web/lib/Newslash/Web/Controller/API/Journal.pm [new file with mode: 0644]
src/newslash_web/lib/Newslash/Web/Controller/Journal.pm
src/newslash_web/templates/journal/create.html.tt2 [new file with mode: 0644]

index 966db7a..bb57308 100644 (file)
@@ -85,6 +85,7 @@ sub startup {
     my $api = $r->under('/api/v1');
     $api->post('/submission')->to('API::Submission#post');
     $api->post('/story')->to('API::Story#post');
+    $api->post('/journal')->to('API::Journal#post');
     $api->post('/comment')->to('API::Comment#post');
     $api->get('/comment')->to('API::Comment#get');
 }
diff --git a/src/newslash_web/lib/Newslash/Web/Controller/API/Journal.pm b/src/newslash_web/lib/Newslash/Web/Controller/API/Journal.pm
new file mode 100644 (file)
index 0000000..2fa7358
--- /dev/null
@@ -0,0 +1,87 @@
+package Newslash::Web::Controller::API::Journal;
+use Mojo::Base 'Mojolicious::Controller';
+use Mojo::Util qw(dumper);
+use Mojo::JSON qw(decode_json encode_json);
+
+sub post {
+    my $c = shift;
+    my $params = {};
+    my $extra_params = {};
+    my $opts = {};
+
+    my $user = $c->stash('user');
+
+    my $journals = $c->model('journals');
+    my $users = $c->model('users');
+    my $util = $c->model('util');
+
+    my $allowed_tags = <<'EOT';
+{
+  "a": ["href"],
+  "blockquote": [],
+  "i": [],
+  "strong": []
+}
+EOT
+
+    my $allowed = decode_json($allowed_tags);
+    my $data = $c->req->json;
+    my $message = "";
+
+    $params->{title} = $util->escape_html({}, $data->{title});
+    $message = "no title!" if !$params->{title};
+
+    $params->{time} = $data->{createtime};
+
+    # check author is valid
+    my $author = $users->select(nickname => $data->{author});
+    if (!defined $author || !$author->{admin}) {
+        $message = "invalid author";
+    }
+    $params->{uid} = $author->{uid};
+
+    $params->{dept} = $data->{dept};
+    $params->{introtext} = $util->clean_html($allowed, $data->{introtext});
+    $params->{bodytext} = $util->clean_html($allowed, $data->{bodytext});
+    #$data->{add_related};
+    #$data->{mediaurl};
+    #$data->{mediatype};
+    $params->{commentstatus} = $data->{commentstatus};
+    $params->{neverdisplay} = $data->{display} ? 0 : 1;
+
+    $params->{action} = $data->{action} || 'preview';
+
+    # TODO: can select topics
+    $params->{topics_chosen} = { 49 => 10, }; # tid => weight
+
+    #$extra_params->{createheaders} = $c->req->headers->to_string;
+
+    if (length($message) > 0) {
+        $c->render(json => { err => 1, message => $message });
+        $c->rendered(400);
+        return;
+    }
+
+    if ($data->{action} eq 'preview') {
+        $data->{introtext} = $params->{introtext};
+        $data->{title} = $params->{title};
+        $c->render(json => $data);
+        return;
+    }
+    elsif ($params->{action} eq 'post') {
+        # my $sid = $stories->create($params, $user, $extra_params, $opts);
+        # if ($sid) {
+        #     $c->render(json => {type => "story", id => $sid});
+        # }
+        # else {
+        #     if ($stories->last_errorno && $stories->last_errorno == 1062) { #ER_DUP_ENTRY
+        #         $c->rendered(409);
+        #         return;
+        #     }
+        #     $c->render(json => { err => 1, message => $stories->last_error });
+        #     $c->rendered(500);
+        # }
+    }
+}
+
+1;
index 3b1643a..759eef5 100644 (file)
@@ -42,6 +42,9 @@ sub user_journals {
 }
 
 sub create {
+    my $c = shift;
+    $c->render();
+    return;
 }
 
 
diff --git a/src/newslash_web/templates/journal/create.html.tt2 b/src/newslash_web/templates/journal/create.html.tt2
new file mode 100644 (file)
index 0000000..136cac5
--- /dev/null
@@ -0,0 +1,76 @@
+[% WRAPPER common/layout sidebar=1 vue=1%]
+<div class="main-column">
+  <div class="post submission main-contents">
+    <div id="post-editor">
+      <h2>日記の編集</h2>
+      <div id="post-preview">
+        <div v-html="message" class="message"></div>
+        <h3>プレビュー:</h3>
+        [%-
+        story.title = "";
+        story.content_type = "journal";
+        story.author = user.nickname;
+        story.time = "";
+        story.introtext = "";
+        story.preview = 1;
+        story.commentcount = 0;
+        -%]
+        [%- INCLUDE common/article hide_more_link=1 -%]
+      </div>
+
+      <form id="post-submission" v-show="show_form">
+        <p class="form-group">
+          <label for="post-title">タイトル:</label>
+          <input id="post-title" type="text" class="form-control" name="title" v-model="title" placeholder="タイトル" />
+        </p>
+        <p class="form-group">
+          <label for="post-introtext">本文:</label>
+          <textarea id="post-introtext" name="introtext" class="form-control" v-model="introtext" placeholder="本文をここに記述してください" ></textarea>
+        </p>
+        <div class="form-inline">
+          <p class="form-group">
+            <label for="post-commentstatus">コメント設定:</label>
+            <select id="post-commentstatus" class="form-control" name="commentstatus" v-model="commentstatus">
+              <option value="disabled">コメント無効</option>
+              <option value="enabled" selected="selected">コメント有効</option>
+              <option value="friends_fof_only">トモダチとそのトモダチ</option>
+              <option value="friends_only">トモダチのみ</option>
+              <option value="logged_in">ログインユーザのみ</option>
+              <option value="no_foe">テキじゃないみんな</option>
+              <option value="no_foe_eof">テキとトモダチのテキ以外</option>
+            </select>
+          </p>
+          <p class="checkbox">
+            <label>
+              <input type="checkbox" id="post-submissioncopy" name="submissioncopy" v-model="submissioncopy" value="1" />
+              日記のコピーをタレコミとして投稿する
+            </label>
+          </p>
+        </div>
+        <p>
+          <button type="submit" class="btn btn-default" v-on:click.prevent="show_preview">投稿確認</button>
+          <button type="reset" class="btn">リセット</button>
+        </p>
+      </form>
+
+      <form id="post-submit" v-show="show_submit">
+        <p>
+          <button type="submit" class="btn btn-default" v-on:click.prevent="post_submission">投稿</button>
+          <button type="button" class="btn" v-on:click="leave_preview">戻る</button>
+        </p>
+      </form>
+      
+    </div><!-- #post-form -->
+
+  </div>
+</div>
+[%- INCLUDE common/sidebar -%]
+
+<script src="/js/editor.js" ></script>
+<script>
+  $(document).ready(function () {
+    editor.run({ type: 'journal', el: '#post-editor', author: '[% user.nickname %]', });
+  });
+</script>
+
+[% END %]