OSDN Git Service

Controller::API::Journal: fix to run
[newslash/newslash.git] / src / newslash_web / lib / Newslash / Web / Controller / API / Journal.pm
1 package Newslash::Web::Controller::API::Journal;
2 use Mojo::Base 'Mojolicious::Controller';
3 use Mojo::Util qw(dumper);
4 use Mojo::JSON qw(decode_json encode_json);
5
6 sub post {
7     my $c = shift;
8     my $params = {};
9     my $extra_params = {};
10     my $opts = {};
11
12     my $user = $c->stash('user');
13
14     my $journals = $c->model('journals');
15     my $users = $c->model('users');
16     my $util = $c->model('util');
17
18     my $allowed_tags = <<'EOT';
19 {
20   "a": ["href"],
21   "blockquote": [],
22   "i": [],
23   "strong": []
24 }
25 EOT
26     #my $allowed = decode_json($allowed_tags);
27     my $allowed = {
28                    'b' => [],
29                    'i' => [],
30                    'p' => [],
31                    'br' => [],
32                    'a' => ['href',],
33                    'ol' => ['start',],
34                    'ul' => [],
35                    'li' => [],
36                    'dl' => [],
37                    'dt' => [],
38                    'dd' => [],
39                    'em' => [],
40                    'strong' => [],
41                    'tt' => [],
42                    'blockquote' => ['title', 'cite',],
43                    'div' => [],
44                    'ecode' => [],
45                    'del' => [],
46                    'ins' => [],
47                    'sub' => [],
48                    'sup' => [],
49                    'quote' => [],
50                    'strike' => [],
51                   };
52
53     my $data = $c->req->json;
54     my $message = "";
55
56     $params->{description} = $util->escape_html({}, $data->{title});
57     $message = "no title!" if !$params->{title};
58
59     # check author is valid
60     my $author = $users->select(nickname => $data->{author});
61     if (!defined $author || !$author->{login}) {
62         $message = "invalid author";
63     }
64     $params->{uid} = $author->{uid};
65     $params->{article} = $data->{journal};
66     $params->{commentstatus} = $data->{comment_status};
67     $params->{action} = $data->{action} || 'preview';
68     $params->{posttype} = $data->{post_type};
69     $params->{tid} = $data->{tid};
70     $params->{promotype} = $data->{promotype};
71
72     # TODO: can select topics
73     #$params->{topics_chosen} = { 49 => 10, }; # tid => weight
74
75     #$extra_params->{createheaders} = $c->req->headers->to_string;
76
77     if (length($message) > 0) {
78         #warn $message;
79         $c->render(json => { err => 1, message => $message });
80         $c->rendered(400);
81         return;
82     }
83
84     if ($data->{action} eq 'preview') {
85         $data->{journal} = $util->clean_html($allowed, $params->{article});
86         $data->{title} = $params->{description};
87         $c->render(json => $data);
88         return;
89     }
90     elsif ($params->{action} eq 'post') {
91         my $journal_id = $journals->create($params, $user, $extra_params, $opts);
92         if ($journal_id) {
93             $c->render(json => {type => "journal", id => $journal_id});
94         }
95         else {
96             if ($journals->last_errorno && $journals->last_errorno == 1062) { #ER_DUP_ENTRY
97                 $c->rendered(409);
98                 return;
99             }
100             $c->render(json => { err => 1, message => $journals->last_error });
101             $c->rendered(500);
102         }
103     }
104 }
105
106 1;