return $e->data->id;
}
+# _check_for_existing_bucket_items() is used later by session_perform_search()
+sub _check_for_existing_bucket_items {
+ my ($e, $session) = @_;
-__PACKAGE__->register_method(
- method => "session_perform_search",
- api_name => "open-ils.url_verify.session_perform_search",
- signature => {
- desc => q/
- Perform the search contained in the session, populating the linked bucket
- /,
- params => [
- {desc => "Authentication token", type => "string"},
- {desc => "url_verify.session id", type => "number"},
- ],
- return => {desc => "1 for success, event on failure", type => "number"}
- }
-);
-
-# XXX TODO send progress updates?
-# XXX TODO either blow away old search results or refuse to start (consider)
-sub session_perform_search {
- my ($self, $client, $auth, $ses_id) = @_;
+ my $items = $e->json_query(
+ {
+ select => {cbrebi => ['id']},
+ from => {cbrebi => {}},
+ where => {bucket => $session->container},
+ limit => 1
+ }
+ ) or return $e->die_event;
- my $e = new_editor(authtoken => $auth);
- return $e->die_event unless $e->checkauth;
+ return new OpenILS::Event("URL_VERIFY_SESSION_ALREADY_SEARCHED") if @$items;
- my $session = $e->retrieve_url_verify_session(int($ses_id));
+ return;
+}
- return $e->die_event unless
- $session and $e->allowed("VERIFY_URL", $session->owning_lib);
+# _get_all_search_results() is used later by session_perform_search()
+sub _get_all_search_results {
+ my ($client, $session) = @_;
my @result_ids;
- # Don't loop if the user has specific their own offset.
+ # Don't loop if the user has specified their own offset.
if ($session->search =~ /offset\(\d+\)/) {
my $res = $U->simplereq(
"open-ils.search",
my $so_far = 0;
do {
- my $search = $session->search .
- " offset(" . scalar(@result_ids) . ")";
+ my $search = $session->search . " offset(".scalar(@result_ids).")";
my $res = $U->simplereq(
"open-ils.search",
} while ($count - scalar(@result_ids) > 0);
}
+ return (undef, @result_ids);
+}
+
+
+__PACKAGE__->register_method(
+ method => "session_perform_search",
+ api_name => "open-ils.url_verify.session_perform_search",
+ signature => {
+ desc => q/
+ Perform the search contained in the session,
+ populating the linked bucket /,
+ params => [
+ {desc => "Authentication token", type => "string"},
+ {desc => "url_verify.session id", type => "number"},
+ ],
+ return => {
+ desc => "Number of search results on success, event on failure",
+ type => "number"
+ }
+ }
+);
+
+# XXX TODO send progress updates?
+sub session_perform_search {
+ my ($self, $client, $auth, $ses_id) = @_;
+
+ my $e = new_editor(authtoken => $auth);
+ return $e->die_event unless $e->checkauth;
+
+ my $session = $e->retrieve_url_verify_session(int($ses_id));
+
+ return $e->die_event unless
+ $session and $e->allowed("VERIFY_URL", $session->owning_lib);
+
+ if ($session->creator != $e->requestor->id) {
+ $e->disconnect;
+ return new OpenILS::Event("URL_VERIFY_NOT_SESSION_CREATOR");
+ }
+
+ my $delete_error =
+ _check_for_existing_bucket_items($e, $session);
+
+ if ($delete_error) {
+ $e->disconnect;
+ return $delete_error;
+ }
+
+ my ($search_error, @result_ids) =
+ _get_all_search_results($client, $session);
+
+ if ($search_error) {
+ $e->disconnect;
+ return $search_error;
+ }
+
$e->xact_begin;
# Make and save a bucket item for each search result.
$bucket_item->bucket($session->container);
$bucket_item->target_biblio_record_entry($bre_id);
- $bucket_item->pos($pos++); # we don't actually care
+ $bucket_item->pos($pos++);
$e->create_container_biblio_record_entry_bucket_item($bucket_item) or
return $e->die_event;
}
$e->xact_commit;
- return 1;
+ return $pos;
}
1;