1 use strict; use warnings;
2 package OpenILS::Application::Cat;
3 use OpenILS::Application::AppUtils;
4 use OpenSRF::Application;
5 use OpenILS::Application::Cat::Utils;
6 use base qw/OpenSRF::Application/;
7 use Time::HiRes qw(time);
8 use OpenSRF::EX qw(:try);
10 use OpenILS::Utils::Fieldmapper;
12 my $utils = "OpenILS::Application::Cat::Utils";
16 OpenSRF::Application->method_lookup( "blah" );
18 warn "Child Init Failed: " . shift() . "\n";
23 __PACKAGE__->register_method(
24 method => "biblio_record_tree_retrieve",
25 api_name => "open-ils.cat.biblio.record.tree.retrieve",
27 note => "Returns the tree associated with the nodeset of the given doc id"
30 sub biblio_record_tree_retrieve {
32 my( $self, $client, $recordid ) = @_;
34 my $name = "open-ils.storage.biblio.record_marc.retrieve";
35 my $session = OpenSRF::AppSession->create( "open-ils.storage" );
36 my $request = $session->request( $name, $recordid );
37 my $response = $request->recv();
38 warn "got response from storage in retrieve for $recordid\n";
41 throw OpenSRF::EX::ERROR ("No record in database with id $recordid");
44 if( $response->isa("OpenSRF::EX")) {
45 throw $response ($response->stringify);
48 warn "grabbing content in retrieve\n";
49 my $marcxml = $response->content;
52 throw OpenSRF::EX::ERROR
53 ("No record in database with id $recordid");
57 $session->disconnect();
60 warn "turning into nodeset\n";
61 my $nodes = OpenILS::Utils::FlatXML->new()->xml_to_nodeset( $marcxml->marc );
62 warn "turning nodeset into tree\n";
63 my $tree = $utils->nodeset2tree( $nodes->nodeset );
65 $tree->owner_doc( $marcxml->id() );
67 warn "returning tree\n";
72 __PACKAGE__->register_method(
73 method => "biblio_record_tree_commit",
74 api_name => "open-ils.cat.biblio.record.tree.commit",
75 argc => 3, #(session_id, biblio_tree )
76 note => "Walks the tree and commits any changed nodes " .
77 "adds any new nodes, and deletes any deleted nodes",
80 sub biblio_record_tree_commit {
82 my( $self, $client, $user_session, $tree ) = @_;
83 new Fieldmapper::biblio::record_node ($tree);
87 throw OpenSRF::EX::InvalidArg
88 ("Not enough args to to open-ils.cat.biblio.record.tree.commit")
89 unless ( $user_session and $client and $tree );
92 OpenILS::Application::AppUtils->check_user_session( $user_session ); #throws EX on error
95 my $docid = $tree->owner_doc();
97 # turn the tree into a nodeset
98 my $nodeset = $utils->tree2nodeset($tree);
99 $nodeset = $utils->clean_nodeset( $nodeset );
101 if(!defined($docid)) { # be sure
102 for my $node (@$nodeset) {
103 $docid = $node->owner_doc();
104 last if defined($docid);
108 # turn the nodeset into a doc
109 my $marcxml = OpenILS::Utils::FlatXML->new()->nodeset_to_xml( $nodeset );
111 my $biblio = Fieldmapper::biblio::record_marc->new();
112 $biblio->id( $docid );
113 $biblio->marc( $marcxml->toString() );
115 warn "Starting db session\n";
116 my $session = OpenILS::Application::AppUtils->start_db_session();
118 my $x = _update_record_metadata( $session, { user => $user_obj, docid => $docid } );
119 OpenILS::Application::AppUtils->rollback_db_session($session) unless $x;
121 warn "Sending updated doc $docid to db\n";
122 my $req = $session->request( "open-ils.storage.biblio.record_marc.update", $biblio );
124 my $status = $req->recv();
125 if( !$status || $status->isa("Error") || ! $status->content) {
126 OpenILS::Application::AppUtils->rollback_db_session($session);
127 if($status->isa("Error")) { throw $status ($status); }
128 throw OpenSRF::EX::ERROR ("Error updating biblio record");
132 OpenILS::Application::AppUtils->commit_db_session( $session );
134 $nodeset = OpenILS::Utils::FlatXML->new()->xmldoc_to_nodeset($marcxml);
135 $tree = $utils->nodeset2tree($nodeset->nodeset);
136 $tree->owner_doc($docid);
138 $client->respond_complete($tree);
142 # Send the doc to the wormer for wormizing
143 warn "Starting worm session\n";
144 my $wses = OpenSRF::AppSession->create("open-ils.worm");
150 my $wreq = $wses->request(
151 "open-ils.worm.wormize.marc", $docid, $marcxml->toString );
152 warn "Calling worm receive\n";
153 $wresp = $wreq->recv();
155 if( $wresp && $wresp->can("content") and $wresp->content ) {
161 warn "Looping in worm call\n";
167 warn "wormizing failed, rolling back\n";
168 if($wresp and $wresp->isa("Error") ) {
169 OpenILS::Application::AppUtils->rollback_db_session($session);
170 throw $wresp ($wresp->stringify);
176 OpenILS::Application::AppUtils->rollback_db_session($session);
178 throw OpenSRF::EX::ERROR ("Wormizing Failed for $docid" );
184 warn "Done wormizing\n";
190 __PACKAGE__->register_method(
191 method => "biblio_record_record_metadata",
192 api_name => "open-ils.cat.biblio.record.metadata.retrieve",
193 argc => 1, #(session_id, biblio_tree )
194 note => "Walks the tree and commits any changed nodes " .
195 "adds any new nodes, and deletes any deleted nodes",
198 sub biblio_record_record_metadata {
199 my( $self, $client, @ids ) = @_;
201 if(!@ids){return undef;}
203 my $session = OpenSRF::AppSession->create("open-ils.storage");
204 my $request = $session->request(
205 "open-ils.storage.biblio.record_entry.batch.retrieve", @ids );
209 while( my $response = $request->recv() ) {
212 throw OpenSRF::EX::ERROR ("No Response from Storage");
214 if($response->isa("Error")) {
215 throw $response ($response->stringify);
218 my $record_entry = $response->content;
220 my $creator = $record_entry->creator;
221 my $editor = $record_entry->editor;
223 ($creator, $editor) = _get_userid_by_id($creator, $editor);
225 $record_entry->creator( $creator );
226 $record_entry->editor( $editor );
228 push @$results, $record_entry;
232 $session->disconnect();
240 sub _get_userid_by_id {
245 my $session = OpenSRF::AppSession->create( "open-ils.storage" );
246 my $request = $session->request(
247 "open-ils.storage.actor.user.batch.retrieve.atomic", @ids );
249 my $response = $request->recv();
250 if(!$response) { return undef; }
252 if($response->isa("Error")){
253 throw $response ($response);
256 for my $u (@{$response->content}) {
258 push @users, $u->usrname;
262 $session->disconnect;
268 # open-ils.storage.actor.user.search.usrid
270 sub _get_id_by_userid {
275 my $session = OpenSRF::AppSession->create( "open-ils.storage" );
276 my $request = $session->request(
277 "open-ils.storage.actor.user.search.usrid", @users );
279 my $response = $request->recv();
280 if(!$response) { return undef; }
282 if($response->isa("Error")){
283 throw $response ($response);
286 for my $u (@{$response->content}) {
292 $session->disconnect;
299 # commits metadata objects to the db
300 sub _update_record_metadata {
302 my ($session, @docs ) = @_;
304 for my $doc (@docs) {
306 my $user_obj = $doc->{user};
307 my $docid = $doc->{docid};
309 warn "Updating metata for doc $docid\n";
311 # ----------------------------------------
312 # grab the meta information and update it
313 my $user_session = OpenSRF::AppSession->create("open-ils.storage");
314 my $user_request = $user_session->request(
315 "open-ils.storage.biblio.record_entry.retrieve", $docid );
316 my $meta = $user_request->recv();
319 throw OpenSRF::EX::ERROR ("No meta info returned for biblio $docid");
321 if($meta->isa("Error")) {
322 throw $meta ($meta->stringify);
325 $meta = $meta->content;
326 my ($id) = _get_id_by_userid($user_obj->usrid);
327 warn "got $id from _get_id_by_userid\n";
330 $user_request->finish;
331 $user_session->disconnect;
332 $user_session->kill_me;
333 # -------------------------------------
335 warn "Grabbed the record, updating and moving on\n";
337 my $request = $session->request(
338 "open-ils.storage.biblio.record_entry.update", $meta );
340 my $response = $request->recv();
342 throw OpenSRF::EX::ERROR
343 ("Error commit record metadata for " . $meta->id);
346 if($response->isa("Error")){
347 throw $response ($response->stringify);
353 warn "committing metarecord update\n";
361 __PACKAGE__->register_method(
362 method => "retrieve_copies",
363 api_name => "open-ils.cat.asset.copy_tree.retrieve",
364 argc => 2, #(user_session, record_id)
366 Returns the copies for a given bib record and for the users home library
370 sub retrieve_copies {
372 my( $self, $client, $user_session, $docid, $home_ou ) = @_;
380 OpenILS::Application::AppUtils->check_user_session( $user_session ); #throws EX on error
381 $home_ou = $user_obj->home_ou;
384 my $session = OpenSRF::AppSession->create( "open-ils.storage" );
386 # ------------------------------------------------------
387 # grab the short name of the library location
388 my $request = $session->request(
389 "open-ils.storage.actor.org_unit.retrieve", $home_ou );
391 my $org_unit = $request->recv();
393 throw OpenSRF::EX::ERROR
394 ("No response from storage for org unit search");
396 if($org_unit->isa("Error")) { throw $org_unit ($org_unit->stringify);}
397 my $location = $org_unit->content->shortname;
399 # ------------------------------------------------------
402 # ------------------------------------------------------
403 # grab all the volumes for the given record and location
404 my $search_hash = { record => $docid, owning_lib => $location };
408 $request = $session->request(
409 "open-ils.storage.asset.call_number.search", $search_hash );
414 while( $volume = $request->recv() ) {
416 if($volume->isa("Error")) {
417 throw $volume ($volume->stringify);}
419 $volume = $volume->content;
421 warn "Grabbing copies for volume: " . $volume->id . "\n";
423 OpenILS::Application::AppUtils->simple_scalar_request( "open-ils.storage",
424 "open-ils.storage.asset.copy.search.call_number", $volume->id );
426 $volume->copies($copies);
428 $client->respond( $volume );
430 #push @$results, $volume;
436 $session->disconnect();
447 __PACKAGE__->register_method(
448 method => "retrieve_copies_global",
449 api_name => "open-ils.cat.asset.copy_tree.global.retrieve",
450 argc => 2, #(user_session, record_id)
452 Returns all volumes and attached copies for a given bib record
456 sub retrieve_copies_global {
458 my( $self, $client, $user_session, $docid ) = @_;
462 my $session = OpenSRF::AppSession->create( "open-ils.storage" );
464 # ------------------------------------------------------
465 # grab all the volumes for the given record and location
466 my $request = $session->request(
467 "open-ils.storage.asset.call_number.search.record", $docid );
469 my $volumes = $request->recv();
472 if($volumes->isa("Error")) {
473 throw $volumes ($volumes->stringify);}
475 $volumes = $volumes->content;
482 for my $volume (@$volumes) {
483 $vol_hash->{$volume->id} = $volume;
486 my @ii = keys %$vol_hash;
487 warn "Searching volumes @ii\n";
489 $request = $session->request(
490 "open-ils.storage.asset.copy.search.call_number", keys %$vol_hash );
492 while( my $copylist = $request->recv ) {
494 if(UNIVERSAL::isa( $copylist, "Error")) {
495 throw $copylist ($copylist->stringify);
498 warn "received copy list " . time() . "\n";
499 $copylist = $copylist->content;
502 for my $copy (@$copylist) {
503 $vol = $vol_hash->{$copy->call_number} unless $vol;
504 $vol->copies([]) unless $vol->copies();
505 push @{$vol->copies}, $copy;
507 $client->respond( $vol );
514 $session->disconnect();
523 __PACKAGE__->register_method(
524 method => "create_copies",
525 api_name => "open-ils.cat.asset.copy.batch.create",
526 argc => 2, #(user_session, record_id)
527 note => "Adds the given copies to the database"
531 my( $self, $client, $user_session, @copies ) = @_;
534 OpenILS::Application::AppUtils->check_user_session( $user_session ); #throws EX on error
536 for my $copy (@copies) {
537 $copy->editor( $user_obj->id );
538 $copy->creator( $user_obj->id );
541 my $session = OpenILS::Application::AppUtils->start_db_session;
542 my $request = $session->request(
543 "open-ils.storage.asset.copy.batch.create", @copies );
545 my $result = $request->recv();
548 OpenILS::Application::AppUtils->rollback_db_session($session);
549 throw OpenSRF::EX::ERROR
550 ("No response from storage on copy.batch.create");
553 if(UNIVERSAL::isa($result, "Error")) {
554 OpenILS::Application::AppUtils->rollback_db_session($session);
555 throw $result ($result->stringify);
558 OpenILS::Application::AppUtils->commit_db_session($session);
559 return $result->content;
564 __PACKAGE__->register_method(
565 method => "edit_copies",
566 api_name => "open-ils.cat.asset.copy.batch.update",
567 argc => 2, #(user_session, record_id)
568 note => "Updates the given copies",
573 my( $self, $client, $user_session, @copies ) = @_;
576 OpenILS::Application::AppUtils->check_user_session( $user_session ); #throws EX on error
578 for my $copy (@copies) {
579 $copy->editor( $user_obj->id );
582 my $session = OpenILS::Application::AppUtils->start_db_session;
583 my $request = $session->request(
584 "open-ils.storage.asset.copy.batch.update", @copies );
586 my $result = $request->recv();
589 OpenILS::Application::AppUtils->rollback_db_session($session);
590 throw OpenSRF::EX::ERROR
591 ("No response from storage on copy.batch.update");
594 if(UNIVERSAL::isa($result, "Error")) {
595 OpenILS::Application::AppUtils->rollback_db_session($session);
596 throw $result ($result->stringify);
599 OpenILS::Application::AppUtils->commit_db_session($session);
600 return $result->content;
606 __PACKAGE__->register_method(
607 method => "delete_copies",
608 api_name => "open-ils.cat.asset.copy.batch.delete",
609 argc => 2, #(user_session, record_id)
610 note => "Removes the given copies from the database",
615 my( $self, $client, $user_session, @copies ) = @_;
618 OpenILS::Application::AppUtils->check_user_session( $user_session ); #throws EX on error
620 for my $copy (@copies) {
621 $copy->editor( $user_obj->id );
625 my $session = OpenILS::Application::AppUtils->start_db_session;
626 my $request = $session->request(
627 "open-ils.storage.asset.copy.batch.update", @copies );
629 my $result = $request->recv();
632 OpenILS::Application::AppUtils->rollback_db_session($session);
633 throw OpenSRF::EX::ERROR
634 ("No response from storage on copy.batch.delete");
637 if(UNIVERSAL::isa($result, "Error")) {
638 OpenILS::Application::AppUtils->rollback_db_session($session);
639 throw $result ($result->stringify);
642 OpenILS::Application::AppUtils->commit_db_session($session);
643 return $result->content;