1 package Newslash::Web::Controller::Timeline;
2 use Mojo::Base 'Newslash::Web::Controller';
5 use DateTime::Format::MySQL;
6 use Newslash::Util::Items;
10 use constant CACHE_SEC => 30;
13 my ($self, $item) = @_;
17 my $user = $self->stash('user');
18 my $offset_sec = $user->{config}->{ui}->{offset_sec} || 0;
21 $unit = "month" if $item->{content_type} eq "poll";
22 my $date = Newslash::Util::Items->get_date_string_from_item($item, $offset_sec, $unit);
25 if ($item->{content_type} eq "story") {
28 elsif ($item->{content_type} eq "journal") {
35 type => $item->{content_type},
40 my ($self, $key, $default) = @_;
41 my $config = $self->app->config->{Timeline} || {};
42 return $config->{$key} || $default;
45 sub _render_timeline {
49 my $limit = $params->{limit};
50 my $items = $params->{items};
52 # check if next page exists
54 if (@$items > $limit) {
55 my $prev_item = pop @$items;
56 $prev = $self->_make_navitem($prev_item);
59 my $page = { type => "timeline",
60 content_type => $params->{content_type},
63 if ($params->{content_type} eq "journal") {
64 $self->render("timeline/timeline2",
69 $self->stats->add_event_counter("timeline_view");
73 $self->render("timeline/base",
78 $self->stats->add_event_counter("timeline_view");
83 my $user = $c->stash('user');
84 my $limit = $c->_get_config("item_per_page", 10);
87 if ($user->{is_login}) {
88 $stories = $c->model('stories');
91 $stories = $c->ccache->model('stories');
93 my $items = $stories->select(hide_future => $user->{author} ? 0 : 1,
94 public_only => $user->{author} ? 0 : 1,
96 order_by => {create_time => 'desc'},
99 $c->_render_timeline(items => $items,
100 content_type => "story",
106 my $user = $c->stash('user');
107 my $limit = $c->_get_config("item_per_page", 10);
110 if ($user->{is_login}) {
111 $timeline = $c->model('timeline');
114 $timeline = $c->ccache->model('timeline');
116 my $items = $timeline->select(limit => $limit);
118 $c->_render_timeline(items => $items,
119 content_type => "recent",
126 my $user = $c->stash('user');
127 my $popular_period = $c->_get_config("popular_period");
128 my $limit = $c->_get_config("item_per_page", 10);
130 if (!$popular_period || ref($popular_period) ne "HASH") {
131 $popular_period = {days => 3};
134 for my $k (keys %$popular_period) {
135 if ($k !~ /^(minutes|hours|days|weeks|months|years)$/) {
136 delete $popular_period->{$k};
141 if (keys %$popular_period == 0) {
142 $popular_period = {days => 3};
146 if ($user->{is_login}) {
147 $timeline = $c->model('timeline');
150 $timeline = $c->ccache->model('timeline');
152 my $items = $timeline->select(limit => $limit,
153 order_by => {popularity => "DESC"},
156 $c->_render_timeline(items => $items,
157 content_type => "popular",
164 my $user = $c->stash('user');
165 my $limit = $c->_get_config("item_per_page", 10);
168 if ($user->{is_login}) {
169 $comments = $c->model('comments');
172 $comments = $c->ccache->model('comments');
174 my $items = $comments->select(limit => $limit + 1,
175 order_by => {create_time => 'DESC'});
177 $c->_render_timeline(items => $items,
179 content_type => "comment",
186 my $user = $c->stash('user');
187 my $limit = $c->_get_config("item_per_page", 10);
190 if ($user->{is_login}) {
191 $journals = $c->model('journals');
194 $journals = $c->ccache->model('journals');
196 my $items = $journals->select(limit => $limit + 1,
197 order_by => {create_time => 'DESC'});
199 $c->_render_timeline(items => $items,
201 content_type => "journal",
207 my $user = $c->stash('user');
208 my $limit = $c->_get_config("item_per_page", 10);
211 if ($user->{is_login}) {
212 $submissions = $c->model('submissions');
215 $submissions = $c->ccache->model('submissions');
217 my $items = $submissions->select(limit => $limit + 1,
218 order_by => {create_time => 'DESC'});
220 $c->_render_timeline(items => $items,
222 content_type => "submission",
228 my $user = $c->stash('user');
229 my $limit = $c->_get_config("item_per_page", 10);
232 if ($user->{is_login}) {
233 $polls = $c->model('polls');
236 $polls = $c->ccache->model('polls');
238 my $items = $polls->select(limit => $limit + 1,
239 order_by => {create_time => 'DESC'});
241 $c->_render_timeline(items => $items,
243 content_type => "poll",