Bivio::Cache::RealmRole
# Copyright (c) 2010 bivio Software, Inc. All Rights Reserved.
# $Id$
package Bivio::Cache::RealmRole;
use strict;
use Bivio::Base 'Bivio.Cache';
my($_RR) = b_use('Model.RealmRole');
my($_RT) = b_use('Auth.RealmType');
b_use('IO.Config')->register(my $_CFG = {
enable => 1,
});
b_use('Biz.PropertyModel')->register_handler(__PACKAGE__)
if $_CFG->{enable};
sub handle_config {
my(undef, $cfg) = @_;
$_CFG = $cfg;
return;
}
sub handle_property_model_modification {
my($proto, $model, $op, $query) = @_;
return
unless $model->simple_package_name eq 'RealmRole';
my($req) = $model->req;
return
unless my $map = $proto->internal_retrieve($model->req);
if ($op =~ /delete/) {
b_die($query, 'must supply a realm_id to delete')
unless $query->{realm_id};
if ($query->{role}) {
delete($map->{$query->{realm_id}}->{$query->{role}->as_int});
}
else {
delete($map->{$query->{realm_id}});
}
}
else {
_update($model, $map);
}
$req->push_txn_resource(__PACKAGE__);
return;
}
sub internal_compute {
my($self, $req) = @_;
my($map) = {};
$_RR->new($req)->set_ephemeral->do_iterate(
sub {
_update(shift, $map);
return 1;
},
'unauth_iterate_start',
);
return $map;
}
sub internal_compute_no_cache {
my($self, $req, $realm_id, $role) = @_;
my($rr) = $_RR->new($req);
return {$realm_id => {$role->as_int => $rr->get('permission_set')}}
if $rr->unauth_load({realm_id => $realm_id, role => $role});
return undef;
}
sub permission_set_for_realm_role {
return _not_enabled(@_)
unless $_CFG->{enable};
my($proto, $realm_id, $role, $req) = @_;
my($res) = $proto->internal_retrieve($req, $realm_id, $role);
return $res
unless ref($res) eq 'HASH';
return $res->{$realm_id}->{$role->as_int};
}
sub _not_enabled {
my($proto, $realm_id, $role, $req) = @_;
return undef
unless my $res = $proto->internal_compute_no_cache($req, $realm_id, $role);
return $res->{$realm_id}->{$role->as_int};
}
sub _update {
my($model, $map) = @_;
my($rid, $role, $ps) = $model->get(qw(realm_id role permission_set));
$map->{$rid}->{$role->as_int} = $ps;
return;
}
1;