The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package WWW::UsePerl::Server::Controller::Root;
use Moose;
use namespace::autoclean;

BEGIN { extends 'Catalyst::Controller' }

#
# Sets the actions in this controller to be registered with no prefix
# so they function identically to actions created in MyApp.pm
#
__PACKAGE__->config( namespace => '' );

=head1 NAME

WWW::UsePerl::Server::Controller::Root - Root Controller for WWW::UsePerl::Server

=head1 DESCRIPTION

[enter your description here]

=head1 METHODS

=head2 index

The root page (/)

=cut

sub index : Path : Args(0) {
    my ( $self, $c ) = @_;
    my $db_model = $c->model('DB');

    my $count_stories = $c->model('DB::Story')->count( {} );
    $c->stash->{count_stories} = $count_stories;
    my @stories = $c->model('DB::Story')->search(
        {},
        {   page     => 1,
            rows     => 20,
            order_by => { -desc => 'time' }
        }
    );
    $c->stash->{stories} = \@stories;

    my $count_users = $c->model('DB::User')->count( {} );
    $c->stash->{count_users} = $count_users;
    my @users = $c->model('DB::User')->search(
        {},
        {   page     => 1,
            rows     => 20,
            order_by => { -desc => 'journal_last_entry_date' }
        }
    );
    $c->stash->{users} = \@users;

    my $count_journals = $c->model('DB::Journal')->count( {} );
    $c->stash->{count_journals} = $count_journals;
    my @journals = $c->model('DB::Journal')->search(
        {},
        {   prefetch => 'user',
            page     => 1,
            rows     => 20,
            order_by => { -desc => 'date' },
        }
    );
    $c->stash->{journals} = \@journals;
}

=head2 about

About

=cut

sub about : Path('about') {
    my ( $self, $c ) = @_;
}

=head2 story entry

A story entry

=cut

sub story : Regex('^article\.pl') {
    my ( $self, $c ) = @_;
    my ($sid) = $c->request->param('sid');
    my $story
        = $c->model('DB::Story')
        ->search( { sid => $sid }, { prefetch => 'user' } )->single
        || die "Story $sid not found";
    $c->stash->{story} = $story;
    my $comments = $c->model('DB::Comment')->search(
        { stoid => $story->stoid },
        {   prefetch => 'user',
            order_by => 'sequence'
        }
    );
    $c->stash->{comments} = [ $comments->all ];
}

=head2 stories

All stories

=cut

sub stories : Path('stories') {
    my ( $self, $c ) = @_;
    my $current_page = $c->request->param('page') || 1;
    my $stories = $c->model('DB::Story')->search(
        {},
        {   page     => $current_page,
            rows     => 20,
            order_by => { -desc => 'time' }
        }
    );
    $c->stash->{stories} = [ $stories->all ];
    $self->_pageset( $c, $stories->pager );
}

=head2 author

An author

=cut

sub author : Regex('^~([^/]+)/?$') {
    my ( $self, $c ) = @_;
    my ($nickname) = @{ $c->req->captures };
    my $current_page = $c->request->param('page') || 1;
    my $user = $c->model('DB::User')->single( { nickname => $nickname } )
        || die "No user found for $nickname";
    $c->stash->{user} = $user;
    my $journals = $c->model('DB::Journal')->search(
        { uid => $user->uid },
        {   page     => $current_page,
            rows     => 20,
            order_by => { -desc => 'date' },
        }
    );
    $c->stash->{journals} = [ $journals->all ];
    $self->_pageset( $c, $journals->pager );
}

=head2 authors

All authors

=cut

sub authors : Path('authors') {
    my ( $self, $c ) = @_;
    my $current_page = $c->request->param('page') || 1;
    my $users = $c->model('DB::User')->search(
        {},
        {   page     => $current_page,
            rows     => 20,
            order_by => { -desc => 'journal_last_entry_date' }
        }
    );
    $c->stash->{users} = [ $users->all ];
    $self->_pageset( $c, $users->pager );
}

=head2 journal entry

A user's journal entry

=cut

sub journal : Regex('^~([^/]+)/journal/(\d+)$') {
    my ( $self,     $c )          = @_;
    my ( $nickname, $journal_id ) = @{ $c->req->captures };
    my $user = $c->model('DB::User')->single( { nickname => $nickname } )
        || die "No user found for $nickname";
    $c->stash->{user} = $user;
    my $journal = $c->model('DB::Journal')->single(
        {   id  => $journal_id,
            uid => $user->uid,
        }
    ) || die "Journal $journal_id not found for user $nickname";
    $c->stash->{journal} = $journal;
    my $comments = $c->model('DB::Comment')->search(
        { journal_id => $journal_id },
        {   prefetch => 'user',
            order_by => 'sequence'
        }
    );
    $c->stash->{comments} = [ $comments->all ];
}

=head2 journal entries

All journal entries

=cut

sub journals : Path('journals') {
    my ( $self, $c ) = @_;
    my $current_page = $c->request->param('page') || 1;
    my $journals = $c->model('DB::Journal')->search(
        {},
        {   prefetch => 'user',
            page     => $current_page,
            rows     => 20,
            order_by => { -desc => 'date' },
        }
    );
    $c->stash->{journals} = [ $journals->all ];
    $self->_pageset( $c, $journals->pager );
}

=head2 default

Standard 404 error page

=cut

sub default : Path {
    my ( $self, $c ) = @_;
    $c->response->body('Page not found');
    $c->response->status(404);
}

=head2 end

Attempt to render a view, if needed.

=cut

sub end : ActionClass('RenderView') {
}

sub _pageset {
    my ( $self, $c, $pager ) = @_;
    $c->stash->{pageset} = Data::Pageset->new(
        {   'total_entries'    => $pager->total_entries,
            'entries_per_page' => $pager->entries_per_page,
            'current_page'     => $pager->current_page,
            'pages_per_set'    => 10,
            'mode'             => 'slide',
        }
    );
}

=head1 AUTHOR

Leon Brocard,,,

=head1 LICENSE

This library is free software. You can redistribute it and/or modify
it under the same terms as Perl itself.

=cut

__PACKAGE__->meta->make_immutable;

1;