The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Foorum::ResultSet::Message;

use strict;
use warnings;
our $VERSION = '1.001000';
use base 'DBIx::Class::ResultSet';

sub remove_from_db {
    my ( $self, $message_id ) = @_;

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

    $self->search( { message_id => $message_id } )->delete;
    $schema->resultset('MessageUnread')
        ->search( { message_id => $message_id } )->delete;
}

sub are_messages_unread {
    my ( $self, $user_id, $message_ids ) = @_;

    return unless ($user_id);

    my $schema = $self->result_source->schema;
    my @rs     = $schema->resultset('MessageUnread')->search(
        {   user_id    => $user_id,
            message_id => $message_ids,
        },
        { columns => ['message_id'], }
    )->all;

    my $unread;
    $unread->{ $_->message_id } = 1 foreach (@rs);

    return $unread;
}

sub get_unread_cnt {
    my ( $self, $user_id ) = @_;

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

    my $cachekey = "global|message_unread_cnt|user_id=$user_id";
    my $cacheval = $cache->get($cachekey);

    if ($cacheval) {
        return $cacheval->{val};
    } else {
        my $cnt = $schema->resultset('MessageUnread')
            ->count( { user_id => $user_id } );
        $cache->set( $cachekey, { val => $cnt, 1 => 2 }, 1800 )
            ;    # half an hour

        return $cnt;
    }
}

1;