The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Foorum::Controller::TopicAction;

use strict;
use warnings;
our $VERSION = '1.001000';
use parent 'Catalyst::Controller';

sub lock_or_sticky_or_elite :
    Regex('^forum/(\w+)/topic/(\d+)/(un)?(sticky|elite|lock)$') {
    my ( $self, $c ) = @_;

    my $forum_code = $c->req->snippets->[0];
    my $forum      = $c->controller('Get')->forum( $c, $forum_code );
    my $forum_id   = $forum->{forum_id};
    $forum_code = $forum->{forum_code};
    my $topic_id = $c->req->snippets->[1];
    my $is_un    = $c->req->snippets->[2];
    my $action   = $c->req->snippets->[3];

    my $topic = $c->controller('Get')
        ->topic( $c, $topic_id, { forum_id => $forum_id } );

    # check policy
    unless ( $c->model('Policy')->is_moderator( $c, $forum_id )
        or ( 'lock' eq $action and $topic->{author_id} == $c->user->user_id )
        ) {
        $c->detach( '/print_error', ['ERROR_PERMISSION_DENIED'] );
    }

    my $status = ($is_un) ? '0' : '1';

    my $update_col;
    if ( 'sticky' eq $action ) {
        $update_col = 'sticky';
    } elsif ( 'lock' eq $action ) {
        $update_col = 'closed';
    } elsif ( 'elite' eq $action ) {
        $update_col = 'elite';
    }

    $c->model('DBIC::Topic')
        ->update_topic( $topic_id, { $update_col => $status, } );

    $c->model('Log')->log_action(
        $c,
        {   action      => "$is_un$action",
            object_type => 'topic',
            object_id   => $topic_id,
            forum_id    => $forum_id,
            text        => $topic->{title}
        }
    );

    if ( 'elite' eq $action ) {

        # for point
        my $plus_point = ($is_un) ? '- 4' : '+ 4';
        my $user = $c->model('DBIC')->resultset('User')
            ->get( { user_id => $topic->{author_id} } );
        $c->model('DBIC')->resultset('User')->update_user(
            $user,
            {   point => \"point $plus_point",    #"
            }
        );
    }

    my $url = $c->req->referer || $forum->{forum_url};
    $c->res->redirect("$url?st=1");
}

sub ban_or_unban_topic : Regex('^forum/(\w+)/topic/(\d+)/(un)?ban$') {
    my ( $self, $c ) = @_;

    my $forum_code = $c->req->snippets->[0];
    my $forum      = $c->controller('Get')->forum( $c, $forum_code );
    my $forum_id   = $forum->{forum_id};
    $forum_code = $forum->{forum_code};
    my $topic_id = $c->req->snippets->[1];
    my $is_un    = $c->req->snippets->[2];

    my $topic = $c->controller('Get')
        ->topic( $c, $topic_id, { forum_id => $forum_id } );

    # check policy
    unless ( $c->model('Policy')->is_moderator( $c, $forum_id ) ) {
        $c->detach( '/print_error', ['ERROR_PERMISSION_DENIED'] );
    }

    if ($is_un) {
        $c->model('DBIC::Topic')
            ->update_topic( $topic_id, { status => 'healthy' } );
    } else {
        $c->model('DBIC::Topic')
            ->update_topic( $topic_id, { status => 'banned' } );
    }

    my $url = $c->req->referer || $forum->{forum_url};
    $c->res->redirect("$url?st=1");
}

1;
__END__

=pod

=head1 AUTHOR

Fayland Lam <fayland at gmail.com>

=cut