OSDN Git Service

move unused (deprecated) files
[newslash/newslash.git] / src / newslash_web / lib / Newslash / Web / Controller / Timeline.pm
1 package Newslash::Web::Controller::Timeline;
2 use Mojo::Base 'Newslash::Web::Controller';
3 use Mojo::Util qw(dumper);
4
5 use DateTime;
6 use DateTime::Format::MySQL;
7 use Newslash::Util::Items;
8
9 use constant CACHE_SEC => 30;
10
11 sub _make_navitem {
12     my ($self, $item) = @_;
13     return if !$item;
14
15     # consider timezone
16     my $user = $self->stash('user');
17     my $offset_sec = $user->{config}->{ui}->{offset_sec} || 0;
18
19     my $unit = "day";
20     $unit = "month" if $item->{content_type} eq "poll";
21     my $date = Newslash::Util::Items->get_date_string_from_item($item, $offset_sec, $unit);
22
23     my $id;
24     if ($item->{content_type} eq "story") {
25         $id = $item->{stoid};
26     }
27     elsif ($item->{content_type} eq "journal") {
28         $id = $item->{id};
29     }
30
31     return {
32             date => $date,
33             id => $id,
34             type => $item->{content_type},
35            };
36 }
37
38 sub _get_config {
39     my ($self, $key, $default) = @_;
40     my $config = $self->app->config->{Timeline} || {};
41     return $config->{$key} || $default;
42 }
43
44 sub _render_timeline {
45     my $self = shift;
46     my $params = {@_};
47
48     my $limit = $params->{limit};
49     my $items = $params->{items};
50
51     # check if next page exists
52     my $prev;
53     if (@$items > $limit) {
54         my $prev_item = pop @$items;
55         $prev = $self->_make_navitem($prev_item);
56     }
57
58     my $page = { type => "timeline",
59                  content_type => $params->{content_type},
60                 };
61
62     $self->render("timeline/base",
63                   items => $items,
64                   prev => $prev,
65                   page => $page,
66                  );
67 }
68
69 sub stories {
70     my $c = shift;
71     my $user = $c->stash('user');
72     my $limit = $c->_get_config("item_per_page", 10);
73
74     my $show_future = $user->{is_admin} ? 1 : 0;
75     my $show_nonpublic = $user->{is_admin} ? 1 : 0;
76
77     my $stories;
78     if ($user->{is_login}) {
79         $stories = $c->model('stories');
80     }
81     else {
82         $stories = $c->ccache->model('stories');
83     }
84     my $items = $stories->select(hide_future => !$user->{is_admin},
85                                  public_only => !$user->{is_admin},
86                                  limit => $limit + 1,
87                                  order_by => {create_time => 'desc'},
88                                 );
89
90     $c->_render_timeline(items => $items,
91                          content_type => "story",
92                          limit => $limit);
93 }
94
95 sub recent {
96     my $c = shift;
97     my $user = $c->stash('user');
98     my $limit = $c->_get_config("item_per_page", 10);
99
100     my $timeline;
101     if ($user->{is_login}) {
102         $timeline = $c->model('timeline');
103     }
104     else {
105         $timeline = $c->ccache->model('timeline');
106     }
107     my $items = $timeline->select(limit => $limit);
108
109     $c->_render_timeline(items => $items,
110                          content_type => "recent",
111                          limit => $limit,
112                         );
113 };
114
115 sub popular {
116     my $c = shift;
117     my $user = $c->stash('user');
118     my $popular_period = $c->_get_config("popular_period");
119     my $limit = $c->_get_config("item_per_page", 10);
120
121     if (!$popular_period || ref($popular_period) ne "HASH") {
122         $popular_period = {days => 3};
123     }
124
125     for my $k (keys %$popular_period) {
126         if ($k !~ /^(minutes|hours|days|weeks|months|years)$/) {
127             delete $popular_period->{$k};
128         }
129     }
130
131     # fallback
132     if (keys %$popular_period == 0) {
133         $popular_period = {days => 3};
134     }
135
136     my $timeline;
137     if ($user->{is_login}) {
138         $timeline = $c->model('timeline');
139     }
140     else {
141         $timeline = $c->ccache->model('timeline');
142     }
143     my $items = $timeline->select(limit => $limit,
144                                   order_by => {popularity => "DESC"},
145                                   %$popular_period);
146
147     $c->_render_timeline(items => $items,
148                          content_type => "popular",
149                          limit => $limit,
150                         );
151 }
152
153 sub comments {
154     my $c = shift;
155     my $user = $c->stash('user');
156     my $limit = $c->_get_config("item_per_page", 10);
157
158     my $comments;
159     if ($user->{is_login}) {
160         $comments = $c->model('comments');
161     }
162     else {
163         $comments = $c->ccache->model('comments');
164     }
165     my $items = $comments->select(limit => $limit + 1,
166                                   order_by => {create_time => 'DESC'});
167
168     $c->_render_timeline(items => $items,
169                          limit => $limit,
170                          content_type => "comment",
171                         );
172 }
173
174
175 sub journals {
176     my $c = shift;
177     my $user = $c->stash('user');
178     my $limit = $c->_get_config("item_per_page", 10);
179
180     my $journals;
181     if ($user->{is_login}) {
182         $journals = $c->model('journals');
183     }
184     else {
185         $journals = $c->ccache->model('journals');
186     }
187     my $items = $journals->select(limit => $limit + 1,
188                                   order_by => {create_time => 'DESC'});
189
190     $c->_render_timeline(items => $items,
191                          limit => $limit,
192                          content_type => "journal",
193                         );
194 }
195
196 sub submissions {
197     my $c = shift;
198     my $user = $c->stash('user');
199     my $limit = $c->_get_config("item_per_page", 10);
200
201     my $submissions;
202     if ($user->{is_login}) {
203         $submissions = $c->model('submissions');
204     }
205     else {
206         $submissions = $c->ccache->model('submissions');
207     }
208     my $items = $submissions->select(limit => $limit + 1,
209                                      order_by => {create_time => 'DESC'});
210
211     $c->_render_timeline(items => $items,
212                          limit => $limit,
213                          content_type => "submission",
214                         );
215 }
216
217 sub polls {
218     my $c = shift;
219     my $user = $c->stash('user');
220     my $limit = $c->_get_config("item_per_page", 10);
221
222     my $polls;
223     if ($user->{is_login}) {
224         $polls = $c->model('polls');
225     }
226     else {
227         $polls = $c->ccache->model('polls');
228     }
229     my $items = $polls->select(limit => $limit + 1,
230                                order_by => {create_time => 'DESC'});
231
232     $c->_render_timeline(items => $items,
233                          limit => $limit,
234                          content_type => "poll",
235                         );
236 }
237
238 1;
239