API change to allow filtering messages by userId.

Changes to getMessagesForUser, getMessagePaginator.  With tests.
This commit is contained in:
Colin Kuskie 2009-02-23 12:27:11 -08:00
parent a6c9d3c3d1
commit b2523d8b24
2 changed files with 82 additions and 13 deletions

View file

@ -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,

View file

@ -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);
}
}