package WebGUI::Forum; =head1 LEGAL ------------------------------------------------------------------- WebGUI is Copyright 2001-2005 Plain Black Corporation. ------------------------------------------------------------------- Please read the legal notices (docs/legal.txt) and the license (docs/license.txt) that came with this distribution before using this software. ------------------------------------------------------------------- http://www.plainblack.com info@plainblack.com ------------------------------------------------------------------- =cut use strict; use WebGUI::Forum::Thread; use WebGUI::Grouping; use WebGUI::Session; use WebGUI::SQL; use WebGUI::Utility; =head1 NAME Package WebGUI::Forum =head1 DESCRIPTION Data management class for forums. =head1 SYNOPSIS use WebGUI::Forum; $forum = WebGUI::Forum->create(\%forumParams); $forum = WebGUI::Forum->new($forumId); $boolean = $forum->canPost; $boolean = $forum->canView; $scalar = $forum->get($param); $obj = $forum->getThread($threadId); $boolean = $forum->isModerator; $boolean = $forum->isSubscribed; $forum->decrementReplies; $forum->decrementThreads; $forum->incrementReplies($postDate, $postId); $forum->incrementThreads($postDate, $postId); $forum->incrementViews; $forum->purge; $forum->recalculateRating; $forum->set(\%data); $forum->setLastPost($epoch, $postId); $forum->subscribe; $forum->unsubscribe; =head1 METHODS These methods are available from this class: =cut #------------------------------------------------------------------- =head2 canPost ( [ userId ] ) Returns a boolean whether the user has the privileges required to post. =head3 userId Defaults to $session{user}{userId}. Specify a user ID to check privileges for. =cut sub canPost { my ($self, $userId) = @_; $userId = $session{user}{userId} unless ($userId); return (WebGUI::Grouping::isInGroup($self->get("groupToPost"),$userId) || $self->isModerator); } #------------------------------------------------------------------- =head2 canView ( [ userId ] ) Returns a boolean whether the user has the privileges required to view the forum. =head3 userId Defaults to $session{user}{userId}. Specify a user ID to check privileges for. =cut sub canView { my ($self, $userId) = @_; $userId = $session{user}{userId} unless ($userId); return (WebGUI::Grouping::isInGroup($self->get("groupToView"),$userId) || $self->canPost); } #------------------------------------------------------------------- =head2 create ( forumParams ) Creates a new forum. Returns a forum object. =head3 forumParams A hash reference containing a list of the parameters to default the forum to. The valid parameters are: addEditStampToPosts - boolean filterPosts - A valid HTML::filter string. karmaPerPost - integer groupToPost - Group ID groupToModerate - Group ID editTimeout - interval moderatePosts - boolean attachmentsPerPost - integer allowRichEdit - boolean allowReplacements - boolean forumTemplateId - Template ID threadTemplateId - Template ID postTemplateId - Template ID postFormTemplateId - Template ID searchTemplateId - Template ID notificationTemplateId - Template ID archiveAfter - interval postsPerPage - integer masterForumId - Forum ID =cut sub create { my ($self, $data) = @_; $data->{forumId} = "new"; my $forumId = WebGUI::SQL->setRow("forum","forumId",$data); return WebGUI::Forum->new($forumId); } #------------------------------------------------------------------- =head2 decrementReplies ( ) Deccrements this forum's reply counter. =cut sub decrementReplies { my ($self) = @_; WebGUI::SQL->write("update forum set replies=replies-1 where forumId=".quote($self->get("forumId"))); } #------------------------------------------------------------------- =head2 decrementThreads ( ) Decrements this forum's thread counter. =cut sub decrementThreads { my ($self) = @_; WebGUI::SQL->write("update forum set threads=threads-1 where forumId=".quote($self->get("forumId"))); } #------------------------------------------------------------------- =head2 get ( [ param ] ) Returns a hash reference containing all of the properties of the forum. =head3 param If specified then this method will return the value of this one parameter as a scalar. Param is the name of the parameter to return. See the forum table for details. =cut sub get { my ($self, $key) = @_; if ($key eq "") { return $self->{_properties}; } return $self->{_properties}->{$key}; } #------------------------------------------------------------------- =head2 getThread ( threadId ) Returns a thread object. =head3 threadId The unique identifier of a thread in this forum. =cut sub getThread { my ($self, $threadId) = @_; unless (exists $self->{_thread}{$threadId}) { $self->{_thread}{$threadId} = WebGUI::Forum::Thread->new($threadId); } return $self->{_thread}{$threadId}; } #------------------------------------------------------------------- =head2 isModerator ( [ userId ] ) Returns a boolean indicating whether the user is a moderator. =head3 userId Defaults to $session{user}{userId}. A user id to test for moderator privileges. =cut sub isModerator { my ($self, $userId) = @_; $userId = $session{user}{userId} unless ($userId); return WebGUI::Grouping::isInGroup($self->get("groupToModerate"), $userId); } #------------------------------------------------------------------- =head2 incrementReplies ( lastPostDate, lastPostId ) Increments this forum's reply counter. =head3 lastPostDate The date of the post being added. =head3 lastPostId The unique identifier of the post being added. =cut sub incrementReplies { my ($self, $lastPostDate, $lastPostId) = @_; WebGUI::SQL->write("update forum set replies=replies+1, lastPostId=".quote($lastPostId).", lastPostDate=$lastPostDate where forumId=".quote($self->get("forumId"))); } #------------------------------------------------------------------- =head2 incrementThreads ( lastPostDate, lastPostId ) Increments the thread counter for this forum. =head3 lastPostDate The date of the post that was just added. =head3 lastPostId The unique identifier of the post that was just added. =cut sub incrementThreads { my ($self, $lastPostDate, $lastPostId) = @_; WebGUI::SQL->write("update forum set threads=threads+1, lastPostId=".quote($lastPostId).", lastPostDate=$lastPostDate where forumId=".quote($self->get("forumId"))); } #------------------------------------------------------------------- =head2 incrementViews ( ) Increments the views counter on this forum. =cut sub incrementViews { my ($self) = @_; WebGUI::SQL->write("update forum set views=views+1 where forumId=".quote($self->get("forumId"))); } #------------------------------------------------------------------- =head2 isSubscribed ( [ userId ] ) Returns a boolean indicating whether the user is subscribed to the forum. =head3 userId The user to check for the subscription. Defaults to $session{user}{userId}. =cut sub isSubscribed { my ($self, $userId) = @_; $userId = $session{user}{userId} unless ($userId); my ($isSubscribed) = WebGUI::SQL->quickArray("select count(*) from forumSubscription where forumId=".quote($self->get("forumId"))." and userId=".quote($userId)); return $isSubscribed; } #------------------------------------------------------------------- =head2 new ( forumId ) Constructor. =head3 forumId The unique identifier of the forum to retrieve the object for. =cut sub new { my ($class, $forumId) = @_; my $properties = WebGUI::SQL->getRow("forum","forumId",$forumId); if ($properties->{masterForumId}) { my $master = WebGUI::SQL->getRow("forum","forumId",$properties->{masterForumId}); $properties->{forumTemplateId} = $master->{forumTemplateId}; $properties->{threadTemplateId} = $master->{threadTemplateId}; $properties->{postTemplateId} = $master->{postTemplateId}; $properties->{searchTemplateId} = $master->{searchTemplateId}; $properties->{notificationTemplateId} = $master->{notificationTemplateId}; $properties->{postFormTemplateId} = $master->{postFormTemplateId}; $properties->{postPreviewTemplateId} = $master->{postPreviewTemplateId}; $properties->{archiveAfter} = $master->{archiveAfter}; $properties->{allowRichEdit} = $master->{allowRichEdit}; $properties->{allowReplacements} = $master->{allowReplacements}; $properties->{filterPosts} = $master->{filterPosts}; $properties->{karmaPerPost} = $master->{karmaPerPost}; $properties->{groupToView} = $master->{groupToView}; $properties->{groupToPost} = $master->{groupToPost}; $properties->{groupToView} = $master->{groupToView}; $properties->{groupToModerate} = $master->{groupToModerate}; $properties->{moderatePosts} = $master->{moderatePosts}; $properties->{attachmentsPerPost} = $master->{attachmentsPerPost}; $properties->{addEditStampToPosts} = $master->{addEditStampsToPost}; $properties->{postsPerPage} = $master->{postsPerPage}; $properties->{usePreview} = $master->{usePreview}; } bless {_properties=>$properties}, $class; } #------------------------------------------------------------------- =head2 purge ( ) Destroys this forum and everything it contains. =cut sub purge { my ($self) = @_; return unless ($self->get("forumId")); my $a = WebGUI::SQL->read("select * from forumThread where forumId=".quote($self->get("forumId"))); while (my ($threadId) = $a->array) { my $b = WebGUI::SQL->read("select * from forumPost where forumThreadId=".quote($threadId)); while (my ($postId) = $b->array) { WebGUI::SQL->write("delete from forumPostAttachment where forumPostId=".quote($postId)); WebGUI::SQL->write("delete from forumPostRating where forumPostId=".quote($postId)); } $b->finish; WebGUI::SQL->write("delete from forumThreadSubscription where forumThreadId=".quote($threadId)); WebGUI::SQL->write("delete from forumRead where forumThreadId=".quote($threadId)); WebGUI::SQL->write("delete from forumPost where forumThreadId=".quote($threadId)); } $a->finish; WebGUI::SQL->write("delete from forumSubscription where forumId=".quote($self->get("forumId"))); WebGUI::SQL->write("delete from forumThread where forumId=".quote($self->get("forumId"))); WebGUI::SQL->write("delete from forum where forumId=".quote($self->get("forumId"))); } #------------------------------------------------------------------- =head2 recalculateRating ( ) Calculates the rating of this forum from its threads and stores the new value in the forum properties. =cut sub recalculateRating { my ($self) = @_; my ($count) = WebGUI::SQL->quickArray("select count(*) from forumThread where forumId=".quote($self->get("forumId"))." and rating>0"); $count = $count || 1; my ($sum) = WebGUI::SQL->quickArray("select sum(rating) from forumThread where forumId=".quote($self->get("forumId"))." and rating>0"); my $average = round($sum/$count); $self->set({rating=>$average}); } #------------------------------------------------------------------- =head2 set ( data ) Sets the forum properties both in the object and to the database. =head3 data A hash reference containing the properties to set. See the forum table for details. =cut sub set { my ($self, $data) = @_; $data->{forumId} = $self->get("forumId") unless ($data->{forumId}); WebGUI::SQL->setRow("forum","forumId",$data); foreach my $key (keys %{$data}) { $self->{_properties}{$key} = $data->{$key}; } } #------------------------------------------------------------------- =head2 setLastPost ( lastPostDate, lastPostId ) Sets the pertinent details for the last post. Can also be done directly using the set method. =head3 lastPostDate The epoch date of the post. =head3 lastPostId The unique id of the post. =cut sub setLastPost { my ($self, $postDate, $postId) = @_; $self->set({ lastPostId=>$postId, lastPostDate=>$postDate }); } #------------------------------------------------------------------- =head2 subscribe ( [ userId ] ) Subscribes a user to this forum. =head3 userId The unique identifier of the user to subscribe. Defaults to the current user. =cut sub subscribe { my ($self, $userId) = @_; $userId = $session{user}{userId} unless ($userId); unless ($self->isSubscribed($userId)) { WebGUI::SQL->write("insert into forumSubscription (forumId, userId) values (".quote($self->get("forumId")).",".quote($userId).")"); } } #------------------------------------------------------------------- =head2 unsubscribe ( [ userId ] ) Unsubscribes a user from this forum. =head3 userId The unique identifier of the user to unsubscribe. Defaults to the current user. =cut sub unsubscribe { my ($self, $userId) = @_; $userId = $session{user}{userId} unless ($userId); if ($self->isSubscribed($userId)) { WebGUI::SQL->write("delete from forumSubscription where forumId=".quote($self->get("forumId"))." and userId=".quote($userId)); } } 1;