OSDN Git Service

Web::Controller::API::Submission: fix warnings
[newslash/newslash.git] / src / newslash_web / lib / Newslash / Web / Controller / API / Submission.pm
1 package Newslash::Web::Controller::API::Submission;
2 use Mojo::Base 'Newslash::Web::Controller';
3 #use Mojo::Base 'Mojolicious::Controller';
4 use Data::Dumper;
5 use Mojo::JSON qw(decode_json encode_json);
6 use Mojo::URL;
7 use Email::Valid;
8
9 sub get {
10     my $c = shift;
11     my $subid = $c->param('subid');
12     my $user = $c->stash('user');
13
14     if (!$subid) {
15         $c->render(json => { err => 1, message => "not_found" });
16         $c->rendered(404);
17         return;
18     }
19     my $submissions = $c->model('submissions');
20     my $submission = $submissions->select(submission_id => $subid);
21     $c->apply_seclev_filter("submissions", $submission);
22
23     if (!$submission) {
24         $c->render(json => { err => 1, message => "not_found" });
25         $c->rendered(404);
26         return;
27     }
28     $c->render(json => { item => $submission });
29     return;
30 }
31
32 sub list {
33     my $c = shift;
34     my $submissions = $c->app->model('submissions');
35     my $items = [];
36     my $message = "";
37     my $user = $c->stash('user');
38
39     my $show_deleted = 0;
40     if ($c->param('show_deleted') && $user->{is_admin}) {
41         $show_deleted = 1;
42     }
43
44     my $limit = 50;
45     my $skip = 0;
46     if ($c->param('limit')
47         && $c->param('limit') =~ m/\A[0-9]+\z/
48         && $c->param('limit') < 50) {
49         $limit = $c->param('limit');
50     }
51     if ($c->param('skip')
52         && $c->param('skip') =~ m/\A[0-9]+\z/) {
53         $skip = $c->param('skip');
54     }
55
56     $items = $submissions->select(del => $show_deleted,
57                                   order_by => {create_time => "DESC"},
58                                   limit => $limit,
59                                   skip => $skip);
60     $c->apply_seclev_filter("submissions", $items);
61
62     if (!$items) {
63         $message = $submissions->last_error;
64         $c->render(json => {message => $message, error => 1});
65     }
66     else {
67         $c->render(json => {message => $message, items => $items});
68     }
69     return;
70 }
71
72 sub post {
73     my $c = shift;
74     my $params = {};
75     my $user = $c->stash('user');
76
77     # check permission
78     if (!$user->{permissions}->{submission}) {
79         $c->render(json => { err => 1, reason => "not_allowed", message => "not_allowed" });
80         $c->rendered(403);
81         return;
82     }
83
84     my $submissions = $c->model('submissions');
85     my $util = $c->model('util');
86
87     my $allowed = $c->app->config->{Editor}->{allowed_tags};
88     my $data = $c->req->json;
89     my $item = $data->{item};
90     my $message = "";
91
92     # check body
93     if ($item->{introtext} || $item->{intro_text}) {
94         my $text = $item->{introtext} || $item->{intro_text};
95         $text =~ s/\s+\z//m;
96         $params->{introtext} = $util->clean_html($allowed, $text);
97         $params->{introtext} =~ s/\s+\z//m;
98     }
99     $message = "no_content" if (!$params->{introtext} && !$item->{url});
100
101     # check title
102     $params->{title} = $util->escape_html({}, $item->{title});
103     $message = "no_title" if !$params->{title};
104
105     # check URL
106     if ($item->{url}) {
107         my $url = Mojo::URL->new($item->{url});
108         if ($url->is_abs) {
109             $params->{url} = $item->{url};
110         }
111         else {
112             $message = "invalid_url";
113         }
114     }
115
116     # check Email
117     if ($item->{email}) {
118         if (Email::Valid->address($item->{email})) {
119             $params->{email} = $item->{email};
120         }
121         else {
122             my $url = Mojo::URL->new($item->{email});
123             if ($url->is_abs) {
124                 $params->{email} = $item->{email};
125             }
126             else {
127                 $message = "invalid_email";
128             }
129         }
130     }
131
132     $params->{action} = $data->{action} || 'preview';
133     $params->{extra_params} = { createheaders => $c->req->headers->to_string };
134
135     # parse tags
136     #$params->{tid} = 49; #mainpage
137     my $tags_string = $item->{tags_string} || "";
138     my @tags = split(/\s+/, $tags_string);
139     my $topic = $c->model('topics')->get_primary_topic_from_tags(\@tags) || {};
140     $params->{tid} = $topic->{tid} || 49;
141     $params->{tags_string} = $tags_string;
142
143
144     if ($message) {
145         $c->render(json => { err => 1, message => $message });
146         $c->rendered(400);
147         return;
148     }
149
150     if ($params->{action} eq 'preview') {
151         my $result = {
152                       title => $params->{title},
153                       introtext => $params->{introtext},
154                       email => $params->{email},
155                       topic => $topic,
156                       url => $params->{url},
157                       tid => $params->{tid},
158                      };
159         $c->render(json => {item => $result});
160     }
161     elsif ($params->{action} eq 'post') {
162         my $sub_id = $submissions->create(user => $user, %$params);
163         if ($sub_id) {
164             $c->render(json => {type => "submission", id => $sub_id});
165             $c->event_que->emit("submission", "post", $user->{uid}, $sub_id);
166         }
167         else {
168             #if ($submissions->last_errorno && $submissions->last_errorno == 1062) { #ER_DUP_ENTRY
169             if (defined $sub_id) {
170                 $c->render(json => { err => 1, reason => "duplicated_post", message => "duplicated_post" });
171                 $c->rendered(409);
172                 return;
173             }
174             $c->render(json => { err => 1, reason => "server_error", message => $submissions->last_error });
175             $c->rendered(500);
176         }
177     }
178 }
179
180 1;