Bug 19784: Adapt /v1/patrons to new naming guidelines
authorTomas Cohen Arazi <tomascohen@theke.io>
Fri, 8 Dec 2017 12:35:45 +0000 (09:35 -0300)
committerJonathan Druart <jonathan.druart@bugs.koha-community.org>
Thu, 29 Mar 2018 14:42:08 +0000 (11:42 -0300)
This patch introduces two functions to the patrons endpoint:
- _to_api
- _to_model

This are in charge of field mappings in order to comply with the
guidelines.

Koha::REST::V1:Auth is adjusted to handle 'patron_id' as well. 'borrowernumber'
handling is kept until the existing endpoints get updated.

To test:
- Apply the patches
- Run:
  $ kshell
 k$ prove t/db_dependent/api/v1/*.t
=> SUCCESS: Tests pass!
- Sign off :-D

Signed-off-by: Josef Moravec <josef.moravec@gmail.com>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>

Koha/REST/V1/Auth.pm
Koha/REST/V1/Patrons.pm
api/v1/swagger/definitions/patron.json
api/v1/swagger/parameters.json
api/v1/swagger/parameters/patron.json
api/v1/swagger/paths.json
api/v1/swagger/paths/patrons.json
api/v1/swagger/x-primitives.json

index 77864eb..c76d26f 100644 (file)
@@ -254,7 +254,8 @@ sub check_object_ownership {
 
     my $parameters = {
         accountlines_id => \&_object_ownership_by_accountlines_id,
-        borrowernumber  => \&_object_ownership_by_borrowernumber,
+        borrowernumber  => \&_object_ownership_by_patron_id,
+        patron_id       => \&_object_ownership_by_patron_id,
         checkout_id     => \&_object_ownership_by_checkout_id,
         reserve_id      => \&_object_ownership_by_reserve_id,
     };
@@ -296,10 +297,10 @@ Compares C<$borrowernumber> to currently logged in C<$user>.
 
 =cut
 
-sub _object_ownership_by_borrowernumber {
-    my ($c, $user, $borrowernumber) = @_;
+sub _object_ownership_by_patron_id {
+    my ($c, $user, $patron_id) = @_;
 
-    return $user->borrowernumber == $borrowernumber;
+    return $user->borrowernumber == $patron_id;
 }
 
 =head3 _object_ownership_by_checkout_id
index 42a2b15..2c1934a 100644 (file)
@@ -43,14 +43,46 @@ sub list {
     my $c = shift->openapi->valid_input or return;
 
     return try {
-        my $patrons_set = Koha::Patrons->new;
-        my $patrons = $c->objects->search( $patrons_set );
-        return $c->render( status => 200, openapi => $patrons );
+        my $attributes = {};
+        my $args = $c->validation->output;
+        my ( $params, $reserved_params ) = $c->extract_reserved_params( $args );
+
+        # Merge sorting into query attributes
+        $c->dbic_merge_sorting({ attributes => $attributes, params => $reserved_params });
+
+        # Merge pagination into query attributes
+        $c->dbic_merge_pagination({ filter => $attributes, params => $reserved_params });
+
+        my $restricted = $args->{restricted};
+
+        $params = _to_model($params)
+            if defined $params;
+        # deal with string params
+        $params = $c->build_query_params( $params, $reserved_params );
+
+        # translate 'restricted' => 'debarred'
+        $params->{debarred} = { '!=' => undef }
+          if $restricted;
+
+        my $patrons = Koha::Patrons->search( $params, $attributes );
+        if ( $patrons->is_paged ) {
+            $c->add_pagination_headers(
+                {
+                    total  => $patrons->pager->total_entries,
+                    params => $args,
+                }
+            );
+        }
+        my @patrons = $patrons->as_list;
+        @patrons = map { _to_api( $_->TO_JSON ) } @patrons;
+        return $c->render( status => 200, openapi => \@patrons );
     }
     catch {
         if ( $_->isa('DBIx::Class::Exception') ) {
-            return $c->render( status => 500,
-                openapi => { error => $_->{msg} } );
+            return $c->render(
+                status  => 500,
+                openapi => { error => $_->{msg} }
+            );
         }
         else {
             return $c->render(
@@ -61,6 +93,7 @@ sub list {
     };
 }
 
+
 =head3 get
 
 Controller function that handles retrieving a single Koha::Patron object
@@ -70,14 +103,14 @@ Controller function that handles retrieving a single Koha::Patron object
 sub get {
     my $c = shift->openapi->valid_input or return;
 
-    my $borrowernumber = $c->validation->param('borrowernumber');
-    my $patron = Koha::Patrons->find($borrowernumber);
+    my $patron_id = $c->validation->param('patron_id');
+    my $patron    = Koha::Patrons->find($patron_id);
 
     unless ($patron) {
-        return $c->render(status => 404, openapi => { error => "Patron not found." });
+        return $c->render( status => 404, openapi => { error => "Patron not found." } );
     }
 
-    return $c->render(status => 200, openapi => $patron);
+    return $c->render( status => 200, openapi => _to_api( $patron->TO_JSON ) );
 }
 
 =head3 add
@@ -91,11 +124,11 @@ sub add {
 
     return try {
 
-        my $body = _to_model($c->validation->param('body'));
+        my $body = _to_model( $c->validation->param('body') );
 
         # TODO: Use AddMember until it has been moved to Koha-namespace
-        my $borrowernumber = AddMember(%$body);
-        my $patron         = Koha::Patrons->find($borrowernumber);
+        my $patron_id = AddMember( %{ _to_model($body) } );
+        my $patron    = _to_api( Koha::Patrons->find($patron_id)->TO_JSON );
 
         return $c->render( status => 201, openapi => $patron );
     }
@@ -103,9 +136,7 @@ sub add {
         unless ( blessed $_ && $_->can('rethrow') ) {
             return $c->render(
                 status  => 500,
-                openapi => {
-                    error => "Something went wrong, check Koha logs for details."
-                }
+                openapi => { error => "Something went wrong, check Koha logs for details." }
             );
         }
         if ( $_->isa('Koha::Exceptions::Object::DuplicateID') ) {
@@ -117,26 +148,33 @@ sub add {
         elsif ( $_->isa('Koha::Exceptions::Object::FKConstraint') ) {
             return $c->render(
                 status  => 400,
-                openapi => { error => "Given " . $_->broken_fk . " does not exist" }
+                openapi => {
+                          error => "Given "
+                        . $Koha::REST::V1::Patrons::to_api_mapping->{ $_->broken_fk }
+                        . " does not exist"
+                }
             );
         }
         elsif ( $_->isa('Koha::Exceptions::BadParameter') ) {
             return $c->render(
                 status  => 400,
-                openapi => { error => "Given " . $_->parameter . " does not exist" }
+                openapi => {
+                          error => "Given "
+                        . $Koha::REST::V1::Patrons::to_api_mapping->{ $_->parameter }
+                        . " does not exist"
+                }
             );
         }
         else {
             return $c->render(
                 status  => 500,
-                openapi => {
-                    error => "Something went wrong, check Koha logs for details."
-                }
+                openapi => { error => "Something went wrong, check Koha logs for details." }
             );
         }
     };
 }
 
+
 =head3 update
 
 Controller function that handles updating a Koha::Patron object
@@ -146,7 +184,7 @@ Controller function that handles updating a Koha::Patron object
 sub update {
     my $c = shift->openapi->valid_input or return;
 
-    my $patron_id = $c->validation->param('borrowernumber');
+    my $patron_id = $c->validation->param('patron_id');
     my $patron    = Koha::Patrons->find( $patron_id );
 
     unless ($patron) {
@@ -195,7 +233,9 @@ sub update {
         elsif ( $_->isa('Koha::Exceptions::Object::FKConstraint') ) {
             return $c->render(
                 status  => 400,
-                openapi => { error => "Given " . $_->broken_fk . " does not exist" }
+                openapi => { error => "Given " .
+                            $Koha::REST::V1::Patrons::to_api_mapping->{$_->broken_fk}
+                            . " does not exist" }
             );
         }
         elsif ( $_->isa('Koha::Exceptions::MissingParameter') ) {
@@ -246,7 +286,7 @@ sub delete {
     my $patron;
 
     return try {
-        $patron = Koha::Patrons->find( $c->validation->param('borrowernumber') );
+        $patron = Koha::Patrons->find( $c->validation->param('patron_id') );
 
         # check if loans, reservations, debarrment, etc. before deletion!
         my $res = $patron->delete;
@@ -271,6 +311,41 @@ sub delete {
     };
 }
 
+=head3 _to_api
+
+Helper function that maps unblessed Koha::Patron objects into REST api
+attribute names.
+
+=cut
+
+sub _to_api {
+    my $patron    = shift;
+    my $patron_id = $patron->{ borrowernumber };
+
+    # Rename attributes
+    foreach my $column ( keys %{ $Koha::REST::V1::Patrons::to_api_mapping } ) {
+        my $mapped_column = $Koha::REST::V1::Patrons::to_api_mapping->{$column};
+        if (    exists $patron->{ $column }
+             && defined $mapped_column )
+        {
+            # key != undef
+            $patron->{ $mapped_column } = delete $patron->{ $column };
+        }
+        elsif (    exists $patron->{ $column }
+                && !defined $mapped_column )
+        {
+            # key == undef
+            delete $patron->{ $column };
+        }
+    }
+
+    # Calculate the 'restricted' field
+    my $patron_obj = Koha::Patrons->find( $patron_id );
+    $patron->{ restricted } = ($patron_obj->is_debarred) ? Mojo::JSON->true : Mojo::JSON->false;
+
+    return $patron;
+}
+
 =head3 _to_model
 
 Helper function that maps REST api objects into Koha::Patron
@@ -279,12 +354,146 @@ attribute names.
 =cut
 
 sub _to_model {
-    my $params = shift;
+    my $patron = shift;
+
+    foreach my $attribute ( keys %{ $Koha::REST::V1::Patrons::to_model_mapping } ) {
+        my $mapped_attribute = $Koha::REST::V1::Patrons::to_model_mapping->{$attribute};
+        if (    exists $patron->{ $attribute }
+             && defined $mapped_attribute )
+        {
+            # key => !undef
+            $patron->{ $mapped_attribute } = delete $patron->{ $attribute };
+        }
+        elsif (    exists $patron->{ $attribute }
+                && !defined $mapped_attribute )
+        {
+            # key => undef / to be deleted
+            delete $patron->{ $attribute };
+        }
+    }
+
+    # TODO: Get rid of this once write operations are based on Koha::Patron
+    if ( exists $patron->{lost} ) {
+        $patron->{lost} = ($patron->{lost}) ? 1 : 0;
+    }
 
-    $params->{lost} = ($params->{lost}) ? 1 : 0;
-    $params->{gonenoaddress} = ($params->{gonenoaddress}) ? 1 : 0;
+    if ( exists $patron->{ gonenoaddress} ) {
+        $patron->{gonenoaddress} = ($patron->{gonenoaddress}) ? 1 : 0;
+    }
 
-    return $params;
+    return $patron;
 }
 
+=head2 Global variables
+
+=head3 $to_api_mapping
+
+=cut
+
+our $to_api_mapping = {
+    borrowernotes       => 'staff_notes',
+    borrowernumber      => 'patron_id',
+    branchcode          => 'library_id',
+    categorycode        => 'category_id',
+    checkprevcheckout   => 'check_previous_checkout',
+    contactfirstname    => undef, # Unused
+    contactname         => undef, # Unused
+    contactnote         => 'altaddress_notes',
+    contacttitle        => undef, # Unused
+    dateenrolled        => 'date_enrolled',
+    dateexpiry          => 'expiry_date',
+    dateofbirth         => 'date_of_birth',
+    debarred            => undef, # replaced by 'restricted'
+    debarredcomment     => undef, # calculated, API consumers will use /restrictions instead
+    emailpro            => 'secondary_email',
+    flags               => undef, # permissions manipulation handled in /permissions
+    gonenoaddress       => 'incorrect_address',
+    guarantorid         => 'guarantor_id',
+    lastseen            => 'last_seen',
+    lost                => 'patron_card_lost',
+    opacnote            => 'opac_notes',
+    othernames          => 'other_name',
+    password            => undef, # password manipulation handled in /password
+    phonepro            => 'secondary_phone',
+    relationship        => 'relationship_type',
+    sex                 => 'gender',
+    smsalertnumber      => 'sms_number',
+    sort1               => 'statistics_1',
+    sort2               => 'statistics_2',
+    streetnumber        => 'street_number',
+    streettype          => 'street_type',
+    zipcode             => 'postal_code',
+    B_address           => 'altaddress_address',
+    B_address2          => 'altaddress_address2',
+    B_city              => 'altaddress_city',
+    B_country           => 'altaddress_country',
+    B_email             => 'altaddress_email',
+    B_phone             => 'altaddress_phone',
+    B_state             => 'altaddress_state',
+    B_streetnumber      => 'altaddress_street_number',
+    B_streettype        => 'altaddress_street_type',
+    B_zipcode           => 'altaddress_postal_code',
+    altcontactaddress1  => 'altcontact_address',
+    altcontactaddress2  => 'altcontact_address2',
+    altcontactaddress3  => 'altcontact_city',
+    altcontactcountry   => 'altcontact_country',
+    altcontactfirstname => 'altcontact_firstname',
+    altcontactphone     => 'altcontact_phone',
+    altcontactsurname   => 'altcontact_surname',
+    altcontactstate     => 'altcontact_state',
+    altcontactzipcode   => 'altcontact_postal_code'
+};
+
+=head3 $to_model_mapping
+
+=cut
+
+our $to_model_mapping = {
+    altaddress_notes         => 'contactnote',
+    category_id              => 'categorycode',
+    check_previous_checkout  => 'checkprevcheckout',
+    date_enrolled            => 'dateenrolled',
+    date_of_birth            => 'dateofbirth',
+    expiry_date              => 'dateexpiry',
+    gender                   => 'sex',
+    guarantor_id             => 'guarantorid',
+    incorrect_address        => 'gonenoaddress',
+    last_seen                => 'lastseen',
+    library_id               => 'branchcode',
+    opac_notes               => 'opacnote',
+    other_name               => 'othernames',
+    patron_card_lost         => 'lost',
+    patron_id                => 'borrowernumber',
+    postal_code              => 'zipcode',
+    relationship_type        => 'relationship',
+    restricted               => undef,
+    secondary_email          => 'emailpro',
+    secondary_phone          => 'phonepro',
+    sms_number               => 'smsalertnumber',
+    staff_notes              => 'borrowernotes',
+    statistics_1             => 'sort1',
+    statistics_2             => 'sort2',
+    street_number            => 'streetnumber',
+    street_type              => 'streettype',
+    altaddress_address       => 'B_address',
+    altaddress_address2      => 'B_address2',
+    altaddress_city          => 'B_city',
+    altaddress_country       => 'B_country',
+    altaddress_email         => 'B_email',
+    altaddress_phone         => 'B_phone',
+    altaddress_state         => 'B_state',
+    altaddress_street_number => 'B_streetnumber',
+    altaddress_street_type   => 'B_streettype',
+    altaddress_postal_code   => 'B_zipcode',
+    altcontact_firstname     => 'altcontactfirstname',
+    altcontact_surname       => 'altcontactsurname',
+    altcontact_address       => 'altcontactaddress1',
+    altcontact_address2      => 'altcontactaddress2',
+    altcontact_city          => 'altcontactaddress3',
+    altcontact_state         => 'altcontactstate',
+    altcontact_postal_code   => 'altcontactzipcode',
+    altcontact_country       => 'altcontactcountry',
+    altcontact_phone         => 'altcontactphone'
+};
+
 1;
index 948b956..5d6ccd8 100644 (file)
@@ -1,8 +1,8 @@
 {
   "type": "object",
   "properties": {
-    "borrowernumber": {
-      "$ref": "../x-primitives.json#/borrowernumber"
+    "patron_id": {
+      "$ref": "../x-primitives.json#/patron_id"
     },
     "cardnumber": {
       "$ref": "../x-primitives.json#/cardnumber"
@@ -17,7 +17,7 @@
       "type": ["string", "null"],
       "description": "patron's title"
     },
-    "othernames": {
+    "other_name": {
       "type": ["string", "null"],
       "description": "any other names associated with the patron"
     },
       "type": ["string", "null"],
       "description": "initials of the patron"
     },
-    "streetnumber": {
+    "street_number": {
       "type": ["string", "null"],
       "description": "street number of patron's primary address"
     },
-    "streettype": {
+    "street_type": {
       "type": ["string", "null"],
       "description": "street type of patron's primary address"
     },
@@ -49,7 +49,7 @@
       "type": ["string", "null"],
       "description": "state or province of patron's primary address"
     },
-    "zipcode": {
+    "postal_code": {
       "type": ["string", "null"],
       "description": "zip or postal code of patron's primary address"
     },
       "type": ["string", "null"],
       "description": "fax number for patron's primary address"
     },
-    "emailpro": {
+    "secondary_email": {
       "type": ["string", "null"],
       "description": "secondary email address for patron's primary address"
     },
-    "phonepro": {
+    "secondary_phone": {
       "type": ["string", "null"],
       "description": "secondary phone number for patron's primary address"
     },
-    "B_streetnumber": {
+    "altaddress_street_number": {
       "type": ["string", "null"],
       "description": "street number of patron's alternate address"
     },
-    "B_streettype": {
+    "altaddress_street_type": {
       "type": ["string", "null"],
       "description": "street type of patron's alternate address"
     },
-    "B_address": {
+    "altaddress_address": {
       "type": ["string", "null"],
       "description": "first address line of patron's alternate address"
     },
-    "B_address2": {
+    "altaddress_address2": {
       "type": ["string", "null"],
       "description": "second address line of patron's alternate address"
     },
-    "B_city": {
+    "altaddress_city": {
       "type": ["string", "null"],
       "description": "city or town of patron's alternate address"
     },
-    "B_state": {
+    "altaddress_state": {
       "type": ["string", "null"],
       "description": "state or province of patron's alternate address"
     },
-    "B_zipcode": {
+    "altaddress_postal_code": {
       "type": ["string", "null"],
       "description": "zip or postal code of patron's alternate address"
     },
-    "B_country": {
+    "altaddress_country": {
       "type": ["string", "null"],
       "description": "country of patron's alternate address"
     },
-    "B_email": {
+    "altaddress_email": {
       "type": ["string", "null"],
       "description": "email address for patron's alternate address"
     },
-    "B_phone": {
+    "altaddress_phone": {
       "type": ["string", "null"],
       "description": "phone number for patron's alternate address"
     },
-    "dateofbirth": {
+    "date_of_birth": {
       "type": ["string", "null"],
       "format": "date",
       "description": "patron's date of birth"
     },
-    "branchcode": {
+    "library_id": {
       "type": "string",
-      "description": "code of patron's home branch"
+      "description": "Internal identifier for the patron's home library"
     },
-    "categorycode": {
+    "category_id": {
       "type": "string",
-      "description": "code of patron's category"
+      "description": "Internal identifier for the patron's category"
     },
-    "dateenrolled": {
+    "date_enrolled": {
       "type": ["string", "null"],
       "format": "date",
       "description": "date the patron was added to Koha"
     },
-    "dateexpiry": {
+    "expiry_date": {
       "type": ["string", "null"],
       "format": "date",
       "description": "date the patron's card is set to expire"
       "type": ["string", "null"],
       "description": "date the patron's card was last renewed"
     },
-    "gonenoaddress": {
+    "incorrect_address": {
       "type": ["boolean", "null"],
       "description": "set to 1 if library marked this patron as having an unconfirmed address"
     },
-    "lost": {
+    "patron_card_lost": {
       "type": ["boolean", "null"],
       "description": "set to 1 if library marked this patron as having lost his card"
     },
-    "debarred": {
-      "type": ["string", "null"],
-      "format": "date",
-      "description": "until this date the patron can only check-in"
-    },
-    "debarredcomment": {
-      "type": ["string", "null"],
-      "description": "comment on the stop of the patron"
-    },
-    "contactname": {
-      "type": ["string", "null"],
-      "description": "used for children and professionals to include surname or last name of guarantor or organization name"
-    },
-    "contactfirstname": {
-      "type": ["string", "null"],
-      "description": "used for children to include first name of guarantor"
-    },
-    "contacttitle": {
-      "type": ["string", "null"],
-      "description": "used for children to include title of guarantor"
+    "restricted": {
+      "type": "boolean",
+      "readOnly": true,
+      "description": "If any restriction applies to the patron"
     },
-    "guarantorid": {
+    "guarantor_id": {
       "type": ["integer", "null"],
-      "description": "borrowernumber used for children or professionals to link them to guarantor or organizations"
+      "description": "patron_id used for children or professionals to link them to guarantor or organizations"
     },
-    "borrowernotes": {
+    "staff_notes": {
       "type": ["string", "null"],
       "description": "a note on the patron's account"
     },
-    "relationship": {
+    "relationship_type": {
       "type": ["string", "null"],
       "description": "used for children to include the relationship to their guarantor"
     },
-    "sex": {
+    "gender": {
       "type": ["string", "null"],
       "description": "patron's gender"
     },
-    "password": {
-      "type": ["string", "null"],
-      "description": "patron's encrypted password"
-    },
-    "flags": {
-      "type": ["integer", "null"],
-      "description": "a number associated with the patron's permissions"
-    },
     "userid": {
       "type": ["string", "null"],
       "description": "patron's login"
     },
-    "opacnote": {
+    "opac_notes": {
       "type": ["string", "null"],
       "description": "a note on the patron's account visible in OPAC and staff client"
     },
-    "contactnote": {
+    "altaddress_notes": {
       "type": ["string", "null"],
       "description": "a note related to patron's alternate address"
     },
-    "sort1": {
+    "statistics_1": {
       "type": ["string", "null"],
       "description": "a field that can be used for any information unique to the library"
     },
-    "sort2": {
+    "statistics_2": {
       "type": ["string", "null"],
       "description": "a field that can be used for any information unique to the library"
     },
-    "altcontactfirstname": {
+    "altcontact_firstname": {
       "type": ["string", "null"],
       "description": "first name of alternate contact for the patron"
     },
-    "altcontactsurname": {
+    "altcontact_surname": {
       "type": ["string", "null"],
       "description": "surname or last name of the alternate contact for the patron"
     },
-    "altcontactaddress1": {
+    "altcontact_address": {
       "type": ["string", "null"],
       "description": "the first address line for the alternate contact for the patron"
     },
-    "altcontactaddress2": {
+    "altcontact_address2": {
       "type": ["string", "null"],
       "description": "the second address line for the alternate contact for the patron"
     },
-    "altcontactaddress3": {
+    "altcontact_city": {
       "type": ["string", "null"],
       "description": "the city for the alternate contact for the patron"
     },
-    "altcontactstate": {
+    "altcontact_state": {
       "type": ["string", "null"],
       "description": "the state for the alternate contact for the patron"
     },
-    "altcontactzipcode": {
+    "altcontact_postal_code": {
       "type": ["string", "null"],
       "description": "the zipcode for the alternate contact for the patron"
     },
-    "altcontactcountry": {
+    "altcontact_country": {
       "type": ["string", "null"],
       "description": "the country for the alternate contact for the patron"
     },
-    "altcontactphone": {
+    "altcontact_phone": {
       "type": ["string", "null"],
       "description": "the phone number for the alternate contact for the patron"
     },
-    "smsalertnumber": {
+    "sms_number": {
       "type": ["string", "null"],
       "description": "the mobile phone number where the patron would like to receive notices (if SMS turned on)"
     },
       "type": "integer",
       "description": "controls if relatives can see this patron's checkouts"
     },
-    "checkprevcheckout": {
+    "check_previous_checkout": {
       "type": "string",
       "description": "produce a warning for this patron if this item has previously been checked out to this patron if 'yes', not if 'no', defer to category setting if 'inherit'"
     },
       "format": "date-time",
       "description": "time of last change could be useful for synchronization with external systems (among others)"
     },
-    "lastseen": {
+    "last_seen": {
       "type": ["string", "null"],
       "format": "date-time",
       "description": "last time a patron has been seen (connected at the OPAC or staff interface)"
     }
   },
   "additionalProperties": false,
-  "required": ["surname", "address", "city", "branchcode", "categorycode"]
+  "required": ["surname", "address", "city", "library_id", "category_id"]
 }
index 584a0c2..d951cf7 100644 (file)
@@ -1,9 +1,9 @@
 {
-  "borrowernumberPathParam": {
-    "$ref": "parameters/patron.json#/borrowernumberPathParam"
+  "patron_id_pp": {
+    "$ref": "parameters/patron.json#/patron_id_pp"
   },
-  "borrowernumberQueryParam": {
-    "$ref": "parameters/patron.json#/borrowernumberQueryParam"
+  "patron_id_qp": {
+    "$ref": "parameters/patron.json#/patron_id_qp"
   },
   "city_id_pp": {
     "$ref": "parameters/city.json#/city_id_pp"
index 409d0b2..d2114ba 100644 (file)
@@ -1,15 +1,15 @@
 {
-  "borrowernumberPathParam": {
-    "name": "borrowernumber",
+  "patron_id_pp": {
+    "name": "patron_id",
     "in": "path",
     "description": "Internal patron identifier",
     "required": true,
     "type": "integer"
   },
-  "borrowernumberQueryParam": {
-    "name": "borrowernumber",
+  "patron_id_qp": {
+    "name": "patron_id",
     "in": "query",
-    "description": "Internal borrower identifier",
+    "description": "Internal patron identifier",
     "type": "integer"
   }
 }
index df4f55a..f3e843e 100644 (file)
@@ -20,8 +20,8 @@
   "/patrons": {
     "$ref": "paths/patrons.json#/~1patrons"
   },
-  "/patrons/{borrowernumber}": {
-    "$ref": "paths/patrons.json#/~1patrons~1{borrowernumber}"
+  "/patrons/{patron_id}": {
+    "$ref": "paths/patrons.json#/~1patrons~1{patron_id}"
   },
   "/illrequests": {
     "$ref": "paths/illrequests.json#/~1illrequests"
index f4505a8..4a710d6 100644 (file)
@@ -8,9 +8,9 @@
           "application/json"
       ],
       "parameters": [{
-        "name": "borrowernumber",
+        "name": "patron_id",
         "in": "query",
-        "description": "Case insensitive search on borrowernumber",
+        "description": "Search on patron_id",
         "required": false,
         "type": "string"
       }, {
@@ -38,7 +38,7 @@
         "required": false,
         "type": "string"
       }, {
-        "name": "othernames",
+        "name": "other_name",
         "in": "query",
         "description": "Case insensitive search on othernames",
         "required": false,
         "required": false,
         "type": "string"
       }, {
-        "name": "streetnumber",
+        "name": "street_number",
         "in": "query",
         "description": "Case insensitive search on streetnumber",
         "required": false,
         "type": "string"
       }, {
-        "name": "streettype",
+        "name": "street_type",
         "in": "query",
         "description": "Case insensitive search on streettype",
         "required": false,
@@ -86,7 +86,7 @@
         "required": false,
         "type": "string"
       }, {
-        "name": "zipcode",
+        "name": "postal_code",
         "in": "query",
         "description": "Case insensitive search on zipcode",
         "required": false,
         "required": false,
         "type": "string"
       }, {
-        "name": "emailpro",
+        "name": "secondary_email",
         "in": "query",
-        "description": "Case insensitive search on emailpro",
+        "description": "Case insensitive search on secondary_email",
         "required": false,
         "type": "string"
       }, {
-        "name": "phonepro",
+        "name": "secondary_phone",
         "in": "query",
-        "description": "Case insensitive search on phonepro",
+        "description": "Case insensitive search on secondary_phone",
         "required": false,
         "type": "string"
       }, {
-        "name": "B_streetnumber",
+        "name": "altaddress_street_number",
         "in": "query",
-        "description": "Case insensitive search on B_streetnumber",
+        "description": "Case insensitive search on altaddress_street_number",
         "required": false,
         "type": "string"
       }, {
-        "name": "B_streettype",
+        "name": "altaddress_street_type",
         "in": "query",
-        "description": "Case insensitive search on B_streettype",
+        "description": "Case insensitive search on altaddress_street_type",
         "required": false,
         "type": "string"
       }, {
-        "name": "B_address",
+        "name": "altaddress_address",
         "in": "query",
-        "description": "Case insensitive search on B_address",
+        "description": "Case insensitive search on altaddress_address",
         "required": false,
         "type": "string"
       }, {
-        "name": "B_address2",
+        "name": "altaddress_address2",
         "in": "query",
-        "description": "Case insensitive search on B_address2",
+        "description": "Case insensitive search on altaddress_address2",
         "required": false,
         "type": "string"
       }, {
-        "name": "B_city",
+        "name": "altaddress_city",
         "in": "query",
-        "description": "Case insensitive search on B_city",
+        "description": "Case insensitive search on altaddress_city",
         "required": false,
         "type": "string"
       }, {
-        "name": "B_state",
+        "name": "altaddress_state",
         "in": "query",
-        "description": "Case insensitive search on B_state",
+        "description": "Case insensitive search on altaddress_state",
         "required": false,
         "type": "string"
       }, {
-        "name": "B_zipcode",
+        "name": "altaddress_postal_code",
         "in": "query",
-        "description": "Case insensitive search on B_zipcode",
+        "description": "Case insensitive search on altaddress_postal_code",
         "required": false,
         "type": "string"
       }, {
-        "name": "B_country",
+        "name": "altaddress_country",
         "in": "query",
-        "description": "Case insensitive search on B_country",
+        "description": "Case insensitive search on altaddress_country",
         "required": false,
         "type": "string"
       }, {
-        "name": "B_email",
+        "name": "altaddress_email",
         "in": "query",
-        "description": "Case insensitive search on B_email",
+        "description": "Case insensitive search on altaddress_email",
         "required": false,
         "type": "string"
       }, {
-        "name": "B_phone",
+        "name": "altaddress_phone",
         "in": "query",
-        "description": "Case insensitive search on B_phone",
+        "description": "Case insensitive search on altaddress_phone",
         "required": false,
         "type": "string"
       }, {
-        "name": "dateofbirth",
+        "name": "date_of_birth",
         "in": "query",
-        "description": "Case insensitive search on dateofbirth",
+        "description": "Case insensitive search on date_of_birth",
         "required": false,
         "type": "string"
       }, {
-        "name": "branchcode",
+        "name": "library_id",
         "in": "query",
-        "description": "Case insensitive search on branchcode",
+        "description": "Case insensitive search on library_id",
         "required": false,
         "type": "string"
       }, {
-        "name": "categorycode",
+        "name": "category_id",
         "in": "query",
-        "description": "Case insensitive search on categorycode",
+        "description": "Case insensitive search on category_id",
         "required": false,
         "type": "string"
       }, {
-        "name": "dateenrolled",
+        "name": "date_enrolled",
         "in": "query",
-        "description": "Case insensitive search on dateenrolled",
+        "description": "Case insensitive search on date_enrolled",
         "required": false,
         "type": "string"
       }, {
-        "name": "dateexpiry",
+        "name": "expiry_date",
         "in": "query",
-        "description": "Case insensitive search on dateexpiry",
+        "description": "Case insensitive search on expiry_date",
         "required": false,
         "type": "string"
       }, {
-        "name": "gonenoaddress",
+        "name": "incorrect_address",
         "in": "query",
-        "description": "Search on gonenoaddress",
+        "description": "Search on incorrect_address",
         "required": false,
         "type": "boolean"
       }, {
-        "name": "lost",
+        "name": "patron_card_lost",
         "in": "query",
-        "description": "Search on lost",
+        "description": "Search on patron_card_lost",
         "required": false,
         "type": "boolean"
       }, {
-        "name": "debarred",
+        "name": "restricted",
         "in": "query",
-        "description": "Case insensitive search on debarred",
+        "description": "Filter search by restricted",
         "required": false,
-        "type": "string"
-      }, {
-        "name": "debarredcomment",
-        "in": "query",
-        "description": "Case insensitive search on debarredcomment",
-        "required": false,
-        "type": "string"
-      }, {
-        "name": "contactname",
-        "in": "query",
-        "description": "Case insensitive search on contactname",
-        "required": false,
-        "type": "string"
-      }, {
-        "name": "contactfirstname",
-        "in": "query",
-        "description": "Case insensitive search on contactfirstname",
-        "required": false,
-        "type": "string"
-      }, {
-        "name": "contacttitle",
-        "in": "query",
-        "description": "Case insensitive search on contacttitle",
-        "required": false,
-        "type": "string"
-      }, {
-        "name": "guarantorid",
-        "in": "query",
-        "description": "Case insensitive search on guarantorid",
-        "required": false,
-        "type": "string"
-      }, {
-        "name": "borrowernotes",
-        "in": "query",
-        "description": "Case insensitive search on borrowernotes",
-        "required": false,
-        "type": "string"
+        "type": "boolean"
       }, {
-        "name": "relationship",
+        "name": "guarantor_id",
         "in": "query",
-        "description": "Case insensitive search on relationship",
+        "description": "Search on guarantor_id",
         "required": false,
         "type": "string"
       }, {
-        "name": "sex",
+        "name": "staff_notes",
         "in": "query",
-        "description": "Case insensitive search on sex",
+        "description": "Case insensitive search on staff_notes",
         "required": false,
         "type": "string"
       }, {
-        "name": "password",
+        "name": "relationship_type",
         "in": "query",
-        "description": "Case insensitive search on password",
+        "description": "Case insensitive search on relationship_type",
         "required": false,
         "type": "string"
       }, {
-        "name": "flags",
+        "name": "gender",
         "in": "query",
-        "description": "Case insensitive search on flags",
+        "description": "Case insensitive search on gender",
         "required": false,
         "type": "string"
       }, {
         "required": false,
         "type": "string"
       }, {
-        "name": "opacnote",
+        "name": "opac_notes",
         "in": "query",
-        "description": "Case insensitive search on opacnote",
+        "description": "Case insensitive search on opac_notes",
         "required": false,
         "type": "string"
       }, {
-        "name": "contactnote",
+        "name": "altaddress_notes",
         "in": "query",
-        "description": "Case insensitive search on contactnote",
+        "description": "Case insensitive search on altaddress_notes",
         "required": false,
         "type": "string"
       }, {
-        "name": "sort1",
+        "name": "statistics_1",
         "in": "query",
-        "description": "Case insensitive search on sort1",
+        "description": "Case insensitive search on statistics_1",
         "required": false,
         "type": "string"
       }, {
-        "name": "sort2",
+        "name": "statistics_2",
         "in": "query",
-        "description": "Case insensitive search on sort2",
+        "description": "Case insensitive search on statistics_2",
         "required": false,
         "type": "string"
       }, {
-        "name": "altcontactfirstname",
+        "name": "altcontact_firstname",
         "in": "query",
-        "description": "Case insensitive search on altcontactfirstname",
+        "description": "Case insensitive search on altcontact_firstname",
         "required": false,
         "type": "string"
       }, {
-        "name": "altcontactsurname",
+        "name": "altcontact_surname",
         "in": "query",
-        "description": "Case insensitive search on altcontactsurname",
+        "description": "Case insensitive search on altcontact_surname",
         "required": false,
         "type": "string"
       }, {
-        "name": "altcontactaddress1",
+        "name": "altcontact_address",
         "in": "query",
-        "description": "Case insensitive search on altcontactaddress1",
+        "description": "Case insensitive search on altcontact_address",
         "required": false,
         "type": "string"
       }, {
-        "name": "altcontactaddress2",
+        "name": "altcontact_address2",
         "in": "query",
-        "description": "Case insensitive search on altcontactaddress2",
+        "description": "Case insensitive search on altcontact_address2",
         "required": false,
         "type": "string"
       }, {
-        "name": "altcontactaddress3",
+        "name": "altcontact_city",
         "in": "query",
-        "description": "Case insensitive search on altcontactaddress3",
+        "description": "Case insensitive search on altcontact_city",
         "required": false,
         "type": "string"
       }, {
-        "name": "altcontactstate",
+        "name": "altcontact_state",
         "in": "query",
-        "description": "Case insensitive search on altcontactstate",
+        "description": "Case insensitive search on altcontact_state",
         "required": false,
         "type": "string"
       }, {
-        "name": "altcontactzipcode",
+        "name": "altcontact_postal_code",
         "in": "query",
-        "description": "Case insensitive search on altcontactzipcode",
+        "description": "Case insensitive search on altcontact_postal_code",
         "required": false,
         "type": "string"
       }, {
-        "name": "altcontactcountry",
+        "name": "altcontact_country",
         "in": "query",
-        "description": "Case insensitive search on altcontactcountry",
+        "description": "Case insensitive search on altcontact_country",
         "required": false,
         "type": "string"
       }, {
-        "name": "altcontactphone",
+        "name": "altcontact_phone",
         "in": "query",
-        "description": "Case insensitive search on altcontactphone",
+        "description": "Case insensitive search on altcontact_phone",
         "required": false,
         "type": "string"
       }, {
-        "name": "smsalertnumber",
+        "name": "sms_number",
         "in": "query",
-        "description": "Case insensitive search on smsalertnumber",
+        "description": "Case insensitive search on sms_number",
         "required": false,
         "type": "string"
       }, {
       }, {
         "name": "privacy",
         "in": "query",
-        "description": "Case insensitive search on privacy",
+        "description": "Search on privacy",
         "required": false,
         "type": "string"
       }, {
         "name": "privacy_guarantor_checkouts",
         "in": "query",
-        "description": "Case insensitive search on privacy_guarantor_checkouts",
+        "description": "Search on privacy_guarantor_checkouts",
         "required": false,
         "type": "string"
       }, {
-        "name": "checkprevcheckout",
+        "name": "check_previous_checkout",
         "in": "query",
-        "description": "Case insensitive search on checkprevcheckout",
+        "description": "Case insensitive search on check_previous_checkout",
         "required": false,
         "type": "string"
       }, {
         "name": "updated_on",
         "in": "query",
-        "description": "Case insensitive search on updated_on",
+        "description": "Search on updated_on",
         "required": false,
         "type": "string"
       }, {
-        "name": "lastseen",
+        "name": "last_seen",
         "in": "query",
-        "description": "Case insensitive search on lastseen",
+        "description": "Case insensitive search on last_seen",
         "required": false,
         "type": "string"
       }, {
       }, {
         "name": "login_attempts",
         "in": "query",
-        "description": "Case insensitive search on login_attempts",
-        "required": false,
-        "type": "string"
-      }, {
-        "name": "overdrive_auth_token",
-        "in": "query",
-        "description": "Case insensitive search on overdrive_auth_token",
+        "description": "Search on login_attempts",
         "required": false,
         "type": "string"
       }, {
       }
     }
   },
-  "/patrons/{borrowernumber}": {
+  "/patrons/{patron_id}": {
     "get": {
       "x-mojo-to": "Patrons#get",
       "operationId": "getPatron",
       "tags": ["patrons"],
       "parameters": [{
-        "$ref": "../parameters.json#/borrowernumberPathParam"
+          "$ref": "../parameters.json#/patron_id_pp"
       }],
       "produces": [
         "application/json"
       "tags": ["patrons"],
       "parameters": [
         {
-          "$ref": "../parameters.json#/borrowernumberPathParam"
+          "$ref": "../parameters.json#/patron_id_pp"
         },
         {
           "name": "body",
       "operationId": "deletePatron",
       "tags": ["patrons"],
       "parameters": [{
-        "$ref": "../parameters.json#/borrowernumberPathParam"
+        "$ref": "../parameters.json#/patron_id_pp"
       }],
       "produces": ["application/json"],
       "responses": {
index 5fa58ba..0266297 100644 (file)
@@ -3,9 +3,9 @@
     "type": "integer",
     "description": "internally assigned biblio identifier"
   },
-  "borrowernumber": {
+  "patron_id": {
     "type": "integer",
-    "description": "internally assigned user identifier"
+    "description": "Internal patron identifier"
   },
   "cardnumber": {
     "type": ["string", "null"],