/usr/local/CPAN/Parley/Parley/Schema/Thread.pm


package Parley::Schema::Thread;

# Created by DBIx::Class::Schema::Loader v0.03004 @ 2006-08-10 09:12:24

use strict;
use warnings;

use Parley::Version;  our $VERSION = $Parley::VERSION;
use DateTime::Format::Pg;

use base 'DBIx::Class';

__PACKAGE__->load_components("PK::Auto", "Core");
__PACKAGE__->table("parley.thread");
__PACKAGE__->add_columns(
  "id" => {
    data_type => "integer",
    #default_value => "nextval('thread_thread_id_seq'::regclass)",
    is_nullable => 0,
    size => 4,
  },
  "locked" => {
    data_type => "boolean",
    default_value => "false",
    is_nullable => 0,
    size => 1,
  },
  "creator_id" => {
    data_type => "integer",
    default_value => undef,
    is_nullable => 0,
    size => 4
  },
  "subject" => {
    data_type => "text",
    default_value => undef,
    is_nullable => 0,
    size => undef,
  },
  "active" => {
    data_type => "boolean",
    default_value => "true",
    is_nullable => 0,
    size => 1,
  },
  "forum_id", {
    data_type => "integer",
    default_value => undef,
    is_nullable => 0,
    size => 4
  },
  "created" => {
    data_type => "timestamp with time zone",
    default_value => "now()",
    is_nullable => 1,
    size => 8,
  },
  "last_post_id" => {
    data_type => "integer",
    default_value => undef,
    is_nullable => 1,
    size => 4
  },
  "sticky" => {
    data_type => "boolean",
    default_value => "false",
    is_nullable => 0,
    size => 1,
  },
  "post_count" => {
    data_type => "integer",
    default_value => 0,
    is_nullable => 0,
    size => 4
  },
  "view_count" => {
    data_type => "integer",
    default_value => 0,
    is_nullable => 0,
    size => 4
  },
);
__PACKAGE__->set_primary_key("id");
__PACKAGE__->resultset_class('Parley::ResultSet::Thread');

__PACKAGE__->belongs_to(
    "creator" => "Person",
    { 'foreign.id' => 'self.creator_id' }
);
__PACKAGE__->belongs_to(
    "last_post" => "Post",
    { 'foreign.id' => 'self.last_post_id' },
);
__PACKAGE__->belongs_to(
    "forum" =>  "Forum",
    { 'foreign.id' => 'self.forum_id' }
);
__PACKAGE__->has_many(
    "posts" => "Post",
    { "foreign.thread_id" => "self.id" },
);
__PACKAGE__->has_many(
  "thread_views" => "ThreadView",
  { "foreign.thread_id" => "self.id" },
);

__PACKAGE__->has_many(
    'forum_moderators' => 'ForumModerator',
    {
        'foreign.forum' => 'self.forum_id',
    }
);


foreach my $datecol (qw/created/) {
    __PACKAGE__->inflate_column($datecol, {
        inflate => sub { DateTime::Format::Pg->parse_datetime(shift); },
        deflate => sub { DateTime::Format::Pg->format_datetime(shift); },
    });
}


sub PROBABLY_DEAD_last_post_viewed_in_thread :ResultSet {
    my ($self, $person, $thread) = @_;
    my ($last_viewed, $last_post);

    my $schema = $self->result_source()->schema();

    # we need to be careful that we haven't deleted/hidden the post that
    # matches the exact timestamp of last_viewed for a thread - this is why we
    # use <= and not ==, since we can just return the latest undeleted post

    # get the "last_viewed" value from thread_view
    $last_viewed = $schema->resultset('ThreadView')->search(
        {
            person_id  => $person->id(),
            thread_id  => $thread->id(),
        },
        {
            rows => 1,
        }
    );

    # if last_viewed isn't defined, it should mean the user has never viewed
    # this thread
    if (not defined $last_viewed) {
        warn "thread has never been viewed - returning first post in thread";

        $last_post = $schema->resultset('Post')->search(
            {
                thread_id  => $thread->id(),
            },
            {
                rows        => 1,
                order_by    => [\'created ASC'],
            }
        );

        return $last_post->first();
    }
        
    #die dump(ref $last_viewed);
    if (not $last_viewed->count()) {
        warn "no matches for 'last viewed' in last_post_viewed_in_thread()";
        return;
    }

    # now get the last post made on or before our timestamp for when we last
    # viewed the thread
    $last_post = $schema->resultset('Post')->search(
        {
            created => {
                '<=', 
                DateTime::Format::Pg->format_datetime($last_viewed->timestamp())
            },
            thread_id  => $thread->id(),
        },
        {
            rows        => 1,
            order_by    => [\'created DESC'],
        }
    );

    # return the first result (if we have any)
    if ($last_post->count()) {
        return $last_post->first();
    }

    # oh well, we didn't get anything
    # XXX this might cause problems in the future, but we'll see
    return;
}


1;
__END__
vim: ts=8 sts=4 et sw=4 sr sta