Bivio::Biz::Model::RealmOwnerBase
# Copyright (c) 2008-2010 bivio Software, Inc. All Rights Reserved. # $Id$ package Bivio::Biz::Model::RealmOwnerBase; use strict; use Bivio::Base 'Biz.PropertyModel'; b_use('IO.ClassLoaderAUTOLOAD'); my($_RT) = b_use('Auth.RealmType'); my($_R) = b_use('Auth.Role'); sub REALM_TYPE { my($self) = @_; return $_RT->from_name( ($self->get_primary_id_name =~ /^(\w+)_id$/)[0] || $self->die('invalid primary id name'), ); } sub cascade_delete { my($self) = @_; my($pid) = $self->get_primary_id; $self->req->with_realm( $pid, sub { my($ro) = $self->req(qw(auth_realm owner)); foreach my $x ( $self->cascade_delete_model_list, ) { $self->new_other($x->[0]) ->do_iterate( sub { my($it) = @_; if (Model_RealmOwnerBase()->is_blesser_of($it)) { $it->unauth_delete_realm($it->get_primary_id); } else { $it->unauth_delete; } return 1; }, 'unauth_iterate_start', $x->[1], {$x->[1] => $pid}, ); } $self->SUPER::cascade_delete; $self->req->clear_cache_for_auth_realm; $ro->cascade_delete; return; }, ); return; } sub cascade_delete_model_list { return ( [qw(RealmDAG child_id)], [qw(RealmDAG parent_id)], [qw(RowTag primary_id)], [qw(RealmUser realm_id)], [qw(RealmUser user_id)], [qw(CRMThread realm_id)], [qw(Tuple realm_id)], [qw(CalendarEvent realm_id)], [qw(RealmMail realm_id)], [qw(RealmMailBounce user_id)], [qw(RealmRole realm_id)], [qw(MotionVote realm_id)], [qw(Motion realm_id)], [qw(UserRealmSubscription realm_id)], [qw(UserRealmSubscription user_id)], [qw(UserDefaultSubscription user_id)], ); } sub create_realm { my($self, $realm_owner, $admin_id) = @_; my($ro) = $self->new_other('RealmOwner')->create({ %$realm_owner, realm_type => $self->REALM_TYPE, realm_id => $self->get_primary_id, }); $self->new_other('RealmUser')->create({ realm_id => $self->get_primary_id, user_id => $admin_id, role => $_R->ADMINISTRATOR, }) if $admin_id ||= $self->internal_create_realm_administrator_id; return ($self, $ro); } sub delete { my($self) = @_; $self->die('call cascade_delete instead') unless $self->my_caller eq 'cascade_delete'; return shift->SUPER::delete(@_); } sub internal_create_realm_administrator_id { return; } sub internal_initialize_by_realm_type { my($self, $info) = @_; my($table, $id) = map(lc($self->REALM_TYPE->get_name) . $_, qw(_t _id)); return $self->merge_initialize_info( shift->SUPER::internal_initialize(@_), $self->merge_initialize_info( { version => 1, table_name => $table, columns => { $id => ['RealmOwner.realm_id', 'PRIMARY_KEY'], }, other => [ [$id, qw(RealmOwner.realm_id)], ], auth_id => $id, }, $info, ), ); } sub unauth_delete_realm { my($self, $realm_owner_or_id) = @_; $self->unauth_load_or_die({ $self->get_primary_id_name => ref($realm_owner_or_id) ? $realm_owner_or_id->get('realm_id') : $realm_owner_or_id, })->cascade_delete; return; } 1;