1 package Newslash::Web::Controller::API::Story;
2 use Mojo::Base 'Mojolicious::Controller';
3 use Mojo::Util qw(dumper);
4 use Mojo::JSON qw(decode_json encode_json);
6 use DateTime::Format::ISO8601;
7 use DateTime::Format::MySQL;
12 my $sid = $c->param('sid');
13 my $stoid = $c->param('stoid');
14 my $stories = $c->model('stories');
16 my $user = $c->stash('user');
19 $story = $stories->select(story_id => $stoid,
20 hide_future => !$user->{is_admin},
21 public_only => !$user->{is_admin},
25 $story = $stories->select(sid => $sid,
26 hide_future => !$user->{is_admin},
27 public_only => !$user->{is_admin},
31 $c->render(json => { error => 1, message => "invalid_request" });
36 $c->render(json => { error => 1, message => "not_found" });
40 my $related = $stories->get_related_items(stoid => $story->{stoid});
41 $story->{related} = $related;
42 $c->render(json => { item => $story });
49 my $user = $c->stash('user');
50 my $stories = $c->model('stories');
51 my $users = $c->model('users');
52 my $topics = $c->model('topics');
53 my $submissions = $c->model('submissions');
55 my $data = $c->req->json;
56 my $item = $data->{item};
59 if (!$user->{is_admin} && !$user->{editor}) {
60 $c->render(json => { err => 1, message => "no_permission" });
65 # client send data like this:
66 # {"item":{"title":"ほげ","introtext":"ほんぶん","bodytext":"","createtime":"2017-06-30T21:50:04","author":"hylom","dept":"テスト","commentstatus":"enabled","submissioncopy":0,"url":"","email":"","tags_string":"news","related_urls":"http://sdtest.osdn.co.jp:3000/story/16/01/28/0610215/"},"action":"preview"}
68 $params->{title} = $c->format_htmltext($item->{title}, "title");
69 $message = "no_title" if !$params->{title};
72 my $dt = DateTime::Format::ISO8601->parse_datetime($item->{createtime} || $item->{create_time});
74 $message = "invalid_createtime";
77 $params->{time} = DateTime::Format::MySQL->format_datetime($dt);
80 # check: is author valid ?
81 my $author = $users->select(nickname => $item->{author});
82 if (!defined $author || !$author->{is_admin}) {
83 $message = "invalid_author";
85 $params->{uid} = $author->{uid};
87 # check: dept exists ?
88 $params->{dept} = $item->{dept};
89 if (!$params->{dept}) {
90 $message = "department_not_given";
93 # check: introtext exists ?
94 my $intro_text = $item->{intro_text} || $item->{introtext} || "";
95 $params->{introtext} = $c->format_htmltext($intro_text, "story");
96 if (!$params->{introtext}) {
97 $message = "introtext_not_given";
100 # bodytext (omittable)
101 my $body_text = $item->{body_text} || $item->{bodytext} || "";
102 $params->{bodytext} = $c->format_htmltext($body_text, "story");
105 my $related_string = $item->{add_related} || $item->{related_urls} || "";
106 my @relateds = split(/\s+/, $related_string);
107 my $related_sids = [];
108 for my $related (@relateds) {
109 if ($related =~ m|^.*(\d\d/\d\d/\d\d/\d+)/|) {
110 push @$related_sids, $1;
113 $params->{add_related} = $related_sids;
116 # tags_strings is like: "mainpage japan business transport"
117 my @tags = split(/\s+/, $item->{tags_string} || "");
118 $params->{add_tags} = \@tags;
121 my $primary_topic = $topics->get_primary_topic_from_tags(\@tags);
122 if ($primary_topic) {
123 $params->{topics_chosen} = { $primary_topic->{tid} => 10 };
126 $params->{topics_chosen} = { 49 => 10, }; # tid => weight
129 # TODO: media related
133 $params->{commentstatus} = $item->{commentstatus} || $item->{comment_status} || "enabled";
134 $params->{neverdisplay} = $item->{display} ? 0 : 1;
136 $params->{action} = $data->{action} || 'preview';
138 if (length($message) > 0) {
139 $c->render(json => { err => 1, message => $message });
144 if ($data->{action} eq 'preview') {
145 $c->render(json => {item => $params});
150 if ($params->{action} ne 'post') {
151 $c->render(json => { err => 1, message => "invalid_action" });
158 if ($item->{stoid}) {
160 $params->{stoid} = $item->{stoid};
161 my $rs = $stories->update(user => $user, %$params);
162 $stoid = $rs ? $item->{stoid} : 0;
163 $sid = $rs ? $item->{sid} : 0;
167 ($sid, $stoid) = $stories->create(user => $user, %$params);
168 #$stoid = $stories->create2(user => $user,
169 # config => $c->config->{Story},
170 # params => $params);
175 if ($stories->last_errorno && $stories->last_errorno == 1062) { #ER_DUP_ENTRY
176 $c->render(json => { error => 1, message => "duplicated_entry" });
180 $c->render(json => { error => 1, message => $stories->last_error });
185 # post succeeded, return result
186 $c->render(json => {type => "story", id => $stoid, sid => $sid});
187 $c->event_que->emit("story", "post", $user->{uid}, $stoid);