package Foorum::Controller::Message; 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 ) = @_; unless ( $c->user_exists ) { $c->res->redirect('/login'); return 0; } return 1; } sub default : Local { my ( $self, $c ) = @_; $c->forward('inbox'); } sub compose : Local { my ( $self, $c ) = @_; $c->stash->{template} = 'message/compose.html'; return unless ( $c->req->method eq 'POST' ); # cann't compose to yourself my $to = $c->req->param('to'); if ( $to eq $c->user->username ) { $c->set_invalid_form( to => 'USER_THESAME' ); return; } # execute validation. $c->form( to => [ qw/NOT_BLANK ASCII/, [qw/LENGTH 4 20/] ], title => [ qw/NOT_BLANK/, [qw/LENGTH 1 80/] ], text => [qw/NOT_BLANK/], ); return if ( $c->form->has_error ); # check user exist my $rept = $c->model('DBIC::User')->get( { username => $to } ); unless ($rept) { $c->set_invalid_form( to => 'USER_NONEXIST' ); return; } my $message = $c->model('DBIC')->resultset('Message')->create( { from_id => $c->user->user_id, to_id => $rept->{user_id}, title => $c->req->param('title'), text => $c->req->param('text'), post_on => time(), post_ip => $c->req->address, from_status => 'open', to_status => 'open', } ); # add unread $c->model('DBIC')->resultset('MessageUnread')->create( { message_id => $message->message_id, user_id => $rept->{user_id}, } ); $c->cache->remove( 'global|message_unread_cnt|user_id=' . $rept->{user_id} ); # Send Notification Email $c->model('DBIC::ScheduledEmail')->create_email( { template => 'new_message', to => $rept->{email}, lang => $c->stash->{lang}, stash => { rept => $rept, from => $c->user, message => $message, } } ); $c->res->redirect('/message/outbox'); } sub inbox : Local { my ( $self, $c ) = @_; my $page = get_page_from_url( $c->req->path ); my $it = $c->model('DBIC')->resultset('Message')->search( { to_id => $c->user->user_id, to_status => 'open', }, { columns => [ 'message_id', 'title', 'post_on', ], prefetch => ['sender'], order_by => \'post_on DESC', rows => $c->config->{per_page}->{message}, page => $page, } ); my @messages = $it->all; $c->stash->{messages} = \@messages; $c->stash->{pager} = $it->pager; my @all_message_ids; push @all_message_ids, $_->message_id foreach (@messages); $c->stash->{unread} = $c->model('DBIC::Message') ->are_messages_unread( $c->user->user_id, \@all_message_ids ) if ( scalar @all_message_ids ); $c->stash->{template} = 'message/inbox.html'; } sub outbox : Local { my ( $self, $c ) = @_; my $page = get_page_from_url( $c->req->path ); my $it = $c->model('DBIC')->resultset('Message')->search( { from_id => $c->user->user_id, from_status => 'open', }, { columns => [ 'message_id', 'title', 'post_on', ], prefetch => ['recipient'], order_by => \'post_on DESC', rows => $c->config->{per_page}->{message}, page => $page, } ); my @messages = $it->all; $c->stash->{messages} = \@messages; $c->stash->{pager} = $it->pager; $c->stash->{template} = 'message/outbox.html'; } sub message : LocalRegex('^(\d+)$') { my ( $self, $c ) = @_; my $message_id = $c->req->snippets->[0]; my $message = $c->model('DBIC')->resultset('Message') ->find( { message_id => $message_id, }, { prefetch => [ 'sender', 'recipient' ], } ); $c->stash->{message} = $message; # permission check if ( $c->user->{user_id} != $message->from_id and $c->user->{user_id} != $message->to_id ) { $c->detach( '/print_error', ['ERROR_PERMISSION_DENIED'] ); } # mark as read $c->model('DBIC')->resultset('MessageUnread')->search( { message_id => $message_id, user_id => $c->user->user_id, } )->delete; $c->cache->remove( 'global|message_unread_cnt|user_id=' . $c->user->{user_id} ); $c->stash->{template} = 'message/message.html'; } sub delete : LocalRegex('^(\d+)/delete$') { my ( $self, $c ) = @_; my $message_id = $c->req->snippets->[0]; my $message = $c->model('DBIC')->resultset('Message') ->find( { message_id => $message_id, } ); # permission check if ( $c->user->{user_id} != $message->from_id and $c->user->{user_id} != $message->to_id ) { $c->detach( '/print_error', ['ERROR_PERMISSION_DENIED'] ); } # mark as read $c->model('DBIC')->resultset('MessageUnread')->search( { message_id => $message_id, user_id => $c->user->user_id, } )->delete; $c->cache->remove( 'global|message_unread_cnt|user_id=' . $c->user->{user_id} ); # both inbox and outbox. # we set 'from_status' as 'deleted' when from_id delete it # we set 'to_status' as 'deleted' when to_id delete it # if both 'from_status' and 'to_status' eq 'deleted', we remove it from db if ( $c->user->user_id == $message->from_id ) { # outbox if ( $message->to_status eq 'deleted' ) { $c->model('DBIC::Message')->remove_from_db($message_id); } else { $message->update( { from_status => 'deleted' } ); } $c->res->redirect('/message/outbox'); } elsif ( $c->user->user_id == $message->to_id ) { # inbox if ( $message->from_status eq 'deleted' ) { $c->model('DBIC::Message')->remove_from_db($message_id); } else { $message->update( { to_status => 'deleted' } ); } $c->res->redirect('/message/inbox'); } } 1; __END__ =pod =head1 AUTHOR Fayland Lam =cut