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

use strict;
use warnings;
our $VERSION = '1.001000';
use parent 'Catalyst::Controller';
use Foorum::Utils qw/get_page_from_url/;

sub auto : Private {
    my ( $self, $c ) = @_;

    # only administrator is allowed. site moderator is not allowed here
    unless ( $c->model('Policy')->is_admin( $c, 'site' ) ) {
        $c->forward( '/print_error', ['ERROR_PERMISSION_DENIED'] );
        return 0;
    }
    return 1;
}

sub default : Private {
    my ( $self, $c ) = @_;

    my $page = get_page_from_url( $c->req->path );
    my $rs   = $c->model('DBIC::User')->search(
        {},
        {   order_by => 'user_id',
            page     => $page,
            rows     => 20,
        }
    );

    $c->stash(
        {   template => 'admin/user/index.html',
            users    => [ $rs->all ],
            pager    => $rs->pager,
        }
    );
}

sub edit : Local {
    my ( $self, $c ) = @_;

    $c->stash->{template} = 'admin/user/edit.html';

    my $user_id  = $c->req->param('user_id');
    my $username = $c->req->param('username');
    my $email    = $c->req->param('email');
    my @query_cols;
    if ($user_id) {
        @query_cols = ( 'user_id', $user_id );
    } elsif ($username) {
        @query_cols = ( 'username', $username );
    } elsif ($email) {
        @query_cols = ( 'email', $email );
    } else {
        return;
    }
    my $user = $c->model('DBIC::User')->get( {@query_cols} );
    return $c->stash->{error} = 'NO_RECORD' unless ($user);

    unless ( $c->req->method eq 'POST' ) {
        return $c->stash->{user} = $user;
    } else {
        my @columns = $c->model('DBIC::User')->result_source->columns;
        my @update_cols;
        my $query = $c->req->params;
        foreach my $key ( keys %$query ) {

            # DONOT update the user_id here
            next if ( 'user_id' eq $key );

            # user has this column
            if ( grep { $_ eq $key } @columns ) {
                if ( 'username' eq $key ) {

                    # validate username
                    my $ERROR_USERNAME = $c->model('DBIC::User')
                        ->validate_username( $query->{username} );
                    next if ($ERROR_USERNAME);
                } elsif ( 'email' eq $key ) {

                    # validate email
                    my $err = $c->model('DBIC::User')->validate_email($email);
                    next if ($err);
                } elsif ( 'status' eq $key
                    and $user->{status} ne $query->{status} ) {
                    $c->model('Log')->log_action(
                        $c,
                        {   action      => 'ban',
                            object_type => 'user',
                            object_id   => $user->{user_id},
                            forum_id    => 0,
                            text        => 'From '
                                . $user->{status} . ' To '
                                . $query->{status},
                        }
                    );
                }

                push @update_cols, ( $key, $query->{$key} );
            }
        }
        $c->model('DBIC::User')->update_user( $user, {@update_cols} );

        # update session
        if ( $c->user->user_id == $c->req->param('user_id') ) {
            $c->session->{__user} = $c->req->param('username');
        }
        return $c->res->redirect('/admin?st=1');
    }
}

sub ban : Local {
    my ( $self, $c ) = @_;

    my $username = $c->req->param('username');
    my $user = $c->controller('Get')->user( $c, $username );

    if ( $user->{status} eq 'banned' ) {
        $c->detach( '/print_error', ['Already banned'] );
    }

    $c->model('DBIC::User')->update_user( $user, { status => 'banned' } );

    $c->model('Log')->log_action(
        $c,
        {   action      => 'ban',
            object_type => 'user',
            object_id   => $user->{user_id},
            forum_id    => 0,
            text        => $c->req->referer || 'unknown',
        }
    );

    $c->res->redirect("/u/$username");
}

1;
__END__

=pod

=head1 AUTHOR

Fayland Lam <fayland at gmail.com>

=cut