OSDN Git Service

fix text format-related functions
[newslash/newslash.git] / src / newslash_web / lib / Newslash / Web / Controller / API / Story.pm
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);
5
6 use DateTime::Format::ISO8601;
7 use DateTime::Format::MySQL;
8 use Data::Dumper;
9
10 sub get {
11     my $c = shift;
12     my $sid = $c->param('sid');
13     my $stoid = $c->param('stoid');
14     my $stories = $c->model('stories');
15     my $story;
16     my $user = $c->stash('user');
17
18     if ($stoid) {
19         $story = $stories->select(story_id => $stoid,
20                                   hide_future => !$user->{is_admin},
21                                   public_only => !$user->{is_admin},
22                                  );
23     }
24     elsif ($sid) {
25         $story = $stories->select(sid => $sid,
26                                   hide_future => !$user->{is_admin},
27                                   public_only => !$user->{is_admin},
28                                  );
29     }
30     else {
31         $c->render(json => { error => 1, message => "invalid_request" });
32         $c->rendered(400);
33         return;
34     }
35     if (!$story) {
36         $c->render(json => { error => 1, message => "not_found" });
37         $c->rendered(404);
38         return;
39     }
40     my $related = $stories->get_related_items(stoid => $story->{stoid});
41     $story->{related} = $related;
42     $c->render(json => { item => $story });
43 }
44
45 sub post {
46     my $c = shift;
47     my $params = {};
48
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');
54
55     my $data = $c->req->json;
56     my $item = $data->{item};
57     my $message = "";
58
59     if (!$user->{is_admin} && !$user->{editor}) {
60         $c->render(json => { err => 1, message => "no_permission" });
61         $c->rendered(403);
62         return;
63     }
64
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"}
67
68     $params->{title} = $c->format_htmltext($item->{title}, "title");
69     $message = "no_title" if !$params->{title};
70
71     # convert time
72     my $dt = DateTime::Format::ISO8601->parse_datetime($item->{createtime} || $item->{create_time});
73     if (!$dt) {
74         $message = "invalid_createtime";
75     }
76     else {
77         $params->{time} = DateTime::Format::MySQL->format_datetime($dt);
78     }
79
80     # check: is author valid ?
81     my $author = $users->select(nickname => $item->{author});
82     if (!defined $author || !$author->{is_admin}) {
83         $message = "invalid_author";
84     }
85     $params->{uid} = $author->{uid};
86
87     # check: dept exists ?
88     $params->{dept} = $item->{dept};
89     if (!$params->{dept}) {
90         $message = "department_not_given";
91     }
92
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";
98     }
99
100     # bodytext (omittable)
101     my $body_text = $item->{body_text} || $item->{bodytext} || "";
102     $params->{bodytext} = $c->format_htmltext($body_text, "story");
103
104     # related urls
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;
111         }
112     }
113     $params->{add_related} = $related_sids;
114
115     # tags
116     # tags_strings is like: "mainpage japan business transport"
117     my @tags = split(/\s+/, $item->{tags_string} || "");
118     $params->{add_tags} = \@tags;
119
120     # add topics
121     my $primary_topic = $topics->get_primary_topic_from_tags(\@tags);
122     if ($primary_topic) {
123         $params->{topics_chosen} = { $primary_topic->{tid} => 10 };
124     }
125     else {
126         $params->{topics_chosen} = { 49 => 10, }; # tid => weight
127     }
128
129     # TODO: media related
130     #$item->{mediaurl};
131     #$item->{mediatype};
132
133     $params->{commentstatus} = $item->{commentstatus} || $item->{comment_status} || "enabled";
134     $params->{neverdisplay} = $item->{display} ? 0 : 1;
135
136     $params->{action} = $data->{action} || 'preview';
137
138     if (length($message) > 0) {
139         $c->render(json => { err => 1, message => $message });
140         $c->rendered(400);
141         return;
142     }
143
144     if ($data->{action} eq 'preview') {
145         $c->render(json => {item => $params});
146         return;
147     }
148
149     # invalid action
150     if ($params->{action} ne 'post') {
151         $c->render(json => { err => 1, message => "invalid_action" });
152         $c->rendered(400);
153         return;
154     }
155
156     # post action
157     my ($sid, $stoid);
158     if ($item->{stoid}) {
159         # update story
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;
164     }
165     else {
166         # create story
167         ($sid, $stoid) = $stories->create(user => $user, %$params);
168         #$stoid = $stories->create2(user => $user,
169         #                           config => $c->config->{Story},
170         #                           params => $params);
171     }
172
173     # error check
174     if (!$stoid) {
175         if ($stories->last_errorno && $stories->last_errorno == 1062) { #ER_DUP_ENTRY
176             $c->render(json => { error => 1, message => "duplicated_entry" });
177             $c->rendered(409);
178             return;
179         }
180         $c->render(json => { error => 1, message => $stories->last_error });
181         $c->rendered(500);
182         return;
183     }
184
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);
188     return;
189 }
190
191 1;