OSDN Git Service

02fccbd551d8b3a3b5d45ac981b926d369da038c
[newslash/newslash.git] / src / newslash_web / lib / Newslash / Web / Controller / Search.pm
1 package Newslash::Web::Controller::Search;
2 use Mojo::Base 'Mojolicious::Controller';
3 use Mojo::UserAgent;
4
5 sub search {
6     my $c = shift;
7     my $user = $c->stash('user');
8     my $config = $c->config->{Search} || {};
9     my $host = $config->{searchd_host};
10     my $port = $config->{searchd_port};
11     my $scheme = "http";
12
13     my $query = $c->param('q');
14     my $start = $c->param('start') || 0;
15
16     my $item_per_page = 10;
17
18     if (!$query) {
19         # no query, show search top page
20         $c->render();
21         return;
22     }
23
24     # query to searchd
25     my $url = "$scheme://$host:$port/";
26     # Non-blocking request
27     my $ua  = Mojo::UserAgent->new;
28     $c->render_later;
29
30     my $req= { query => $query,
31                limit => $item_per_page,
32                offset => $start,
33              };
34     $ua->post($url => {Accept => 'application/json'} => json => $req => sub {
35                   my ($ua_, $tx) = @_;
36                   my $message = "";
37
38                  # $ua must exist when this callback is called,
39                  # so capture it
40                  if (!defined $ua) {
41                      $message = "some_error_occured";
42                      $c->render(query_words => $query,
43                                 message => $message,
44                                 error => 1,
45                                 status => 500,
46                                );
47                      $c->rendered(500);
48                      return;
49                  }
50
51                   # 3xx/4xx response
52                  if ($tx->error) {
53                      my $err = $tx->error;
54                      $c->app->log->error("searchd error: $err->{message}");
55
56                      my $code = $tx->result->code == 400 ? 400 : 500;
57
58                      my $rs = $tx->result->json;
59                      if (defined $rs && $rs->{error} && $rs->{error}->{message}) {
60                          $message = $rs->{error}->{message};
61                      }
62                      else {
63                          $message = $err->{message};
64                      }
65
66                      $c->render(query_words => $query,
67                                 message => $message,
68                                 error => 1,
69                                 status => $code,
70                                );
71                      $c->rendered($code);
72                      return;
73                  }
74
75                   my $result = $tx->result->json;
76                   if (!defined $result) {
77                       $c->app->log->error("searchd Error: receive invalid message");
78                       $message = "searchd_error";
79                       $c->render(query_words => $query,
80                                  message => $message,
81                                  error => 1,
82                                  status => 500,
83                                 );
84                       $c->rendered(500);
85                       return;
86                  }
87
88                   $c->render(query_words => $query,
89                              results => $result,
90                              message => "",
91                              error => 0,
92                              start => $start,
93                              item_per_page => $item_per_page,
94                             );
95                   $c->rendered();
96               });
97 }
98
99
100 1;
101