/usr/local/CPAN/Foorum/Foorum/ResultSet/UserForum.pm
package Foorum::ResultSet::UserForum;
use strict;
use warnings;
our $VERSION = '1.001000';
use base 'DBIx::Class::ResultSet';
sub create_user_forum {
my ( $self, $info ) = @_;
$self->create(
{ user_id => $info->{user_id},
forum_id => $info->{forum_id},
status => $info->{status},
time => time(),
}
);
$self->clear_cached_policy($info);
}
sub remove_user_forum {
my ( $self, $info ) = @_;
my @wheres;
push @wheres, ( user_id => $info->{user_id} ) if ( $info->{user_id} );
push @wheres, ( forum_id => $info->{forum_id} ) if ( $info->{forum_id} );
push @wheres, ( status => $info->{status} ) if ( $info->{status} );
return unless ( scalar @wheres );
$self->search( { @wheres, } )->delete;
$self->clear_cached_policy($info);
}
sub clear_cached_policy {
my ( $self, $info ) = @_;
my $schema = $self->result_source->schema;
my $cache = $schema->cache();
if ( $info->{user_id} ) {
# clear user cache too
$schema->resultset('User')
->delete_cache_by_user_cond( { user_id => $info->{user_id} } );
}
if ( $info->{forum_id} ) {
$cache->remove("policy|user_role|forum_id=$info->{forum_id}");
}
}
sub get_forum_moderators {
my ( $self, $forum_id ) = @_;
my $schema = $self->result_source->schema;
my $cache = $schema->cache();
# for forum_id is an ARRAYREF: [1,2], we don't cache it because
# when remove_user_role, we don't know how to clear all forum1's keys.
my $mem_key;
if ( $forum_id =~ /^\d+$/ ) {
$mem_key = "policy|user_role|forum_id=$forum_id";
my $mem_val = $cache->get($mem_key);
return $mem_val if ($mem_val);
}
my @users = $self->search(
{ status => [ 'admin', 'moderator' ],
forum_id => $forum_id,
}
)->all;
my $roles;
foreach (@users) {
my $user
= $schema->resultset('User')->get( { user_id => $_->user_id, } );
next unless ($user);
if ( $_->status eq 'admin' ) {
$roles->{ $_->forum_id }->{'admin'} = { # for cache
username => $user->{username},
nickname => $user->{nickname}
};
} elsif ( $_->status eq 'moderator' ) {
push @{ $roles->{ $_->forum_id }->{'moderator'} }, $user;
}
}
$cache->set( $mem_key, $roles ) if ($mem_key);
return $roles;
}
sub get_forum_admin {
my ( $self, $forum_id ) = @_;
my $schema = $self->result_source->schema;
# get admin
my $rs = $self->search(
{ forum_id => $forum_id,
status => 'admin',
}
)->first;
return unless ($rs);
my $user = $schema->resultset('User')->get( { user_id => $rs->user_id } );
return $user;
}
1;