diff --git a/lib/WebGUI/Inbox.pm b/lib/WebGUI/Inbox.pm index be0841821..8fe51b311 100644 --- a/lib/WebGUI/Inbox.pm +++ b/lib/WebGUI/Inbox.pm @@ -154,7 +154,8 @@ sub getMessage { =head2 getNextMessage ( message [, userId] ) -Returns the message that was send after the message passed in for the user +Returns the message that was sent after the message passed in for the user. This is always assumed +to be in date order. =head3 message @@ -188,11 +189,12 @@ sub getNextMessage { =head2 getPreviousMessage ( message [, userId] ) -Returns the message that was sent before the message passed in for the user +Returns the message that was sent before the message passed in for the user. This is always assumed +to be sorted in date order. =head3 message -The message to find the previous message for +The message to find the previous message for. =head3 user @@ -240,6 +242,10 @@ An integer indication the page to return. Defaults to 1 The column to sort by +=head3 where + +An extra clause for filtering results. + =cut sub getMessagesForUser { @@ -248,13 +254,14 @@ sub getMessagesForUser { my $perpage = shift || 50; my $page = shift || 1; my $sortBy = shift; + my $where = shift; my $p = $self->getMessagesPaginator( $user , { sortBy => $sortBy, sortDir => "desc", paginateAfter => $perpage, - pageNumber => $page - + pageNumber => $page, + whereClause => $where, }); return $self->getMessagesOnPage($p); @@ -332,6 +339,10 @@ Specify the form variable the paginator should use in its links. Defaults to "p By default the page number will be determined by looking at $self->session->form->process("pn"). If that is empty the page number will be defaulted to "1". If you'd like to override the page number specify it here. +=head4 whereClause + +An extra clause to filter the results returned by the paginator. + =cut sub getMessagesPaginator { @@ -347,6 +358,7 @@ sub getMessagesPaginator { my $paginateAfter = $properties->{paginateAfter}; my $formVar = $properties->{formVar}; my $pageNumber = $properties->{pageNumber}; + my $whereClause = $properties->{whereClause} || ''; #Make sure a valid sortBy is passed in if($sortBy && !WebGUI::Utility::isIn($sortBy,qw( subject sentBy dateStamp status ))) { @@ -368,12 +380,13 @@ sub getMessagesPaginator { } my $sql = $self->getMessageSql($user, { - user => $user, - sortBy => $sortBy, - sortDir => $sortDir + user => $user, + sortBy => $sortBy, + sortDir => $sortDir, + whereClause => $whereClause, }); - #$session->log->warn($sql); + $session->log->warn("SQL: ".$sql); my $p = WebGUI::Paginator->new( $session, diff --git a/t/Inbox.t b/t/Inbox.t index ff83715d3..addf4cfda 100644 --- a/t/Inbox.t +++ b/t/Inbox.t @@ -17,12 +17,12 @@ use WebGUI::Session; use WebGUI::Inbox; use WebGUI::User; -use Test::More tests => 9; # increment this value for each test you create +use Test::More tests => 13; # increment this value for each test you create my $session = WebGUI::Test->session; # get a user so we can test retrieving messages for a specific user -my $user = WebGUI::User->new($session, 3); +my $admin = WebGUI::User->new($session, 3); # Begin tests by getting an inbox object my $inbox = WebGUI::Inbox->new($session); @@ -57,13 +57,69 @@ ok($message->getId == $messageId, 'getMessage returns message object'); ######################################################### # get a list (arrayref) of messages for a specific user # ######################################################### -my $messageList = $inbox->getMessagesForUser($user); +my $messageList = $inbox->getMessagesForUser($admin); my $message_cnt = scalar(@{$messageList}); is($message_cnt, 1, 'User only has 1 messages'); $message->setDeleted(3); -is(scalar(@{ $inbox->getMessagesForUser($user) }), 0, 'User has no undeleted messages'); +is(scalar(@{ $inbox->getMessagesForUser($admin) }), 0, 'User has no undeleted messages'); +$message->delete(3); + +######################################################### +# +# Check user filtering +# +######################################################### + +my @senders = (); + +push @senders, WebGUI::User->create($session); +push @senders, WebGUI::User->create($session); +push @senders, WebGUI::User->create($session); +$senders[0]->username('first'); +$senders[0]->profileField('firstName', 'First Only'); +$senders[1]->username('last'); +$senders[1]->profileField('lastName', 'Last Only'); +$senders[2]->username('wholename'); +$senders[2]->profileField('firstName', 'Tom'); +$senders[2]->profileField('lastName', 'Jones'); + +$inbox->addMessage({ + message => "First message", + userId => 3, + sentBy => $senders[0]->userId, +}); + +$inbox->addMessage({ + message => "Second message", + userId => 3, + sentBy => $senders[1]->userId, +}); + +$inbox->addMessage({ + message => "Third message", + userId => 3, + sentBy => $senders[2]->userId, +}); + +$inbox->addMessage({ + message => "Fourth message", + userId => 3, + sentBy => $senders[2]->userId, +}); + +is(scalar @{ $inbox->getMessagesForUser($admin) }, 4, 'Added 3 messages by various users'); +is(scalar @{ $inbox->getMessagesForUser($admin, '', '', '', 'sentBy='.$session->db->quote($senders[0]->userId)) }, 1, '1 message by sender[0]'); +is(scalar @{ $inbox->getMessagesForUser($admin, '', '', '', 'sentBy='.$session->db->quote($senders[1]->userId)) }, 1, '1 message by sender[1]'); +is(scalar @{ $inbox->getMessagesForUser($admin, '', '', '', 'sentBy='.$session->db->quote($senders[2]->userId)) }, 2, '2 messages by sender[2]'); END { $session->db->write('delete from inbox where messageId = ?', [$message->getId]); + foreach my $user (@senders) { + $user->delete; + } + foreach my $message (@{ $inbox->getMessagesForUser($admin, 1000) } ) { + $message->setDeleted(3); + $message->delete(3); + } }