1 package OpenILS::Application::Actor::Container;
2 use base 'OpenSRF::Application';
3 use strict; use warnings;
4 use OpenILS::Application::AppUtils;
7 use OpenSRF::EX qw(:try);
8 use OpenILS::Utils::Fieldmapper;
9 use OpenILS::Utils::CStoreEditor qw/:funcs/;
11 my $apputils = "OpenILS::Application::AppUtils";
13 my $logger = "OpenSRF::Utils::Logger";
15 sub initialize { return 1; }
17 my $svc = 'open-ils.cstore';
18 my $meth = 'open-ils.cstore.direct.container';
20 $types{'biblio'} = "$meth.biblio_record_entry_bucket";
21 $types{'callnumber'} = "$meth.call_number_bucket";
22 $types{'copy'} = "$meth.copy_bucket";
23 $types{'user'} = "$meth.user_bucket";
28 return $buckets unless ($buckets && $buckets->[0]);
29 return [ sort { $a->name cmp $b->name } @$buckets ];
32 __PACKAGE__->register_method(
33 method => "bucket_retrieve_all",
34 api_name => "open-ils.actor.container.all.retrieve_by_user",
36 Retrieves all un-fleshed buckets assigned to given user
37 PARAMS(authtoken, bucketOwnerId)
38 If requestor ID is different than bucketOwnerId, requestor must have
39 VIEW_CONTAINER permissions.
42 sub bucket_retrieve_all {
43 my($self, $client, $authtoken, $userid) = @_;
45 my( $staff, $evt ) = $apputils->checkses($authtoken);
48 my( $user, $e ) = $apputils->checkrequestor( $staff, $userid, 'VIEW_CONTAINER');
51 $logger->debug("User " . $staff->id .
52 " retrieving all buckets for user $userid");
56 $buckets{$_} = $apputils->simplereq(
57 $svc, $types{$_} . ".search.atomic", { owner => $userid } ) for keys %types;
62 __PACKAGE__->register_method(
63 method => "bucket_flesh",
64 api_name => "open-ils.actor.container.flesh",
67 Fleshes a bucket by id
68 PARAMS(authtoken, bucketClass, bucketId)
69 bucketclasss include biblio, callnumber, copy, and user.
70 bucketclass defaults to biblio.
71 If requestor ID is different than bucketOwnerId, requestor must have
72 VIEW_CONTAINER permissions.
77 my($self, $client, $authtoken, $class, $bucket) = @_;
79 my( $staff, $evt ) = $apputils->checkses($authtoken);
82 $logger->debug("User " . $staff->id . " retrieving bucket $bucket");
84 my $meth = $types{$class};
86 my $bkt = $apputils->simplereq( $svc, "$meth.retrieve", $bucket );
87 #if(!$bkt) {return undef};
88 return OpenILS::Event->new('CONTAINER_NOT_FOUND', payload=>$bucket) unless $bkt;
91 my( $user, $e ) = $apputils->checkrequestor( $staff, $bkt->owner, 'VIEW_CONTAINER' );
95 $bkt->items( $apputils->simplereq( $svc,
96 "$meth"."_item.search.atomic", { bucket => $bucket } ) );
102 __PACKAGE__->register_method(
103 method => "bucket_flesh_public",
104 api_name => "open-ils.actor.container.public.flesh",
106 notes => <<" NOTES");
107 Fleshes a bucket by id
108 PARAMS(authtoken, bucketClass, bucketId)
109 bucketclasss include biblio, callnumber, copy, and user.
110 bucketclass defaults to biblio.
111 If requestor ID is different than bucketOwnerId, requestor must have
112 VIEW_CONTAINER permissions.
115 sub bucket_flesh_public {
117 my($self, $client, $class, $bucket) = @_;
119 my $meth = $types{$class};
120 my $bkt = $apputils->simplereq( $svc, "$meth.retrieve", $bucket );
121 return undef unless ($bkt and $bkt->pub);
123 $bkt->items( $apputils->simplereq( $svc,
124 "$meth"."_item.search.atomic", { bucket => $bucket } ) );
130 __PACKAGE__->register_method(
131 method => "bucket_retrieve_class",
132 api_name => "open-ils.actor.container.retrieve_by_class",
134 notes => <<" NOTES");
135 Retrieves all un-fleshed buckets by class assigned to given user
136 PARAMS(authtoken, bucketOwnerId, class [, type])
137 class can be one of "biblio", "callnumber", "copy", "user"
138 The optional "type" parameter allows you to limit the search by
140 If bucketOwnerId is not defined, the authtoken is used as the
142 If requestor ID is different than bucketOwnerId, requestor must have
143 VIEW_CONTAINER permissions.
146 sub bucket_retrieve_class {
147 my( $self, $client, $authtoken, $userid, $class, $type ) = @_;
149 my( $staff, $user, $evt ) =
150 $apputils->checkses_requestor( $authtoken, $userid, 'VIEW_CONTAINER' );
153 $logger->debug("User " . $staff->id .
154 " retrieving buckets for user $userid [class=$class, type=$type]");
156 my $meth = $types{$class} . ".search.atomic";
160 $buckets = $apputils->simplereq( $svc,
161 $meth, { owner => $userid, btype => $type } );
163 $logger->debug("Grabbing buckets by class $class: $svc : $meth : {owner => $userid}");
164 $buckets = $apputils->simplereq( $svc, $meth, { owner => $userid } );
167 return _sort_buckets($buckets);
170 __PACKAGE__->register_method(
171 method => "bucket_create",
172 api_name => "open-ils.actor.container.create",
173 notes => <<" NOTES");
174 Creates a new bucket object. If requestor is different from
175 bucketOwner, requestor needs CREATE_CONTAINER permissions
176 PARAMS(authtoken, bucketObject);
177 Returns the new bucket object
181 my( $self, $client, $authtoken, $class, $bucket ) = @_;
183 my $e = new_editor(xact=>1, authtoken=>$authtoken);
184 return $e->event unless $e->checkauth;
186 if( $bucket->owner ne $e->requestor->id ) {
187 return $e->event unless
188 $e->allowed('CREATE_CONTAINER');
191 return $e->event unless
192 $e->allowed('CREATE_MY_CONTAINER');
197 my $evt = OpenILS::Event->new('CONTAINER_EXISTS',
198 payload => [$class, $bucket->owner, $bucket->btype, $bucket->name]);
199 my $search = {name => $bucket->name, owner => $bucket->owner, btype => $bucket->btype};
202 if( $class eq 'copy' ) {
203 return $evt if $e->search_container_copy_bucket($search)->[0];
204 return $e->event unless
205 $obj = $e->create_container_copy_bucket($bucket);
208 if( $class eq 'callnumber' ) {
209 return $evt if $e->search_container_call_number_bucket($search)->[0];
210 return $e->event unless
211 $obj = $e->create_container_call_number_bucket($bucket);
214 if( $class eq 'biblio' ) {
215 return $evt if $e->search_container_biblio_record_entry_bucket($search)->[0];
216 return $e->event unless
217 $obj = $e->create_container_biblio_record_entry_bucket($bucket);
220 if( $class eq 'user') {
221 return $evt if $e->search_container_user_bucket($search)->[0];
222 return $e->event unless
223 $obj = $e->create_container_user_bucket($bucket);
231 __PACKAGE__->register_method(
232 method => "bucket_delete",
233 api_name => "open-ils.actor.container.delete",
234 notes => <<" NOTES");
235 Deletes a bucket object. If requestor is different from
236 bucketOwner, requestor needs DELETE_CONTAINER permissions
237 PARAMS(authtoken, class, bucketId);
238 Returns the new bucket object
241 # XXX pretty sure no one actually uses this method,
242 # (see open-ils.actor.container.full_delete) -- should probably deprecate it
244 my( $self, $client, $authtoken, $class, $bucketid ) = @_;
247 my $e = new_editor(xact=>1, authtoken=>$authtoken);
248 return $e->event unless $e->checkauth;
250 ( $bucket, $evt ) = $U->fetch_container_e($e, $bucketid, $class);
253 return $e->event unless $e->allowed('DELETE_CONTAINER');
256 if( $class eq 'copy' ) {
257 return $e->event unless
258 $stat = $e->delete_container_copy_bucket($bucket);
261 if( $class eq 'callnumber' ) {
262 return $e->event unless
263 $stat = $e->delete_container_call_number_bucket($bucket);
266 if( $class eq 'biblio' ) {
267 return $e->event unless
268 $stat = $e->delete_container_biblio_record_entry_bucket($bucket);
271 if( $class eq 'user') {
272 return $e->event unless
273 $stat = $e->delete_container_user_bucket($bucket);
282 __PACKAGE__->register_method(
283 method => "item_create",
284 api_name => "open-ils.actor.container.item.create",
285 notes => <<" NOTES");
286 PARAMS(authtoken, class, item)
290 my( $self, $client, $authtoken, $class, $item ) = @_;
292 my $e = new_editor(xact=>1, authtoken=>$authtoken);
293 return $e->event unless $e->checkauth;
295 my ( $bucket, $evt ) = $apputils->fetch_container_e($e, $item->bucket, $class);
298 if( $bucket->owner ne $e->requestor->id ) {
299 return $e->event unless
300 $e->allowed('CREATE_CONTAINER_ITEM');
303 return $e->event unless
304 $e->allowed('CREATE_CONTAINER_ITEM'); # new perm here?
310 if( $class eq 'copy' ) {
311 return $e->event unless
312 $stat = $e->create_container_copy_bucket_item($item);
315 if( $class eq 'callnumber' ) {
316 return $e->event unless
317 $stat = $e->create_container_call_number_bucket_item($item);
320 if( $class eq 'biblio' ) {
321 return $e->event unless
322 $stat = $e->create_container_biblio_record_entry_bucket_item($item);
325 if( $class eq 'user') {
326 return $e->event unless
327 $stat = $e->create_container_user_bucket_item($item);
336 __PACKAGE__->register_method(
337 method => "item_delete",
338 api_name => "open-ils.actor.container.item.delete",
339 notes => <<" NOTES");
340 PARAMS(authtoken, class, itemId)
344 my( $self, $client, $authtoken, $class, $itemid ) = @_;
346 my $e = new_editor(xact=>1, authtoken=>$authtoken);
347 return $e->event unless $e->checkauth;
349 my $ret = __item_delete($e, $class, $itemid);
350 $e->commit unless $U->event_code($ret);
355 my( $e, $class, $itemid ) = @_;
356 my( $bucket, $item, $evt);
358 ( $item, $evt ) = $U->fetch_container_item_e( $e, $itemid, $class );
361 ( $bucket, $evt ) = $U->fetch_container_e($e, $item->bucket, $class);
364 if( $bucket->owner ne $e->requestor->id ) {
365 my $owner = $e->retrieve_actor_user($bucket->owner)
366 or return $e->die_event;
367 return $e->event unless $e->allowed('DELETE_CONTAINER_ITEM', $owner->home_ou);
371 if( $class eq 'copy' ) {
372 return $e->event unless
373 $stat = $e->delete_container_copy_bucket_item($item);
376 if( $class eq 'callnumber' ) {
377 return $e->event unless
378 $stat = $e->delete_container_call_number_bucket_item($item);
381 if( $class eq 'biblio' ) {
382 return $e->event unless
383 $stat = $e->delete_container_biblio_record_entry_bucket_item($item);
386 if( $class eq 'user') {
387 return $e->event unless
388 $stat = $e->delete_container_user_bucket_item($item);
395 __PACKAGE__->register_method(
396 method => 'full_delete',
397 api_name => 'open-ils.actor.container.full_delete',
398 notes => "Complety removes a container including all attached items",
402 my( $self, $client, $authtoken, $class, $containerId ) = @_;
403 my( $container, $evt);
405 my $e = new_editor(xact=>1, authtoken=>$authtoken);
406 return $e->event unless $e->checkauth;
408 ( $container, $evt ) = $apputils->fetch_container_e($e, $containerId, $class);
411 if( $container->owner ne $e->requestor->id ) {
412 my $owner = $e->retrieve_actor_user($container->owner)
413 or return $e->die_event;
414 return $e->event unless $e->allowed('DELETE_CONTAINER', $owner->home_ou);
419 my @s = ({bucket => $containerId}, {idlist=>1});
421 if( $class eq 'copy' ) {
422 $items = $e->search_container_copy_bucket_item(@s);
425 if( $class eq 'callnumber' ) {
426 $items = $e->search_container_call_number_bucket_item(@s);
429 if( $class eq 'biblio' ) {
430 $items = $e->search_container_biblio_record_entry_bucket_item(@s);
433 if( $class eq 'user') {
434 $items = $e->search_container_user_bucket_item(@s);
437 __item_delete($e, $class, $_) for @$items;
440 if( $class eq 'copy' ) {
441 return $e->event unless
442 $stat = $e->delete_container_copy_bucket($container);
445 if( $class eq 'callnumber' ) {
446 return $e->event unless
447 $stat = $e->delete_container_call_number_bucket($container);
450 if( $class eq 'biblio' ) {
451 return $e->event unless
452 $stat = $e->delete_container_biblio_record_entry_bucket($container);
455 if( $class eq 'user') {
456 return $e->event unless
457 $stat = $e->delete_container_user_bucket($container);
464 __PACKAGE__->register_method(
465 method => 'container_update',
466 api_name => 'open-ils.actor.container.update',
468 Updates the given container item.
469 @param authtoken The login session key
470 @param class The container class
471 @param container The container item
472 @return true on success, 0 on no update, Event on error
476 sub container_update {
477 my( $self, $conn, $authtoken, $class, $container ) = @_;
479 my $e = new_editor(xact=>1, authtoken=>$authtoken);
480 return $e->event unless $e->checkauth;
482 my ( $dbcontainer, $evt ) = $U->fetch_container_e($e, $container->id, $class);
485 if( $e->requestor->id ne $container->owner ) {
486 return $e->event unless $e->allowed('UPDATE_CONTAINER');
490 if( $class eq 'copy' ) {
491 return $e->event unless
492 $stat = $e->update_container_copy_bucket($container);
495 if( $class eq 'callnumber' ) {
496 return $e->event unless
497 $stat = $e->update_container_call_number_bucket($container);
500 if( $class eq 'biblio' ) {
501 return $e->event unless
502 $stat = $e->update_container_biblio_record_entry_bucket($container);
505 if( $class eq 'user') {
506 return $e->event unless
507 $stat = $e->update_container_user_bucket($container);