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 =cut