webgui/lib/WebGUI/Forum/Post.pm
2003-10-07 04:16:10 +00:00

178 lines
5.5 KiB
Perl

package WebGUI::Forum::Post;
use strict;
use WebGUI::DateTime;
use WebGUI::Forum::Thread;
use WebGUI::Session;
use WebGUI::SQL;
use WebGUI::Utility;
sub canEdit {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
return ($self->getThread->getForum->isModerator || ($self->get("userId") == $userId && $userId != 1
&& $self->getThread->getForum->get("editTimeout") < (WebGUI::DateTime::time() - $self->get("dateOfPost"))));
}
sub create {
my ($self, $data) = @_;
$data->{dateOfPost} = WebGUI::DateTime::time();
$data->{forumPostId} = "new";
my $forumPostId = WebGUI::SQL->setRow("forumPost","forumPostId", $data);
$self = WebGUI::Forum::Post->new($forumPostId);
if ($self->getThread->getForum->get("moderatePosts")) {
$self->setStatusPending;
} else {
$self->setStatusApproved;
}
return $self;
}
sub get {
my ($self, $key) = @_;
if ($key eq "") {
return $self->{_properties};
}
return $self->{_properties}->{$key};
}
sub getReplies {
my ($self) = @_;
my @replies = ();
my $sth = WebGUI::SQL->read("select forumPostId from forumPost where parentId=".$self->get("forumPostId")." order by forumPostId");
while (my @data = $sth->array) {
push(@replies,WebGUI::Forum::Post->new($data[0]));
}
$sth->finish;
return \@replies;
}
sub getThread {
my ($self) = @_;
unless (exists $self->{_thread}) {
$self->{_thread} = WebGUI::Forum::Thread->new($self->get("forumThreadId"));
}
return $self->{_thread};
}
sub hasRated {
my ($self, $userId, $ipAddress) = @_;
$userId = $session{user}{userId} unless ($userId);
return 1 if ($userId != 1 && $userId == $self->get("userId")); # is poster
$ipAddress = $session{env}{REMOTE_ADDR} unless ($ipAddress);
my ($flag) = WebGUI::SQL->quickArray("select count(*) from forumPostRating where forumPostId="
.$self->get("forumPostId")." and ((userId=$userId and userId<>1) or (userId=1 and
ipAddress='$ipAddress'))");
return $flag;
}
sub incrementViews {
my ($self) = @_;
WebGUI::SQL->write("update forumPost set views=views+1 where forumPostId=".$self->get("forumPostId"));
$self->getThread->incrementViews;
}
sub isMarkedRead {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
my ($isRead) = WebGUI::SQL->quickArray("select count(*) from forumRead where userId=$userId and forumPostId=".$self->get("forumPostId"));
return $isRead;
}
sub isReply {
my ($self) = @_;
if ($self->get("parentId") > 0) {
return 1;
} else {
return 0;
}
}
sub markRead {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
unless ($self->isMarkedRead($userId)) {
WebGUI::SQL->write("insert into forumRead (userId, forumPostId, forumThreadId, lastRead) values ($userId,
".$self->get("forumPostId").", ".$self->get("forumThreadId").", ".WebGUI::DateTime::time().")");
}
$self->incrementViews;
}
sub new {
my ($class, $forumPostId) = @_;
my $properties = WebGUI::SQL->getRow("forumPost","forumPostId",$forumPostId);
if (defined $properties) {
bless {_properties=>$properties}, $class;
} else {
return undef;
}
}
sub rate {
my ($self, $rating, $userId, $ipAddress) = @_;
$userId = $session{user}{userId} unless ($userId);
$ipAddress = $session{env}{REMOTE_ADDR} unless ($ipAddress);
WebGUI::SQL->write("insert into forumPostRating (forumPostId,userId,ipAddress,dateOfRating,rating) values ("
.$self->get("forumPostId").", $userId, ".quote($ipAddress).", ".WebGUI::DateTime::time().", $rating)");
$self->recalculateRating;
}
sub recalculateRating {
my ($self) = @_;
my ($count) = WebGUI::SQL->quickArray("select count(*) from forumPostRating where forumPostId=".$self->get("forumPostId"));
$count = $count || 1;
my ($sum) = WebGUI::SQL->quickArray("select sum(rating) from forumPostRating where forumPostId=".$self->get("forumPostId"));
my $average = round($sum/$count);
$self->set({rating=>$average});
$self->getThread->recalculateRating;
}
sub set {
my ($self, $data) = @_;
$data->{forumPostId} = $self->get("forumPostId") unless ($data->{forumPostId});
WebGUI::SQL->setRow("forumPost","forumPostId",$data);
foreach my $key (keys %{$data}) {
$self->{_properties}{$key} = $data->{$key};
}
}
sub setStatusApproved {
my ($self) = @_;
$self->set({status=>'approved'});
$self->getThread->setStatusApproved if ($self->getThread->get("rootPostId") == $self->get("forumPostId"));
if ($self->isReply) {
$self->getThread->incrementReplies($self->get("dateOfPost"),$self->get("forumPostId"));
}
}
sub setStatusDeleted {
my ($self) = @_;
$self->set({status=>'deleted'});
$self->getThread->setStatusDeleted if ($self->getThread->get("rootPostId") == $self->get("forumPostId"));
if ($self->getThread->get("lastPostId") == $self->get("forumPostId")) {
my ($id, $date) = WebGUI::SQL->quickArray("select forumPostId,dateOfPost from forumPost where forumThreadId="
.$self->get("forumThreadId")." and status='approved'");
$self->getThread->setLastPost($id,$date);
}
}
sub setStatusDenied {
my ($self) = @_;
$self->set({status=>'denied'});
$self->getThread->setStatusDenied if ($self->getThread->get("rootPostId") == $self->get("forumPostId"));
}
sub setStatusPending {
my ($self) = @_;
$self->set({status=>'pending'});
$self->getThread->setStatusPending if ($self->getThread->get("rootPostId") == $self->get("forumPostId"));
}
sub unmarkRead {
my ($self, $userId) = @_;
$userId = $session{user}{userId} unless ($userId);
WebGUI::SQL->write("delete from forumRead where userId=$userId and forumPostId=".$self->get("forumPostId"));
}
1;