1 package Newslash::Web::Controller::Timeline;
2 use Mojo::Base 'Newslash::Web::Controller';
3 use Mojo::Util qw(dumper);
6 use DateTime::Format::MySQL;
7 use Newslash::Util::Items;
9 use constant CACHE_SEC => 30;
12 my ($self, $item) = @_;
16 my $user = $self->stash('user');
17 my $offset_sec = $user->{config}->{ui}->{offset_sec} || 0;
20 $unit = "month" if $item->{content_type} eq "poll";
21 my $date = Newslash::Util::Items->get_date_string_from_item($item, $offset_sec, $unit);
24 if ($item->{content_type} eq "story") {
27 elsif ($item->{content_type} eq "journal") {
34 type => $item->{content_type},
39 my ($self, $key, $default) = @_;
40 my $config = $self->app->config->{Timeline} || {};
41 return $config->{$key} || $default;
44 sub _render_timeline {
48 my $limit = $params->{limit};
49 my $items = $params->{items};
51 # check if next page exists
53 if (@$items > $limit) {
54 my $prev_item = pop @$items;
55 $prev = $self->_make_navitem($prev_item);
58 my $page = { type => "timeline",
59 content_type => $params->{content_type},
62 $self->render("timeline/base",
71 my $user = $c->stash('user');
72 my $limit = $c->_get_config("item_per_page", 10);
74 my $show_future = $user->{is_admin} ? 1 : 0;
75 my $show_nonpublic = $user->{is_admin} ? 1 : 0;
78 if ($user->{is_login}) {
79 $stories = $c->model('stories');
82 $stories = $c->ccache->model('stories');
84 my $items = $stories->select(hide_future => !$user->{is_admin},
85 public_only => !$user->{is_admin},
87 order_by => {create_time => 'desc'},
90 $c->_render_timeline(items => $items,
91 content_type => "story",
97 my $user = $c->stash('user');
98 my $limit = $c->_get_config("item_per_page", 10);
101 if ($user->{is_login}) {
102 $timeline = $c->model('timeline');
105 $timeline = $c->ccache->model('timeline');
107 my $items = $timeline->select(limit => $limit);
109 $c->_render_timeline(items => $items,
110 content_type => "recent",
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);
121 if (!$popular_period || ref($popular_period) ne "HASH") {
122 $popular_period = {days => 3};
125 for my $k (keys %$popular_period) {
126 if ($k !~ /^(minutes|hours|days|weeks|months|years)$/) {
127 delete $popular_period->{$k};
132 if (keys %$popular_period == 0) {
133 $popular_period = {days => 3};
137 if ($user->{is_login}) {
138 $timeline = $c->model('timeline');
141 $timeline = $c->ccache->model('timeline');
143 my $items = $timeline->select(limit => $limit,
144 order_by => {popularity => "DESC"},
147 $c->_render_timeline(items => $items,
148 content_type => "popular",
155 my $user = $c->stash('user');
156 my $limit = $c->_get_config("item_per_page", 10);
159 if ($user->{is_login}) {
160 $comments = $c->model('comments');
163 $comments = $c->ccache->model('comments');
165 my $items = $comments->select(limit => $limit + 1,
166 order_by => {create_time => 'DESC'});
168 $c->_render_timeline(items => $items,
170 content_type => "comment",
177 my $user = $c->stash('user');
178 my $limit = $c->_get_config("item_per_page", 10);
181 if ($user->{is_login}) {
182 $journals = $c->model('journals');
185 $journals = $c->ccache->model('journals');
187 my $items = $journals->select(limit => $limit + 1,
188 order_by => {create_time => 'DESC'});
190 $c->_render_timeline(items => $items,
192 content_type => "journal",
198 my $user = $c->stash('user');
199 my $limit = $c->_get_config("item_per_page", 10);
202 if ($user->{is_login}) {
203 $submissions = $c->model('submissions');
206 $submissions = $c->ccache->model('submissions');
208 my $items = $submissions->select(limit => $limit + 1,
209 order_by => {create_time => 'DESC'});
211 $c->_render_timeline(items => $items,
213 content_type => "submission",
219 my $user = $c->stash('user');
220 my $limit = $c->_get_config("item_per_page", 10);
223 if ($user->{is_login}) {
224 $polls = $c->model('polls');
227 $polls = $c->ccache->model('polls');
229 my $items = $polls->select(limit => $limit + 1,
230 order_by => {create_time => 'DESC'});
232 $c->_render_timeline(items => $items,
234 content_type => "poll",