OSDN Git Service

fix and inregrate text formatting functions
[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
86     my $data = $c->req->json;
87     my $item = $data->{item};
88     my $message = "";
89
90     # check body
91     if ($item->{introtext} || $item->{intro_text}) {
92         my $text = $item->{introtext} || $item->{intro_text};
93         $text =~ s/\s+\z//m;
94         $params->{introtext} = $c->clean_html($text, "submission");
95         $params->{introtext} =~ s/\s+\z//m;
96     }
97     else {
98         $params->{introtext} = "";
99     }
100     $message = "no_content" if (!$params->{introtext} && !$item->{url});
101
102     # check title
103     $params->{title} = $c->escape_title($item->{title});
104     $message = "no_title" if !$params->{title};
105
106     # check URL
107     if ($item->{url}) {
108         my $url = Mojo::URL->new($item->{url});
109         if ($url->is_abs) {
110             $params->{url} = $item->{url};
111             my $footer = $c->tt2renderer->render("system/submission/footer", {url => $item->{url}});
112             $params->{introtext} = $params->{introtext} . $footer;
113         }
114         else {
115             $message = "invalid_url";
116         }
117     }
118
119     # check Email
120     if ($item->{email}) {
121         if (Email::Valid->address($item->{email})) {
122             $params->{email} = $item->{email};
123         }
124         else {
125             my $url = Mojo::URL->new($item->{email});
126             if ($url->is_abs) {
127                 $params->{email} = $item->{email};
128             }
129             else {
130                 $message = "invalid_email";
131             }
132         }
133     }
134
135     $params->{action} = $data->{action} || 'preview';
136     $params->{extra_params} = { createheaders => $c->req->headers->to_string };
137
138     # parse tags
139     #$params->{tid} = 49; #mainpage
140     my $tags_string = $item->{tags_string} || "";
141     my @tags = split(/\s+/, $tags_string);
142     my $topic = $c->model('topics')->get_primary_topic_from_tags(\@tags) || {};
143     $params->{tid} = $topic->{tid} || 49;
144     $params->{tags_string} = $tags_string;
145
146
147     if ($message) {
148         $c->render(json => { err => 1, message => $message });
149         $c->rendered(400);
150         return;
151     }
152
153     if ($params->{action} eq 'preview') {
154         my $result = {
155                       title => $params->{title},
156                       introtext => $params->{introtext},
157                       email => $params->{email},
158                       topic => $topic,
159                       url => $params->{url},
160                       tid => $params->{tid},
161                      };
162         $c->render(json => {item => $result});
163     }
164     elsif ($params->{action} eq 'post') {
165         my $sub_id = $submissions->create(user => $user, %$params);
166         if ($sub_id) {
167             $c->render(json => {type => "submission", id => $sub_id});
168             $c->event_que->emit("submission", "post", $user->{uid}, $sub_id);
169         }
170         else {
171             #if ($submissions->last_errorno && $submissions->last_errorno == 1062) { #ER_DUP_ENTRY
172             if (defined $sub_id) {
173                 $c->render(json => { err => 1, reason => "duplicated_post", message => "duplicated_post" });
174                 $c->rendered(409);
175                 return;
176             }
177             $c->render(json => { err => 1, reason => "server_error", message => $submissions->last_error });
178             $c->rendered(500);
179         }
180     }
181 }
182
183 1;