From: erickson Date: Mon, 17 Jul 2006 22:08:20 +0000 (+0000) Subject: put container handling inside cstore transactions, added some logging, etc. X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=2ba8009dc18815b3781fa6da9d875f5d45b05614;p=Evergreen.git put container handling inside cstore transactions, added some logging, etc. git-svn-id: svn://svn.open-ils.org/ILS/trunk@5051 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Actor/Container.pm b/Open-ILS/src/perlmods/OpenILS/Application/Actor/Container.pm index d10309452e..67b7e2feb6 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Actor/Container.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Actor/Container.pm @@ -6,6 +6,7 @@ use OpenILS::Perm; use Data::Dumper; use OpenSRF::EX qw(:try); use OpenILS::Utils::Fieldmapper; +use OpenILS::Utils::CStoreEditor qw/:funcs/; my $apputils = "OpenILS::Application::AppUtils"; my $U = $apputils; @@ -178,31 +179,45 @@ __PACKAGE__->register_method( sub bucket_create { my( $self, $client, $authtoken, $class, $bucket ) = @_; - my( $staff, $target, $evt ) = - $apputils->checkses_requestor( - $authtoken, $bucket->owner, 'CREATE_CONTAINER' ); - return $evt if $evt; + my $e = new_editor(xact=>1, authtoken=>$authtoken); + return $e->event unless $e->checkauth; + + if( $bucket->owner ne $e->requestor->id ) { + return $e->event unless + $e->allowed('CREATE_CONTAINER'); - if( $staff->id eq $target->id ) { - $evt = $U->check_perms($target->id, $target->home_ou, 'CREATE_MY_CONTAINER'); - return $evt if $evt; + } else { + return $e->event unless + $e->allowed('CREATE_MY_CONTAINER'); } + + $bucket->clear_id; - $logger->activity( "User " . $staff->id . - " creating a new container for user " . $bucket->owner ); + $logger->debug("creating bucket: " . Dumper($bucket)); - $bucket->clear_id; - $logger->debug("Creating new container object: " . Dumper($bucket)); + my $stat; + if( $class eq 'copy' ) { + return $e->event unless + $stat = $e->create_container_copy_bucket($bucket); + } - my $method = $types{$class} . ".create"; - my $id = $apputils->simplereq( $svc, $method, $bucket ); + if( $class eq 'callnumber' ) { + return $e->event unless + $stat = $e->create_container_call_number_bucket($bucket); + } - $logger->debug("Creatined new container with id $id"); + if( $class eq 'biblio' ) { + return $e->event unless + $stat = $e->create_container_biblio_record_entry_bucket($bucket); + } - if(!$id) { throw OpenSRF::EX - ("Unable to create new bucket object"); } + if( $class eq 'user') { + return $e->event unless + $stat = $e->create_container_user_bucket($bucket); + } - return $id; + $e->commit; + return $stat->id; } @@ -218,24 +233,40 @@ __PACKAGE__->register_method( sub bucket_delete { my( $self, $client, $authtoken, $class, $bucketid ) = @_; + my( $bucket, $evt ); - my( $bucket, $staff, $target, $evt ); + my $e = new_editor(xact=>1, authtoken=>$authtoken); + return $e->event unless $e->checkauth; - ( $bucket, $evt ) = $apputils->fetch_container($bucketid, $class); + ( $bucket, $evt ) = $U->fetch_container_e($e, $bucketid, $class); return $evt if $evt; - ( $staff, $target, $evt ) = $apputils->checkses_requestor( - $authtoken, $bucket->owner, 'DELETE_CONTAINER' ); - return $evt if $evt; + return $e->event unless $e->allowed('DELETE_CONTAINER'); + + my $stat; + if( $class eq 'copy' ) { + return $e->event unless + $stat = $e->delete_container_copy_bucket($bucket); + } + + if( $class eq 'callnumber' ) { + return $e->event unless + $stat = $e->delete_container_call_number_bucket($bucket); + } + + if( $class eq 'biblio' ) { + return $e->event unless + $stat = $e->delete_container_biblio_record_entry_bucket($bucket); + } - $logger->activity( "User " . $staff->id . - " deleting container $bucketid for user " . $bucket->owner ); + if( $class eq 'user') { + return $e->event unless + $stat = $e->delete_container_user_bucket($bucket); + } - my $method = $types{$class} . ".delete"; - my $resp = $apputils->simplereq( $svc, $method, $bucketid ); + $e->commit; + return $stat; - throw OpenSRF::EX ("Unable to create new bucket object") unless $resp; - return $resp; } @@ -248,23 +279,47 @@ __PACKAGE__->register_method( sub item_create { my( $self, $client, $authtoken, $class, $item ) = @_; - my( $bucket, $staff, $target, $evt); - ( $bucket, $evt ) = $apputils->fetch_container($item->bucket, $class); - return $evt if $evt; + my $e = new_editor(xact=>1, authtoken=>$authtoken); + return $e->event unless $e->checkauth; - ( $staff, $target, $evt ) = $apputils->checkses_requestor( - $authtoken, $bucket->owner, 'CREATE_CONTAINER_ITEM' ); + my ( $bucket, $evt ) = $apputils->fetch_container_e($e, $item->bucket, $class); return $evt if $evt; - $logger->activity( "User " . $staff->id . - " creating container item for bucket " . $item->bucket . " and user " . $bucket->owner ); + if( $bucket->owner ne $e->requestor->id ) { + return $e->event unless + $e->allowed('CREATE_CONTAINER_ITEM'); - my $method = $types{$class} . "_item.create"; - my $resp = $apputils->simplereq( $svc, $method, $item ); + } else { + return $e->event unless + $e->allowed('CREATE_CONTAINER_ITEM'); # new perm here? + } + + $item->clear_id; + + my $stat; + if( $class eq 'copy' ) { + return $e->event unless + $stat = $e->create_container_copy_bucket_item($item); + } + + if( $class eq 'callnumber' ) { + return $e->event unless + $stat = $e->create_container_call_number_bucket_item($item); + } + + if( $class eq 'biblio' ) { + return $e->event unless + $stat = $e->create_container_biblio_record_entry_bucket_item($item); + } - return $U->DB_UPDATE_FAILED($item) unless $resp; - return $resp; + if( $class eq 'user') { + return $e->event unless + $stat = $e->create_container_user_bucket_item($item); + } + + $e->commit; + return $stat->id; } @@ -278,29 +333,52 @@ __PACKAGE__->register_method( sub item_delete { my( $self, $client, $authtoken, $class, $itemid ) = @_; - my( $bucket, $item, $staff, $target, $evt); - - ( $item, $evt ) = $apputils->fetch_container_item( $itemid, $class ); - return $evt if $evt; + my $e = new_editor(xact=>1, authtoken=>$authtoken); + return $e->event unless $e->checkauth; + + my $ret = __item_delete($e, $class, $itemid); + $e->commit unless $U->event_code($ret); + return $ret; +} + +sub __item_delete { + my( $e, $class, $itemid ) = @_; + my( $bucket, $item, $evt); - ( $bucket, $evt ) = $apputils->fetch_container($item->bucket, $class); + ( $item, $evt ) = $U->fetch_container_item_e( $e, $itemid, $class ); return $evt if $evt; - ( $staff, $target, $evt ) = $apputils->checkses_requestor( - $authtoken, $bucket->owner, 'DELETE_CONTAINER_ITEM' ); + ( $bucket, $evt ) = $U->fetch_container_e($e, $item->bucket, $class); return $evt if $evt; - $logger->activity( "User " . $staff->id . - " deleting continer item $itemid for user " . $bucket->owner ); + return $e->event unless $e->allowed('DELETE_CONTAINER_ITEM'); - my $method = $types{$class} . "_item.delete"; - my $resp = $apputils->simplereq( $svc, $method, $itemid ); + my $stat; + if( $class eq 'copy' ) { + return $e->event unless + $stat = $e->delete_container_copy_bucket_item($item); + } - throw OpenSRF::EX ("Unable to delete container item") unless $resp; - return $resp; + if( $class eq 'callnumber' ) { + return $e->event unless + $stat = $e->delete_container_call_number_bucket_item($item); + } + + if( $class eq 'biblio' ) { + return $e->event unless + $stat = $e->delete_container_biblio_record_entry_bucket_item($item); + } + + if( $class eq 'user') { + return $e->event unless + $stat = $e->delete_container_user_bucket_item($item); + } + + return $stat; } + __PACKAGE__->register_method( method => 'full_delete', api_name => 'open-ils.actor.container.full_delete', @@ -309,24 +387,61 @@ __PACKAGE__->register_method( sub full_delete { my( $self, $client, $authtoken, $class, $containerId ) = @_; - my( $staff, $target, $container, $evt); + my( $container, $evt); - ( $container, $evt ) = $apputils->fetch_container($containerId, $class); - return $evt if $evt; + my $e = new_editor(xact=>1, authtoken=>$authtoken); + return $e->event unless $e->checkauth; - ( $staff, $target, $evt ) = $apputils->checkses_requestor( - $authtoken, $container->owner, 'DELETE_CONTAINER' ); + ( $container, $evt ) = $apputils->fetch_container_e($e, $containerId, $class); return $evt if $evt; - $logger->activity("User " . $staff->id . " deleting full container $containerId"); + return $e->event unless $e->allowed('DELETE_CONTAINER'); - my $meth = $types{$class}; - my $items = $apputils->simplereq( $svc, "$meth"."_item.search.atomic", { bucket => $containerId } ); + my $items; + + my @s = ({bucket => $containerId}, {idlist=>1}); + + if( $class eq 'copy' ) { + $items = $e->search_container_copy_bucket_item(@s); + } + + if( $class eq 'callnumber' ) { + $items = $e->search_container_call_number_bucket_item(@s); + } + + if( $class eq 'biblio' ) { + $items = $e->search_container_biblio_record_entry_bucket_item(@s); + } + + if( $class eq 'user') { + $items = $e->search_container_user_bucket_item(@s); + } - $self->item_delete( $client, $authtoken, $class, $_->id ) for @$items; + __item_delete($e, $class, $_) for @$items; - $meth = $types{$class} . ".delete"; - return $apputils->simplereq( $svc, $meth, $containerId ); + my $stat; + if( $class eq 'copy' ) { + return $e->event unless + $stat = $e->delete_container_copy_bucket_item($container); + } + + if( $class eq 'callnumber' ) { + return $e->event unless + $stat = $e->delete_container_call_number_bucket_item($container); + } + + if( $class eq 'biblio' ) { + return $e->event unless + $stat = $e->delete_container_biblio_record_entry_bucket_item($container); + } + + if( $class eq 'user') { + return $e->event unless + $stat = $e->delete_container_user_bucket_item($container); + } + + $e->commit; + return $stat; } __PACKAGE__->register_method( @@ -344,19 +459,37 @@ __PACKAGE__->register_method( sub container_update { my( $self, $conn, $authtoken, $class, $container ) = @_; - my( $staff, $target, $dbcontainer, $evt); + my $e = new_editor(xact=>1, authtoken=>$authtoken); + return $e->event unless $e->checkauth; - ( $dbcontainer, $evt ) = $apputils->fetch_container($container->id, $class); + my ( $dbcontainer, $evt ) = $U->fetch_container_e($e, $container->id, $class); return $evt if $evt; - ( $staff, $target, $evt ) = $apputils->checkses_requestor( - $authtoken, $dbcontainer->owner, 'UPDATE_CONTAINER' ); - return $evt if $evt; + return $e->event unless $e->allowed('UPDATE_CONTAINER'); + + my $stat; + if( $class eq 'copy' ) { + return $e->event unless + $stat = $e->update_container_copy_bucket_item($container); + } + + if( $class eq 'callnumber' ) { + return $e->event unless + $stat = $e->update_container_call_number_bucket_item($container); + } + + if( $class eq 'biblio' ) { + return $e->event unless + $stat = $e->update_container_biblio_record_entry_bucket_item($container); + } - $logger->activity("User " . $staff->id . " updating container ". $container->id); + if( $class eq 'user') { + return $e->event unless + $stat = $e->update_container_user_bucket_item($container); + } - my $meth = $types{$class}.".update"; - return $U->cstorereq($meth, $container); + $e->commit; + return $stat; } diff --git a/Open-ILS/src/perlmods/OpenILS/Application/AppUtils.pm b/Open-ILS/src/perlmods/OpenILS/Application/AppUtils.pm index be4af06625..254592f703 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/AppUtils.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/AppUtils.pm @@ -591,6 +591,36 @@ sub fetch_container { } +sub fetch_container_e { + my( $self, $editor, $id, $type ) = @_; + + my( $bucket, $evt ); + $bucket = $editor->retrieve_container_copy_bucket($id) if $type eq 'copy'; + $bucket = $editor->retrieve_container_call_number_bucket($id) if $type eq 'callnumber'; + $bucket = $editor->retrieve_container_biblio_record_entry_bucket($id) if $type eq 'biblio'; + $bucket = $editor->retrieve_container_user_bucket($id) if $type eq 'user'; + + $evt = $editor->event unless $bucket; + return ($bucket, $evt); +} + +sub fetch_container_item_e { + my( $self, $editor, $id, $type ) = @_; + + my( $bucket, $evt ); + $bucket = $editor->retrieve_container_copy_bucket_item($id) if $type eq 'copy'; + $bucket = $editor->retrieve_container_call_number_bucket_item($id) if $type eq 'callnumber'; + $bucket = $editor->retrieve_container_biblio_record_entry_bucket_item($id) if $type eq 'biblio'; + $bucket = $editor->retrieve_container_user_bucket_item($id) if $type eq 'user'; + + $evt = $editor->event unless $bucket; + return ($bucket, $evt); +} + + + + + sub fetch_container_item { my( $self, $id, $type ) = @_; my( $bucket, $evt ); @@ -609,7 +639,6 @@ sub fetch_container_item { $e = 'CONTAINER_USER_BUCKET_ITEM_NOT_FOUND' if $type eq 'user'; $e = 'CONTAINER_COPY_BUCKET_ITEM_NOT_FOUND' if $type eq 'copy'; - $evt = OpenILS::Event->new( $e, itemid => $id, container_type => $type ) unless $bucket; diff --git a/Open-ILS/src/perlmods/OpenILS/Utils/CStoreEditor.pm b/Open-ILS/src/perlmods/OpenILS/Utils/CStoreEditor.pm index bcc2342bc6..c2509ddec5 100644 --- a/Open-ILS/src/perlmods/OpenILS/Utils/CStoreEditor.pm +++ b/Open-ILS/src/perlmods/OpenILS/Utils/CStoreEditor.pm @@ -327,8 +327,11 @@ sub _prop_string { sub __arg_to_string { my $arg = shift; return "" unless defined $arg; - return $arg->id if UNIVERSAL::isa($arg, "Fieldmapper"); + if( UNIVERSAL::isa($arg, "Fieldmapper") ) { + return (defined $arg->id) ? $arg->id : ''; + } return JSON->perl2JSON($arg); + return ""; } @@ -414,7 +417,7 @@ sub runmethod { if(!defined $obj) { - $self->log(I, "request returned no data"); + $self->log(I, "request returned no data : $method"); if( $action eq 'retrieve' ) { $self->event(_mk_not_found($type, $arg));