LP#1673870: Add basic ebook API title lookup
authorJeff Davis <jdavis@sitka.bclibraries.ca>
Fri, 17 Mar 2017 20:04:09 +0000 (13:04 -0700)
committerBill Erickson <berickxx@gmail.com>
Fri, 1 Sep 2017 20:06:50 +0000 (16:06 -0400)
Adds an API method to obtain the title and author (and, eventually,
cover image URL) for a given ebook via the open-ils.ebook_api service.

Signed-off-by: Jeff Davis <jdavis@sitka.bclibraries.ca>
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
Signed-off-by: Bill Erickson <berickxx@gmail.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI/OneClickdigital.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/EbookAPI/Test.pm
Open-ILS/src/perlmods/live_t/20-lp1541559-ebook-api.t

index 1b3c8c6..e09282e 100644 (file)
@@ -380,6 +380,37 @@ sub request {
     }
 }
 
+sub get_details {
+    my ($self, $conn, $session_id, $title_id) = @_;
+    my $handler = new_handler($session_id);
+    return $handler->get_title_info($title_id);
+}
+__PACKAGE__->register_method(
+    method => 'get_details',
+    api_name => 'open-ils.ebook_api.title.details',
+    api_level => 1,
+    argc => 2,
+    signature => {
+        desc => "Get basic metadata for an ebook title",
+        params => [
+            {
+                name => 'session_id',
+                desc => 'The session ID (provided by open-ils.ebook_api.start_session)',
+                type => 'string'
+            },
+            {
+                name => 'title_id',
+                desc => 'The title ID (ISBN, unique identifier, etc.)',
+                type => 'string'
+            }
+        ],
+        return => {
+            desc => 'Success: { title => "Title", author => "Author Name" } / Failure: { error => "Title not found" }',
+            type => 'hashref'
+        }
+    }
+);
+
 sub get_availability {
     my ($self, $conn, $session_id, $title_id) = @_;
     my $handler = new_handler($session_id);
index 166b7c9..be42463 100644 (file)
@@ -127,6 +127,29 @@ sub do_patron_auth {
     return;
 }
 
+# get basic metadata for an item (title, author, cover image if any)
+# GET http://api.oneclickdigital.us/v1/libraries/{libraryId}/titles/{isbn}
+sub get_title_info {
+    my ($self, $isbn) = @_;
+    my $base_uri = $self->{base_uri};
+    my $library_id = $self->{library_id};
+    my $session_id = $self->{session_id};
+    my $req = {
+        method => 'GET',
+        uri    => "$base_uri/libraries/$library_id/titles/$isbn"
+    };
+    my $res = $self->request($req, $session_id);
+    if (defined ($res)) {
+        return {
+            title  => $res->{content}->{title},
+            author => $res->{content}->{authors}[0]{text}
+        };
+    } else {
+        $logger->error("EbookAPI: could not retrieve OneClickdigital title details for ISBN $isbn");
+        return;
+    }
+}
+
 # does this title have available "copies"? y/n
 # GET http://api.oneclickdigital.us/v1/libraries/{libraryID}/media/{isbn}/availability
 sub do_availability_lookup {
index a20846c..a6f3e3f 100644 (file)
@@ -42,6 +42,7 @@
 #   - do_client_auth: authenticate client with external API (e.g. get client
 #     token if needed)
 #   - do_patron_auth: get a patron-specific bearer token, or just the patron ID
+#   - get_title_info: get basic title details (title, author, optional cover image)
 #   - do_holdings_lookup: how many total/available "copies" are there for this
 #     title? (n/a for OneClickdigital)
 #   - do_availability_lookup: does this title have available "copies"? y/n
@@ -164,6 +165,43 @@ sub do_patron_auth {
     return undef;
 }
 
+# get basic info (title, author, eventually a thumbnail URL) for a title
+sub get_title_info {
+    my $self = shift;
+
+    # External ID for title.  Depending on the API, this could be an ISBN
+    # or an identifier unique to that vendor.
+    my $title_id = shift;
+
+    # Prepare data structure to be used as return value.
+    my $title_info = {
+        title  => '',
+        author => ''
+    };
+
+    # If title lookup fails or title is not found, our return value
+    # is somewhat different.
+    my $title_not_found = {
+        error => 'Title not found.'
+    };
+
+    # For testing purposes, we have only three valid titles (001, 002, 003).
+    # All other title IDs return an error message.
+    if ($title_id eq '001') {
+        $title_info->{title} = 'The Fellowship of the Ring';
+        $title_info->{author} = 'J.R.R. Tolkien';
+    } elsif ($title_id eq '002') {
+        $title_info->{title} = 'The Two Towers';
+        $title_info->{author} = 'J.R.R. Tolkien';
+    } elsif ($title_id eq '003') {
+        $title_info->{title} = 'The Return of the King';
+        $title_info->{author} = 'J.R.R. Tolkien';
+    } else {
+        return $title_not_found;
+    }
+    return $title_info;
+}
+
 # get detailed holdings information (copy counts and formats), OR basic
 # availability if detailed info is not provided by the API
 sub do_holdings_lookup {
index 72054a5..6c0aedb 100644 (file)
@@ -1,6 +1,6 @@
 #!perl
 use strict; use warnings;
-use Test::More tests => 21; # XXX
+use Test::More tests => 23; # XXX
 use OpenILS::Utils::TestUtils;
 
 diag("Tests Ebook API");
@@ -57,6 +57,18 @@ ok($new_session_id, 'Initiated new EbookAPI session when valid session ID not pr
 # 3. Title availability and holdings.
 # ------------------------------------------------------------ 
 
+# Title details for valid title ID.
+my $title_001_details_req = $ebook_api->request(
+    'open-ils.ebook_api.title.details', $session_id, '001');
+my $title_001_details = $title_001_details_req->recv->content;
+ok(ref($title_001_details) && $title_001_details->{title}, 'Title details check 1/2 (valid title)');
+
+# Title details for invalid title ID.
+my $title_004_details_req = $ebook_api->request(
+    'open-ils.ebook_api.title.details', $session_id, '004');
+my $title_004_details = $title_004_details_req->recv->content;
+ok(ref($title_004_details) && $title_004_details->{error}, 'Title details check 1/2 (invalid title returns error message)');
+
 # Title is not available.
 my $title_001_avail_req = $ebook_api->request(
     'open-ils.ebook_api.title.availability', $session_id, '001');