Tomas Cohen Arazi
60a253c983
The previous patch introduces some behavioural changes to the API, as well as the data types that need to be passed; all happens in the tests. This patch adapts the route so it complies with those changes: - JSON object containing pickup_library_id attribute is now passed back and forth. - The controller should take care of checking the pickup location is valid, using the available tools. To test: 1. Apply the patches, up to the tests 2. Run: $ kshell k$ prove t/db_dependent/api/v1/holds.t => ERROR: Tests fail because the controller doesn't implement the desired behavior 3. Apply this patch 4. Repeat 2 => SUCCESS: Tests pass! 5. Sign off :-D Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io> Signed-off-by: David Nind <david@davidnind.com> Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com> Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
797 lines
20 KiB
JSON
797 lines
20 KiB
JSON
{
|
|
"/holds": {
|
|
"get": {
|
|
"x-mojo-to": "Holds#list",
|
|
"operationId": "listHolds",
|
|
"tags": ["patrons", "holds"],
|
|
"parameters": [
|
|
{
|
|
"name": "hold_id",
|
|
"in": "query",
|
|
"description": "Internal reserve identifier",
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"name": "patron_id",
|
|
"in": "query",
|
|
"description": "Internal patron identifier",
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"name": "hold_date",
|
|
"in": "query",
|
|
"description": "Hold",
|
|
"type": "string",
|
|
"format": "date"
|
|
},
|
|
{
|
|
"name": "biblio_id",
|
|
"in": "query",
|
|
"description": "Internal biblio identifier",
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"name": "pickup_library_id",
|
|
"in": "query",
|
|
"description": "Internal library identifier for the pickup library",
|
|
"type": "string"
|
|
},
|
|
{
|
|
"name": "cancellation_date",
|
|
"in": "query",
|
|
"description": "The date the hold was cancelled",
|
|
"type": "string",
|
|
"format": "date"
|
|
},
|
|
{
|
|
"name": "notes",
|
|
"in": "query",
|
|
"description": "Notes related to this hold",
|
|
"type": "string"
|
|
},
|
|
{
|
|
"name": "priority",
|
|
"in": "query",
|
|
"description": "Where in the queue the patron sits",
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"name": "status",
|
|
"in": "query",
|
|
"description": "Found status",
|
|
"type": "string"
|
|
},
|
|
{
|
|
"name": "timestamp",
|
|
"in": "query",
|
|
"description": "Time of latest update",
|
|
"type": "string"
|
|
},
|
|
{
|
|
"name": "item_id",
|
|
"in": "query",
|
|
"description": "Internal item identifier",
|
|
"type": "integer"
|
|
},
|
|
{
|
|
"name": "waiting_date",
|
|
"in": "query",
|
|
"description": "Date the item was marked as waiting for the patron",
|
|
"type": "string"
|
|
},
|
|
{
|
|
"name": "expiration_date",
|
|
"in": "query",
|
|
"description": "Date the hold expires",
|
|
"type": "string"
|
|
},
|
|
{
|
|
"name": "lowest_priority",
|
|
"in": "query",
|
|
"description": "Lowest priority",
|
|
"type": "boolean"
|
|
},
|
|
{
|
|
"name": "suspended",
|
|
"in": "query",
|
|
"description": "Suspended",
|
|
"type": "boolean"
|
|
},
|
|
{
|
|
"name": "suspended_until",
|
|
"in": "query",
|
|
"description": "Suspended until",
|
|
"type": "string"
|
|
},
|
|
{
|
|
"name": "non_priority",
|
|
"in": "query",
|
|
"description": "Non priority hold",
|
|
"type": "boolean"
|
|
},
|
|
{
|
|
"$ref": "../parameters.json#/match"
|
|
},
|
|
{
|
|
"$ref": "../parameters.json#/order_by"
|
|
},
|
|
{
|
|
"$ref": "../parameters.json#/page"
|
|
},
|
|
{
|
|
"$ref": "../parameters.json#/per_page"
|
|
}
|
|
],
|
|
"produces": ["application/json"],
|
|
"responses": {
|
|
"200": {
|
|
"description": "A list of holds",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/holds"
|
|
}
|
|
},
|
|
"401": {
|
|
"description": "Authentication required",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Hold not allowed",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Borrower not found",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"500": {
|
|
"description": "Internal server error",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"503": {
|
|
"description": "Under maintenance",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
}
|
|
},
|
|
"x-koha-authorization": {
|
|
"permissions": {
|
|
"borrowers": "edit_borrowers"
|
|
}
|
|
}
|
|
},
|
|
"post": {
|
|
"x-mojo-to": "Holds#add",
|
|
"operationId": "addHold",
|
|
"tags": ["patrons", "holds"],
|
|
"parameters": [{
|
|
"name": "body",
|
|
"in": "body",
|
|
"description": "A JSON object containing informations about the new hold",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"patron_id": {
|
|
"description": "Internal patron identifier",
|
|
"type": "integer"
|
|
},
|
|
"biblio_id": {
|
|
"description": "Internal biblio identifier",
|
|
"type": [ "integer", "null" ]
|
|
},
|
|
"item_id": {
|
|
"description": "Internal item identifier",
|
|
"type": [ "integer", "null" ]
|
|
},
|
|
"pickup_library_id": {
|
|
"description": "Internal library identifier for the pickup library",
|
|
"type": "string"
|
|
},
|
|
"expiration_date": {
|
|
"description": "Hold end date",
|
|
"type": ["string", "null"],
|
|
"format": "date"
|
|
},
|
|
"notes": {
|
|
"description": "Notes related to this hold",
|
|
"type": [ "string", "null" ]
|
|
},
|
|
"item_type": {
|
|
"description": "Limit hold on one itemtype (ignored for item-level holds)",
|
|
"type": [ "string", "null" ]
|
|
},
|
|
"non_priority": {
|
|
"description": "Set this hold as non priority",
|
|
"type": [ "boolean", "null" ]
|
|
}
|
|
},
|
|
"required": [ "patron_id", "pickup_library_id" ]
|
|
}
|
|
}
|
|
],
|
|
"consumes": ["application/json"],
|
|
"produces": ["application/json"],
|
|
"responses": {
|
|
"201": {
|
|
"description": "Created hold",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/hold"
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "Missing or wrong parameters",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"401": {
|
|
"description": "Authentication required",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Hold not allowed",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Borrower not found",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"500": {
|
|
"description": "Internal server error",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"503": {
|
|
"description": "Under maintenance",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
}
|
|
},
|
|
"x-koha-authorization": {
|
|
"permissions": {
|
|
"reserveforothers": "1"
|
|
}
|
|
},
|
|
"x-koha-override": {
|
|
"AllowHoldPolicyOverride": 1
|
|
}
|
|
}
|
|
},
|
|
"/holds/{hold_id}": {
|
|
"put": {
|
|
"x-mojo-to": "Holds#edit",
|
|
"operationId": "editHold",
|
|
"tags": ["holds"],
|
|
"parameters": [{
|
|
"$ref": "../parameters.json#/hold_id_pp"
|
|
}, {
|
|
"name": "body",
|
|
"in": "body",
|
|
"description": "A JSON object containing fields to modify",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"priority": {
|
|
"description": "Position in waiting queue",
|
|
"type": "integer",
|
|
"minimum": 1
|
|
},
|
|
"branchcode": {
|
|
"description": "Pickup location",
|
|
"type": "string"
|
|
},
|
|
"suspend_until": {
|
|
"description": "Suspend until",
|
|
"type": "string",
|
|
"format": "date"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"consumes": ["application/json"],
|
|
"produces": ["application/json"],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Updated hold",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/hold"
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "Missing or wrong parameters",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"401": {
|
|
"description": "Authentication required",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Hold not allowed",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Hold not found",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"500": {
|
|
"description": "Internal server error",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"503": {
|
|
"description": "Under maintenance",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
}
|
|
},
|
|
"x-koha-authorization": {
|
|
"permissions": {
|
|
"reserveforothers": "1"
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"x-mojo-to": "Holds#delete",
|
|
"operationId": "deleteHold",
|
|
"tags": ["holds"],
|
|
"parameters": [{
|
|
"$ref": "../parameters.json#/hold_id_pp"
|
|
}
|
|
],
|
|
"produces": ["application/json"],
|
|
"responses": {
|
|
"204": {
|
|
"description": "Hold deleted"
|
|
},
|
|
"401": {
|
|
"description": "Authentication required",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Hold not allowed",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Hold not found",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"500": {
|
|
"description": "Internal server error",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"503": {
|
|
"description": "Under maintenance",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
}
|
|
},
|
|
"x-koha-authorization": {
|
|
"permissions": {
|
|
"reserveforothers": "1"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/holds/{hold_id}/priority": {
|
|
"put": {
|
|
"x-mojo-to": "Holds#update_priority",
|
|
"operationId": "updateHoldPriority",
|
|
"tags": [
|
|
"biblios",
|
|
"holds"
|
|
],
|
|
"parameters": [
|
|
{
|
|
"$ref": "../parameters.json#/hold_id_pp"
|
|
},
|
|
{
|
|
"name": "body",
|
|
"in": "body",
|
|
"description": "An integer representing the new priority to be set for the hold",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "integer"
|
|
}
|
|
}
|
|
],
|
|
"produces": [
|
|
"application/json"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "The new priority value for the hold",
|
|
"schema": {
|
|
"type": "integer"
|
|
}
|
|
},
|
|
"401": {
|
|
"description": "Authentication required",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access forbidden",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Biblio not found",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"409": {
|
|
"description": "Unable to perform action on biblio",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"500": {
|
|
"description": "Internal error",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"503": {
|
|
"description": "Under maintenance",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
}
|
|
},
|
|
"x-koha-authorization": {
|
|
"permissions": {
|
|
"reserveforothers": "modify_holds_priority"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/holds/{hold_id}/suspension": {
|
|
"post": {
|
|
"x-mojo-to": "Holds#suspend",
|
|
"operationId": "suspendHold",
|
|
"tags": ["holds"],
|
|
"parameters": [{
|
|
"$ref": "../parameters.json#/hold_id_pp"
|
|
}, {
|
|
"name": "body",
|
|
"in": "body",
|
|
"description": "A JSON object containing fields to modify",
|
|
"required": false,
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"end_date": {
|
|
"description": "Date the hold suspension expires",
|
|
"type": "string",
|
|
"format": "date"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"consumes": ["application/json"],
|
|
"produces": ["application/json"],
|
|
"responses": {
|
|
"201": {
|
|
"description": "Hold suspended"
|
|
},
|
|
"400": {
|
|
"description": "Missing or wrong parameters",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"401": {
|
|
"description": "Authentication required",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Hold not allowed",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Hold not found",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"500": {
|
|
"description": "Internal server error",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"503": {
|
|
"description": "Under maintenance",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
}
|
|
},
|
|
"x-koha-authorization": {
|
|
"permissions": {
|
|
"reserveforothers": "1"
|
|
}
|
|
}
|
|
},
|
|
"delete": {
|
|
"x-mojo-to": "Holds#resume",
|
|
"operationId": "resumeHold",
|
|
"tags": ["holds"],
|
|
"parameters": [
|
|
{
|
|
"$ref": "../parameters.json#/hold_id_pp"
|
|
}
|
|
],
|
|
"consumes": ["application/json"],
|
|
"produces": ["application/json"],
|
|
"responses": {
|
|
"204": {
|
|
"description": "Hold resumed"
|
|
},
|
|
"400": {
|
|
"description": "Missing or wrong parameters",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"401": {
|
|
"description": "Authentication required",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Hold not allowed",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Hold not found",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"500": {
|
|
"description": "Internal server error",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"503": {
|
|
"description": "Under maintenance",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
}
|
|
},
|
|
"x-koha-authorization": {
|
|
"permissions": {
|
|
"reserveforothers": "1"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/holds/{hold_id}/pickup_locations": {
|
|
"get": {
|
|
"x-mojo-to": "Holds#pickup_locations",
|
|
"operationId": "getHoldPickupLocations",
|
|
"tags": ["holds"],
|
|
"parameters": [
|
|
{
|
|
"$ref": "../parameters.json#/hold_id_pp"
|
|
},
|
|
{
|
|
"$ref": "../parameters.json#/match"
|
|
},
|
|
{
|
|
"$ref": "../parameters.json#/order_by"
|
|
},
|
|
{
|
|
"$ref": "../parameters.json#/page"
|
|
},
|
|
{
|
|
"$ref": "../parameters.json#/per_page"
|
|
},
|
|
{
|
|
"$ref": "../parameters.json#/q_param"
|
|
},
|
|
{
|
|
"$ref": "../parameters.json#/q_body"
|
|
},
|
|
{
|
|
"$ref": "../parameters.json#/q_header"
|
|
}
|
|
],
|
|
"produces": ["application/json"],
|
|
"responses": {
|
|
"200": {
|
|
"description": "Hold pickup location",
|
|
"schema": {
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "../definitions.json#/library"
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "Missing or wrong parameters",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"401": {
|
|
"description": "Authentication required",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Hold pickup location list not allowed",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Hold not found",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"500": {
|
|
"description": "Internal server error",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"503": {
|
|
"description": "Under maintenance",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
}
|
|
},
|
|
"x-koha-authorization": {
|
|
"permissions": {
|
|
"reserveforothers": "place_holds"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"/holds/{hold_id}/pickup_location": {
|
|
"put": {
|
|
"x-mojo-to": "Holds#update_pickup_location",
|
|
"operationId": "updateHoldPickupLocation",
|
|
"tags": ["holds"],
|
|
"parameters": [
|
|
{
|
|
"$ref": "../parameters.json#/hold_id_pp"
|
|
},
|
|
{
|
|
"name": "body",
|
|
"in": "body",
|
|
"description": "Pickup location",
|
|
"required": true,
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"pickup_library_id": {
|
|
"type": "string",
|
|
"description": "Internal identifier for the pickup library"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
],
|
|
"produces": [
|
|
"application/json"
|
|
],
|
|
"responses": {
|
|
"200": {
|
|
"description": "The new pickup location value for the hold",
|
|
"schema": {
|
|
"type": "object",
|
|
"properties": {
|
|
"pickup_library_id": {
|
|
"type": "string",
|
|
"description": "Internal identifier for the pickup library"
|
|
}
|
|
}
|
|
}
|
|
},
|
|
"400": {
|
|
"description": "Missing or wrong parameters",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"401": {
|
|
"description": "Authentication required",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"403": {
|
|
"description": "Access forbidden",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"404": {
|
|
"description": "Hold not found",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"409": {
|
|
"description": "Unable to perform action on hold",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"500": {
|
|
"description": "Internal error",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
},
|
|
"503": {
|
|
"description": "Under maintenance",
|
|
"schema": {
|
|
"$ref": "../definitions.json#/error"
|
|
}
|
|
}
|
|
},
|
|
"x-koha-authorization": {
|
|
"permissions": {
|
|
"reserveforothers": "place_holds"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|