From f2576489f400c53d2c9873d578bf9e939475eeaf Mon Sep 17 00:00:00 2001 From: Nate Wright Date: Thu, 23 Mar 2023 15:59:48 +0000 Subject: [PATCH 01/14] pkp/pkp-lib#8844 Updates for API documentation --- docs/dev/swagger-source.json | 1357 ++++++++++++++++++++++++++++++++-- schemas/submission.json | 2 +- 2 files changed, 1316 insertions(+), 43 deletions(-) diff --git a/docs/dev/swagger-source.json b/docs/dev/swagger-source.json index 604b3dec721..482caab1545 100644 --- a/docs/dev/swagger-source.json +++ b/docs/dev/swagger-source.json @@ -42,6 +42,9 @@ "Contexts", "Site", "Announcements", + "DOIs", + "DOIs / Submissions", + "DOIs / Issues", "Email Templates", "Institutions", "Mailables", @@ -61,7 +64,7 @@ { "name": "What's New in 3.4", "x-traitTag": true, - "description": "The [3.4 Release Notebook](https://docs.pkp.sfu.ca/dev/release-notebooks/en/3.4-release-notebook) contains full details about breaking changes introduced in 3.4. The following breaking changes effect the REST API.\n\n- Major changes to the `/stats` endpoints. See reference below." + "description": "The [3.4 Release Notebook](https://docs.pkp.sfu.ca/dev/release-notebooks/en/3.4-release-notebook) contains full details about breaking changes introduced in 3.4. The following changes effect the REST API.\n\n- Use of the `apiToken` as a query parameter is deprecated. Use it in the `Authorization` header instead. See the \"Authentication\" section below.\n- Changes to request body to create a new submission.\n- Changes to the submission property, `submissionProgress`. It is now a string, not an integer.\n- Changes to the stats endpoints.\n- Changes to the endpoints to manage email templates.\n\nThe following new endpoints have been added.\n\n- New endpoint to save a submission for later.\n- New endpoint to submit a submissions.\n- New endpoints to manage a publication's contributors.\n- New endpoints to create and register DOIs.\n- New endpoints to record editorial decisions.\n- New endpoints to manage institutions." }, { "name": "Access", @@ -127,6 +130,18 @@ "name": "Announcements", "description": "Only admins and journal managers can access these endpoints." }, + { + "name": "DOIs", + "description": "Only admins and journal managers can access these endpoints." + }, + { + "name": "DOIs / Submissions", + "description": "Only admins and journal managers can access these endpoints." + }, + { + "name": "DOIs / Issues", + "description": "Only admins and journal managers can access these endpoints. These endpoints are only available when issues have been configured to receive DOIs in the DOI settings." + }, { "name": "Email Templates", "description": "Only admins and journal managers can access these endpoints." @@ -547,19 +562,18 @@ "description": "See `/submissions/{submissionId}` for notes about submission properties.", "parameters": [ { - "name": "status", - "description": "Filter results by one or more submission statuses. Must match the value of one of the `PKPSubmission::STATUS_QUEUED`, `PKPSubmission::STATUS_SCHEDULED`, `PKPSubmission::STATUS_PUBLISHED` or `PKPSubmission::STATUS_DECLINED` constants.", + "name": "assignedTo", + "description": "Filter results by those assigned to one or more user ids. All users except managers and admins are automatically restricted to assigned submissions and do not need to pass this parameter.", "in": "query", "required": false, "type": "array", "items": { - "type": "integer", - "enum": [1,3,4,5] + "type": "integer" } }, { - "name": "assignedTo", - "description": "Filter results by those assigned to one or more user ids. All users except managers and admins are automatically restricted to assigned submissions and do not need to pass this parameter.", + "name": "categoryIds", + "description": "Filter results by those assigned to one of these categories.", "in": "query", "required": false, "type": "array", @@ -575,6 +589,37 @@ "type": "integer", "default": 20 }, + { + "name": "daysInactive", + "description": "Filter the results by those which have not had activity for the last X days.", + "in": "query", + "required": false, + "type": "integer" + }, + { + "name": "isIncomplete", + "description": "Filter the results by those for which the author has not yet completed the submission process.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "isOverdue", + "description": "Filter the results by those for which a reviewer has missed a deadline.", + "in": "query", + "required": false, + "type": "boolean" + }, + { + "name": "issueIds", + "description": "Filter the results by those with one or more publications assigned to an issue.", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "integer" + } + }, { "name": "offset", "description": "Offset the results returned. Use this to receive subsequent pages of requests. A `count` of `10` and `offset` of `15` will return results `15` to `25`.", @@ -611,25 +656,11 @@ ] }, { - "name": "isIncomplete", - "description": "Filter the results by those for which the author has not yet completed the submission process.", - "in": "query", - "required": false, - "type": "boolean" - }, - { - "name": "isOverdue", - "description": "Filter the results by those for which a reviewer has missed a deadline.", - "in": "query", - "required": false, - "type": "boolean" - }, - { - "name": "daysInactive", - "description": "Filter the results by those which have not had activity for the last X days.", + "name": "searchPhrase", + "description": "Filter the results by a search phrase matched against the title and authors.", "in": "query", "required": false, - "type": "integer" + "type": "string" }, { "name": "sectionIds", @@ -642,21 +673,26 @@ } }, { - "name": "issueIds", - "description": "Filter the results by those with one or more publications assigned to an issue.", + "name": "stageIds", + "description": "Filter results by those currently in one of these workflow stages. Expects one of the `WORKFLOW_STAGE_ID_*` constants.", "in": "query", "required": false, "type": "array", "items": { - "type": "integer" + "type": "integer", + "enum": [1,3,4,5] } }, { - "name": "searchPhrase", - "description": "Filter the results by a search phrase matched against the title and authors.", + "name": "status", + "description": "Filter results by one or more submission statuses. Must match the value of one of the `PKPSubmission::STATUS_QUEUED`, `PKPSubmission::STATUS_SCHEDULED`, `PKPSubmission::STATUS_PUBLISHED` or `PKPSubmission::STATUS_DECLINED` constants.", "in": "query", "required": false, - "type": "string" + "type": "array", + "items": { + "type": "integer", + "enum": [1,3,4,5] + } } ], "responses": { @@ -851,6 +887,140 @@ } } }, + "/submissions/{submissionId}/saveForLater": { + "put": { + "tags": [ + "Submissions" + ], + "summary": "Save a submission for later", + "description": "Sets the current step of the submission in the submission wizard and sends an email to the submitting author with a link to resume their submission. This API endpoint does not save any data about the submission. Use the regular `PUT` endpoints to save data for submissions, publications, files, and authors.", + "parameters": [ + { + "name": "submissionId", + "in": "path", + "description": "Submission ID", + "required": true, + "type": "integer" + }, + { + "in": "body", + "schema": { + "type": "object", + "properties": { + "step": { + "description": "The step of the submission wizard to open when the author resumes their submission.", + "type": "string", + "enum": [ + "details", + "files", + "contributors", + "editors", + "review" + ] + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "The submission that was saved for later.", + "schema": { + "$ref": "#/definitions/Submission" + } + }, + "400": { + "x-summary": "Request Invalid", + "description": "The values you sent with the request did not pass validation. The response will contain information about which parameters failed validation.", + "schema": { + "$ref": "#/definitions/InvalidParametersResponse" + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "This error indicates that you are not allowed to edit this submission.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The submission could not be found.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/submissions/{submissionId}/submit": { + "put": { + "tags": [ + "Submissions" + ], + "summary": "Submit a submission", + "description": "Submits a submission for editorial review. Any automated editorial assignments, comments for the editor, or other submission events will be triggered.", + "parameters": [ + { + "name": "submissionId", + "in": "path", + "description": "Submission ID", + "required": true, + "type": "integer" + }, + { + "in": "body", + "schema": { + "type": "object", + "properties": { + "_validateOnly": { + "description": "When `true`, the validation checks will be performed but the submission will not be submitted.", + "in": "query", + "required": false, + "type": "boolean" + }, + "confirmCopyright": { + "description": "Pass `true` to indicate that the author has agreed to the copyright notice. An entry will be added to the submission's activity log to record the author's acceptance of the copyright agreement.", + "type": "boolean", + "required": "false" + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "The submission that was saved for later. Or, if the `_validateOnly` query param is passed and no validation errors are found, the response body will be empty.", + "schema": { + "$ref": "#/definitions/Submission" + } + }, + "400": { + "x-summary": "Request Invalid", + "description": "Any validation errors that must be fixed before this submission can be submitted. The response will contain information about which parameters failed validation.", + "schema": { + "$ref": "#/definitions/InvalidParametersResponse" + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "This error indicates that you are not allowed to edit this submission.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The submission could not be found.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, "/submissions/{submissionId}/files": { "get": { "tags": [ @@ -1601,7 +1771,7 @@ } }, "403": { - "x-summary": "Publication invalid", + "x-summary": "Publication Invalid", "description": "The requested publication is not part of the requested submission.", "schema": { "$ref": "#/definitions/ErrorResponse" @@ -1661,7 +1831,7 @@ } }, "403": { - "x-summary": "Publication invalid", + "x-summary": "Publication Invalid", "description": "The requested publication is not part of the requested submission. It could be also because the publication is not editable by the requested user", "schema": { "$ref": "#/definitions/ErrorResponse" @@ -1708,15 +1878,15 @@ } }, "403": { - "x-summary": "Publication invalid", - "description": "The requested publication is not part of the requested submission. It could be also because the publication is not editable by the requested user", + "x-summary": "Publication Invalid", + "description": "The requested publication is not part of the requested submission. Or you do not have permission to edit this publication.", "schema": { "$ref": "#/definitions/ErrorResponse" } }, "404": { "x-summary": "Request Not Found", - "description": "The requested submission or publication or author could not be found.", + "description": "The requested submission, publication or author could not be found.", "schema": { "$ref": "#/definitions/ErrorResponse" } @@ -1794,7 +1964,6 @@ "Submissions / Publications / Contributors" ], "summary": "Delete a contributor.", - "description": "Only journal managers and subeditors can make a request to this endpoint.", "parameters": [ { "name": "submissionId", @@ -1849,6 +2018,7 @@ "Submissions / Publications / Contributors" ], "summary": "Reorder publication's contributors", + "description": "Change the order of the contributor's as they are listed in the publication.", "parameters": [ { "name": "submissionId", @@ -1865,12 +2035,17 @@ "type": "integer" }, { - "description": "The 'sortedAuthors' param is an array containing the new order of the contributors for the given publication", "in": "body", "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/Contributor" + "type": "object", + "properties": { + "sortedAuthors": { + "type": "array", + "description": "An array of contributor objects in the order they should be listed.", + "items": { + "$ref": "#/definitions/Contributor" + } + } } } } @@ -1878,9 +2053,12 @@ "responses": { "200": { "x-summary": "Success", - "description": "Details of the publication that it's contributors were just reordered.", + "description": "An array of contributor objects in the new order.", "schema": { - "$ref": "#/definitions/Publication" + "type": "array", + "items": { + "$ref": "#/definitions/Contributor" + } } }, "403": { @@ -3019,6 +3197,1101 @@ } } }, + "/dois": { + "get": { + "tags": [ + "DOIs" + ], + "summary": "Get a list of DOIs.", + "parameters": [ + { + "name": "status", + "description": "Filter results by one or more DOI statuses. Must match the value of one of the `Doi::STATUS_UNREGISTERED`, `Doi::STATUS_SUBMITTED`, `Doi::STATUS_REGISTERED`, `Doi::STATUS_ERROR`, `Doi::STATUS_STALE` constants.", + "in": "query", + "required": false, + "type": "array", + "items": { + "type": "integer", + "enum": [1,2,3,4,5] + } + }, + { + "name": "count", + "description": "How many results to return in a single request. Max is `100`.", + "in": "query", + "required": false, + "type": "integer", + "default": 30 + }, + { + "name": "offset", + "description": "Offset the results returned. Use this to receive subsequent pages of requests. A `count` of `10` and `offset` of `15` will return results `15` to `25`.", + "in": "query", + "required": false, + "type": "integer" + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "List of requested DOIs", + "schema": { + "type": "object", + "properties": { + "itemsMax": { + "type": "integer" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/Doi" + } + } + } + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to access DOIs for this journal, press or preprint server.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + }, + "post": { + "tags": [ + "DOIs" + ], + "summary": "Create a new DOI.", + "parameters": [ + { + "description": "Details about the DOI that should be created.", + "in": "body", + "schema": { + "$ref": "#/definitions/DoiEditable" + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "Details of the DOI that was just added.", + "schema": { + "$ref": "#/definitions/Doi" + } + }, + "400": { + "x-summary": "Request Invalid", + "description": "The values you sent with the request did not pass validation. The response will contain information about which parameters failed validation.", + "schema": { + "$ref": "#/definitions/InvalidParametersResponse" + } + } + } + } + }, + "/dois/{doiId}": { + "get": { + "tags": [ + "DOIs" + ], + "summary": "Get a DOI by ID.", + "parameters": [ + { + "name": "doiId", + "in": "path", + "description": "DOI ID", + "required": true, + "type": "integer" + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "The DOI details.", + "schema": { + "$ref": "#/definitions/Doi" + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to access this DOI, or the DOI you requested is not part of this journal.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The requested DOI could not be found.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + }, + "put": { + "tags": [ + "DOIs" + ], + "summary": "Edit a DOI.", + "description": "Modify the contents of a single DOI. When working with versioned content, if you'd like to modify the content of a DOI for a single version of a publication object, you need to include the `pubObjectType` and `pubObjectId` in the request body.", + "parameters": [ + { + "name": "doiId", + "in": "path", + "description": "DOI ID", + "required": true, + "type": "integer" + }, + { + "description": "The details about the DOI you want to edit. All params are optional. When a param is omitted, the existing value of that param will not be modified. Two exceptions are `pubObjectType` and `pubObjectId`. They are optional but if one is used, the other must also be used.", + "in": "body", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/DoiEditable" + }, + { + "type": "object", + "properties": { + "pubObjectType": { + "type": "string", + "enum": ["publication", "representation", "issue"], + "description": "Publication object type to modify the DOI for." + }, + "pubObjectId": { + "type": "integer", + "description": "ID of publication object you want ot modify the DOI for." + } + } + } + ] + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "The DOI that was just edited with the new values after the update has occurred.", + "schema": { + "$ref": "#/definitions/Doi" + } + }, + "400": { + "x-summary": "Request Invalid", + "description": "The values you sent with the request did not pass validation. The response will contain information about which parameters failed validation.", + "schema": { + "$ref": "#/definitions/InvalidParametersResponse" + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "There was an error editing the DOI.\n\n|Error Code|Description|\n|---|---|\n|`api.dois.403.editItemOutOfContext`|You cannot edit an item's DOI that is not in this context.|\n|`api.dois.403.pubTypeNotRecognized`|The publication type was not recognized.|", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The requested DOI could not be found.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + + } + }, + "delete": { + "tags": [ + "DOIs" + ], + "summary": "Delete a DOI.", + "description": "Delete a single DOI. When working with versioned content, if you'd like to delete a DOI for a single version of a publication object, you will need to include the `pubObjectType` and the corresponding `pubObjectId` in the request body.", + "parameters": [ + { + "name": "doiId", + "in": "path", + "description": "DOI ID", + "required": true, + "type": "integer" + }, + { + "description": "Body params are optional but must be used together.", + "in": "body", + "schema": { + "type": "object", + "properties": { + "pubObjectType": { + "type": "string", + "enum": ["publication", "representation", "issue"], + "description": "Publication object type to modify the DOI for." + }, + "pubObjectId": { + "type": "integer", + "description": "ID of publication object you want to modify the DOI for." + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "Details of the deleted DOI.", + "schema": { + "$ref": "#/definitions/Doi" + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "There was an error deleting the DOI.\n\n|Error Code|Description|\n|---|---|\n|`api.dois.403.editItemOutOfContext`|You cannot edit an item's DOI that is not in this context.|\n|`api.dois.403.pubTypeNotRecognized`|The publication type was not recognized.|", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The requested DOI could not be found.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/dois/depositAll": { + "put": { + "tags": [ + "DOIs" + ], + "summary": "Schedule all DOIs for deposit.", + "description": "Schedules all publication objects with DOIs enabled that are published and include DOIs for deposit with the configured registration agency. DOIs will be queued and handled by the Jobs system in the order in which they were added.", + "responses": { + "200": { + "x-summary": "Success", + "description": "An empty response body." + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to deposit DOIs in this context.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/dois/exports/{fileId}": { + "get": { + "tags": [ + "DOIs" + ], + "summary": "Download a DOI export.", + "description": "Download a DOI export file that has been compiled. See `/dois/submissions/export` and `/dois/issues/export`.", + "parameters": [], + "responses": { + "200": { + "x-summary": "Success", + "description": "An empty response body." + }, + "403": { + "x-summary": "Request unauthorized", + "description": "You are not authorized to access the requested file.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/dois/submissions/assignDois": { + "post": { + "tags": [ + "DOIs / Submissions" + ], + "summary": "Assign DOIs to Submissions.", + "description": "Assign DOIs to all publication objects of a submission, such as the publication and galleys. This will only assign DOIs to publication objects that have been enabled in the DOI settings.", + "parameters": [ + { + "in": "body", + "schema": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "description": "Submission IDs", + "items": { + "type": "integer" + } + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "schema": { + "type": "object", + "properties": { + "failedDoiActions": { + "type": "array", + "description": "A list of error messages. This will be empty if the response code is `200`.", + "items": { + "type": "string" + } + } + } + } + }, + "400": { + "x-summary": "Request Invalid", + "description": "One or more DOIs could not be assigned.", + "schema": { + "type": "object", + "properties": { + "failedDoiActions": { + "type": "array", + "description": "A list of error messages for any DOIs that could not be assigned.", + "items": { + "type": "string" + } + } + }, + "example": { + "failedDoiActions": [ + "Could not create a DOI for the following submission: Lorem Ipsum Dolor Sit Amet. The submission must be assigned to an issue before a DOI can be generated." + ] + } + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to manage DOIs in this journal. Or no DOI prefix has been configured.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The submissions could not be found.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/dois/submissions/export": { + "put": { + "tags": [ + "DOIs / Submissions" + ], + "summary": "Export Submission DOIs.", + "description": "Export submission metadata in a format that can be deposited with the currently configured DOI registration agency. This returns a file id which can be downloaded through the API endpoint `/dois/exports/{fileId}`. See \"Download a DOI Export\" above.", + "parameters": [ + { + "in": "body", + "schema": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "description": "Submission IDs", + "items": { + "type": "integer" + } + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "An object with the temporary file ID to download the exported data. See \"Download a DOI Export\" above.", + "schema": { + "type": "object", + "properties": { + "temporaryFileId": { + "type": "integer" + } + } + } + }, + "400": { + "x-summary": "Request Invalid", + "description": "The export could not be completed because of invalid request parameters or other required settings.\n\n|Error Code|Description|\n|---|---|\n|`api.dois.400.invalidPubObjectIncluded`|One or more invalid publication objects were included with the request.|\n|`api.dois.400.noRegistrationAgencyConfigured`|No DOI registration agency has been configured for this journal.|\n|`api.dois.400.xmlExportFailed`|An XML validation error occurred and the XML could not be exported.|", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to manage DOIs in this journal.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The export could not be completed because a submission or DOI could not be found with the corresponding ID.\n\n|Error Code|Description|\n|---|---|\n|`api.dois.404.noPubObjectIncluded`|No valid publication objects were included with the request.|\n|`api.dois.404.doiNotFound`|The DOI you requested was not found.|", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/dois/submissions/deposit": { + "put": { + "tags": [ + "DOIs / Submissions" + ], + "summary": "Deposit Submission DOIs.", + "description": "This will deposit the specified submission DOIs with the currently configured DOI registration agency.", + "parameters": [ + { + "in": "body", + "schema": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "description": "Submission IDs", + "items": { + "type": "integer" + } + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "An empty response body." + }, + "400": { + "x-summary": "Request Invalid", + "description": "There was an error when submitting the DOIs to the registration agency.\n\n|Error Code|Description|\n|---|---|\n|`api.dois.400.invalidPubObjectIncluded`|One or more invalid publication objects were included with the request.|\n|`api.dois.400.noRegistrationAgencyConfigured`|No DOI registration agency has been configured for this journal.|", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to manage DOIs in this journal.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The deposit could not be completed because a submission or DOI could not be found with the corresponding ID.\n\n|Error Code|Description|\n|---|---|\n|`api.dois.404.noPubObjectIncluded`|No valid publication objects were included with the request.|", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/dois/submissions/markRegistered": { + "put": { + "tags": [ + "DOIs / Submissions" + ], + "summary": "Mark Submission DOIs registered.", + "description": "This will mark the specified submission DOIs as registered. This can be done to indicate the items were deposited outside of OJS.", + "parameters": [ + { + "in": "body", + "schema": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "description": "Submission IDs", + "items": { + "type": "integer" + } + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "An empty response body." + }, + "400": { + "x-summary": "Request Invalid", + "description": "One or more DOIs could not be marked registered.", + "schema": { + "type": "object", + "properties": { + "failedDoiActions": { + "type": "array", + "description": "A list of error messages for any DOIs that could not be assigned.", + "items": { + "type": "string" + } + } + }, + "example": { + "failedDoiActions": [ + "Failed to mark the DOI registered for Lorem Ipsum Dolor Sit Amet. The submission must be published before the status can be updated." + ] + } + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to manage DOIs in this journal.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "No valid publication objects were included with the request.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/dois/submissions/markUnregistered": { + "put": { + "tags": [ + "DOIs / Submissions" + ], + "summary": "Mark Submission DOIs unregistered.", + "description": "This will mark the specified submission DOIs as unregistered. This can be done to remove a DOI's previous registration status.", + "parameters": [ + { + "in": "body", + "schema": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "description": "Submission IDs", + "items": { + "type": "integer" + } + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "An empty response body." + }, + "400": { + "x-summary": "Request Invalid", + "description": "One or more DOIs could not be marked unregistered.", + "schema": { + "type": "object", + "properties": { + "failedDoiActions": { + "type": "array", + "description": "A list of error messages for any DOIs that could not be marked unregistered.", + "items": { + "type": "string" + } + } + }, + "example": { + "failedDoiActions": [ + "Could not create a DOI for the following submission: {$pubObjectTitle}. It does not exist in the current journal context." + ] + } + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to manage DOIs in this journal.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "No valid publication objects were included with the request.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/dois/submissions/markStale": { + "put": { + "tags": [ + "DOIs / Submissions" + ], + "summary": "Mark Submission DOIs needs sync.", + "description": "This will mark the specified submission DOIs as needing to be resubmitted to the registration agency to update their metadata records.", + "parameters": [ + { + "in": "body", + "schema": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "description": "Submission IDs", + "items": { + "type": "integer" + } + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "An empty response body." + }, + "400": { + "x-summary": "Request Invalid", + "description": "One or more DOIs could not be marked registered.", + "schema": { + "type": "object", + "properties": { + "failedDoiActions": { + "type": "array", + "description": "A list of error messages for any DOIs that could not be marked stale.", + "items": { + "type": "string" + } + } + }, + "example": { + "failedDoiActions": [ + "Failed to mark the DOI needs sync for Lorem Ipsum Dolor Sit Amet. The DOI cannot be marked needs sync because they have not yet been registered or submitted." + ] + } + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to manage DOIs in this journal.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "No valid publication objects were included with the request.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/dois/issues/assignDois": { + "post": { + "tags": [ + "DOIs / Issues" + ], + "summary": "Assign DOIs to Issues.", + "parameters": [ + { + "in": "body", + "schema": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "description": "Issue IDs", + "items": { + "type": "integer" + } + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "List of error messages. This will be empty when the status is `200`.", + "schema": { + "type": "object", + "properties": { + "failedDoiActions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "example": { + "failedDoiActions": [] + } + } + }, + "400": { + "x-summary": "Request Invalid", + "description": "List of error messages for any issues for which the action failed.", + "schema": { + "type": "object", + "properties": { + "failedDoiActions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "example": { + "failedDoiActions": [ + "Could not create a DOI for the following issue: Issue Title. It does not exist in the current journal context." + ] + } + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to manage DOIs in this journal. Or a DOI prefix is required to generate DOIs.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The issue could not be found.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/dois/issues/export": { + "put": { + "tags": [ + "DOIs / Issues" + ], + "summary": "Export Issue DOIs.", + "description": "Export issue metadata in a format that can be deposited with the currently configured DOI registration agency. This returns a file id which can be downloaded through the API endpoint `/dois/exports/{fileId}`. See \"Download a DOI Export\" above.", + "parameters": [ + { + "in": "body", + "schema": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "description": "Issue IDs", + "items": { + "type": "integer" + } + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "An object with the temporary file ID needed to download the exported data. See \"Download a DOI Export\" above.", + "schema": { + "type": "object", + "properties": { + "temporaryFileId": { + "type": "integer" + } + }, + "example": { + "temporaryFileId": 1 + } + } + }, + "400": { + "x-summary": "Request Invalid", + "description": "The export could not be completed because of invalid request parameters or other required settings.\n\n|Error Code|Description|\n|---|---|\n|`api.dois.400.invalidPubObjectIncluded`|One or more invalid publication objects were included with the request.|\n|`api.dois.400.noRegistrationAgencyConfigured`|No DOI registration agency has been configured for this journal.|\n|`api.dois.400.xmlExportFailed`|An XML validation error occurred and the XML could not be exported.|", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to manage DOIs in this journal.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The export could not be completed because an issue or DOI could not be found with the corresponding ID.\n\n|Error Code|Description|\n|---|---|\n|`api.dois.404.noPubObjectIncluded`|No valid publication objects were included with the request.|\n|`api.dois.404.doiNotFound`|The DOI you requested was not found.|", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/dois/issues/deposit": { + "put": { + "tags": [ + "DOIs / Issues" + ], + "summary": "Deposit Issue DOIs.", + "description": "This will deposit the specified issue DOIs with the currently configured DOI registration agency.", + "parameters": [ + { + "in": "body", + "schema": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "description": "Issue IDs", + "items": { + "type": "integer" + } + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "An empty response body." + }, + "400": { + "x-summary": "Request Invalid", + "description": "There was an error when submitting the DOIs to the registration agency.\n\n|Error Code|Description|\n|---|---|\n|`api.dois.400.invalidPubObjectIncluded`|One or more invalid publication objects were included with the request.|\n|`api.dois.400.noRegistrationAgencyConfigured`|No DOI registration agency has been configured for this journal.|\n|`api.dois.400.depositFailed`|Some items were not deposited successfully. Please check the individual items for their specific error messages.|", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to manage DOIs in this journal.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The deposit could not be completed because a submission or DOI could not be found with the corresponding ID.\n\n|Error Code|Description|\n|---|---|\n|`api.dois.404.noPubObjectIncluded`|No valid publication objects were included with the request.|", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/dois/issues/markRegistered": { + "put": { + "tags": [ + "DOIs / Issues" + ], + "summary": "Mark Issue DOIs registered.", + "description": "This will mark the specified issue DOIs as registered. This can be done to indicate the items were deposited outside of OJS.", + "parameters": [ + { + "in": "body", + "schema": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "description": "Issue IDs", + "items": { + "type": "integer" + } + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "An empty response body." + }, + "400": { + "x-summary": "Request Invalid", + "description": "List of error messages for any issues for which the action failed.", + "schema": { + "type": "object", + "properties": { + "failedDoiActions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "example": { + "failedDoiActions": [ + "Failed to mark the DOI registered for Vol. 1, No. 2: Lorem Ipsum. The issue must be published before the status can be updated." + ] + } + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to manage DOIs in this journal.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "No valid publication objects were included with the request.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/dois/issues/markUnregistered": { + "put": { + "tags": [ + "DOIs / Issues" + ], + "summary": "Mark Issue DOIs unregistered.", + "description": "This will mark the specified issue DOIs as unregistered. This can be done to remove a DOI's previous registration status.", + "parameters": [ + { + "in": "body", + "schema": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "description": "Issue IDs", + "items": { + "type": "integer" + } + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "An empty response body." + }, + "400": { + "x-summary": "Request Invalid", + "description": "List of error messages for any issues for which the action failed.", + "schema": { + "type": "object", + "properties": { + "failedDoiActions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "example": { + "failedDoiActions": [ + "Could not create a DOI for the following issue: Vol. 1, No. 2: Lorem Ipsum. It does not exist in the current journal context." + ] + } + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to manage DOIs in this journal.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "No valid publication objects were included with the request.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/dois/issues/markStale": { + "put": { + "tags": [ + "DOIs / Issues" + ], + "summary": "Mark Issue DOIs needs sync.", + "description": "This will mark the specified issue DOIs as needing to be resubmitted to the registration agency to update their metadata records.", + "parameters": [ + { + "in": "body", + "schema": { + "type": "object", + "properties": { + "ids": { + "type": "array", + "description": "Issue IDs", + "items": { + "type": "integer" + } + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "An empty response body." + }, + "400": { + "x-summary": "Request Invalid", + "description": "List of error messages for any issues for which the action failed.", + "schema": { + "type": "object", + "properties": { + "failedDoiActions": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "example": { + "failedDoiActions": [ + "Failed to mark the DOI needs sync for Vol. 1, No. 2: Lorem Ipsum. The DOI cannot be marked needs sync because they have not yet been registered or submitted." + ] + } + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to manage DOIs in this journal.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "No valid publication objects were included with the request.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, "/emailTemplates": { "get": { "tags": [ diff --git a/schemas/submission.json b/schemas/submission.json index 03f8b932e48..1f98d04049b 100644 --- a/schemas/submission.json +++ b/schemas/submission.json @@ -7,7 +7,7 @@ "properties": { "sectionId": { "type": "integer", - "description": "The section this submission should be assigned to. This can only be passed when creating a new submission and the data is assigned to the first publication. Edit the publication to change the `sectionId`.", + "description": "The section this submission should be assigned to. This can only be passed when creating a new submission and the data is assigned to the first publication. After the submission is created, edit the publication to change the `sectionId`.", "writeOnly": true } } From abadeff50e3642eee7615f9e2da9688dd50cbc49 Mon Sep 17 00:00:00 2001 From: Nate Wright Date: Thu, 23 Mar 2023 16:31:29 +0000 Subject: [PATCH 02/14] pkp/pkp-lib#8844 Update locale key for DOI error message --- locale/ar/api.po | 2 +- locale/az/api.po | 2 +- locale/bg/api.po | 2 +- locale/ca/api.po | 2 +- locale/ckb/api.po | 2 +- locale/cs/api.po | 2 +- locale/da/api.po | 2 +- locale/de/api.po | 2 +- locale/el/api.po | 2 +- locale/en/api.po | 2 +- locale/eo/api.po | 2 +- locale/es/api.po | 2 +- locale/es_MX/api.po | 2 +- locale/fi/api.po | 2 +- locale/fr_CA/api.po | 2 +- locale/fr_FR/api.po | 2 +- locale/gl/api.po | 2 +- locale/he/api.po | 2 +- locale/hi/api.po | 2 +- locale/hu/api.po | 2 +- locale/hy/api.po | 2 +- locale/id/api.po | 2 +- locale/is/api.po | 2 +- locale/it/api.po | 2 +- locale/ja/api.po | 2 +- locale/ka/api.po | 2 +- locale/kk/api.po | 2 +- locale/ko/api.po | 2 +- locale/mk/api.po | 2 +- locale/ms/api.po | 2 +- locale/nb/api.po | 2 +- locale/nl/api.po | 2 +- locale/pl/api.po | 2 +- locale/pt_BR/api.po | 2 +- locale/pt_PT/api.po | 2 +- locale/ro/api.po | 2 +- locale/ru/api.po | 2 +- locale/sk/api.po | 2 +- locale/sl/api.po | 2 +- locale/sv/api.po | 2 +- locale/tr/api.po | 2 +- locale/uk/api.po | 2 +- locale/uz@cyrillic/api.po | 2 +- locale/uz@latin/api.po | 2 +- locale/vi/api.po | 2 +- locale/zh_CN/api.po | 2 +- locale/zh_Hant/api.po | 2 +- 47 files changed, 47 insertions(+), 47 deletions(-) diff --git a/locale/ar/api.po b/locale/ar/api.po index 46e9b060e56..c4f476aab18 100644 --- a/locale/ar/api.po +++ b/locale/ar/api.po @@ -54,7 +54,7 @@ msgstr "ليست لديك صلاحية حذف هذه المجلة." msgid "api.contexts.404.contextNotFound" msgstr "تعذر العثور على المجلة التي طلبتها." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "مُعرف المكون الرقمي الذي طلبته ليس جزءًا من هذه المجلة." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/az/api.po b/locale/az/api.po index 110500ed335..059012362ad 100644 --- a/locale/az/api.po +++ b/locale/az/api.po @@ -62,7 +62,7 @@ msgstr "Seçdiyiniz ödəmə metodu dəstəklənmir." msgid "api.publications.403.contextsDidNotMatch" msgstr "Axtardığınız nəşr bu jurnala aid deyil." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "İstədiyiniz DOI bu jurnalda deyil." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/bg/api.po b/locale/bg/api.po index d07e3e13ea0..137d743450f 100644 --- a/locale/bg/api.po +++ b/locale/bg/api.po @@ -54,7 +54,7 @@ msgstr "Нямате права да изтриете това списание. msgid "api.contexts.404.contextNotFound" msgstr "Списанието, което търсите не е намерено." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "DOI, който поискахте, не е част от това списание." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/ca/api.po b/locale/ca/api.po index 8f73c1897f5..2a4028fd385 100644 --- a/locale/ca/api.po +++ b/locale/ca/api.po @@ -52,7 +52,7 @@ msgstr "No teniu permís per eliminar aquesta revista." msgid "api.contexts.404.contextNotFound" msgstr "No s'ha trobat la revista que heu sol·licitat." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "El DOI que heu sol·licitat no forma part d'aquesta revista." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/ckb/api.po b/locale/ckb/api.po index 540017b91af..e3c2c99cde3 100644 --- a/locale/ckb/api.po +++ b/locale/ckb/api.po @@ -48,7 +48,7 @@ msgstr "تۆ ڕێگەپێدانی سڕینەوەی ئەم گۆڤارەت نیی msgid "api.contexts.404.contextNotFound" msgstr "ئەو گۆڤارەی کە تۆ بۆی گەڕایت نەدۆزرایەوە." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/cs/api.po b/locale/cs/api.po index 17d0fd910e0..656dcc02ce6 100644 --- a/locale/cs/api.po +++ b/locale/cs/api.po @@ -52,7 +52,7 @@ msgstr "K odstranění tohoto časopisu nemáte oprávnění." msgid "api.contexts.404.contextNotFound" msgstr "Požadovaný časopis nebyl nalezen." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "Požadované DOI není součástí tohoto časopisu." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/da/api.po b/locale/da/api.po index 1884dde2ec9..965f85ca82b 100644 --- a/locale/da/api.po +++ b/locale/da/api.po @@ -54,7 +54,7 @@ msgstr "Du har ikke tilladelse til at slette dette tidsskrift." msgid "api.contexts.404.contextNotFound" msgstr "Det tidsskrift, du rekvirerede blev ikke fundet." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "Den DOI, du anmodede om, er ikke en del af dette tidsskrift." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/de/api.po b/locale/de/api.po index a198f438179..2d74cf6aee2 100644 --- a/locale/de/api.po +++ b/locale/de/api.po @@ -54,7 +54,7 @@ msgstr "Sie haben keine Berechtigung diese Zeitschrift zu löschen." msgid "api.contexts.404.contextNotFound" msgstr "Die Zeitschrift, nach der Sie suchen, wurde nicht gefunden." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "Die DOI, nach der Sie suchen, ist nicht Teil dieses Journals." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/el/api.po b/locale/el/api.po index 906aca513c4..4a1532f72ce 100644 --- a/locale/el/api.po +++ b/locale/el/api.po @@ -55,7 +55,7 @@ msgstr "Δεν έχετε άδεια να διαγράψετε αυτό το π msgid "api.contexts.404.contextNotFound" msgstr "Το περιοδικό που ζητήσατε δεν βρέθηκε." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "Το DOI που ζητήσατε δεν ανήκει σ' αυτό το περιοδικό." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/en/api.po b/locale/en/api.po index b258776db32..668b86232b4 100644 --- a/locale/en/api.po +++ b/locale/en/api.po @@ -49,7 +49,7 @@ msgstr "You do not have permission to delete this journal." msgid "api.contexts.404.contextNotFound" msgstr "The journal you requested was not found." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "The DOI you requested is not part of this journal." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/eo/api.po b/locale/eo/api.po index 041712b1a6d..555ed818dc7 100644 --- a/locale/eo/api.po +++ b/locale/eo/api.po @@ -47,7 +47,7 @@ msgstr "" msgid "api.contexts.404.contextNotFound" msgstr "" -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/es/api.po b/locale/es/api.po index a015b4b49b0..d3cd6e79516 100644 --- a/locale/es/api.po +++ b/locale/es/api.po @@ -55,7 +55,7 @@ msgstr "No tiene permiso para eliminar esta revista." msgid "api.contexts.404.contextNotFound" msgstr "No se encontró la revista solicitada." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "El DOI que solicitó no forma parte de esta revista." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/es_MX/api.po b/locale/es_MX/api.po index bf76974c314..c2114e84055 100644 --- a/locale/es_MX/api.po +++ b/locale/es_MX/api.po @@ -52,7 +52,7 @@ msgstr "No tiene permiso para eliminar esta revista." msgid "api.contexts.404.contextNotFound" msgstr "No se encontró la revista solicitada." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "El DOI que solicitó no forma parte de esta revista." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/fi/api.po b/locale/fi/api.po index 11a4fc78a78..9095b2557ec 100644 --- a/locale/fi/api.po +++ b/locale/fi/api.po @@ -52,7 +52,7 @@ msgstr "Sinulla ei ole lupaa poistaa tätä julkaisua." msgid "api.contexts.404.contextNotFound" msgstr "Etsimääsi julkaisua ei löytynyt." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/fr_CA/api.po b/locale/fr_CA/api.po index 2edd889211a..ce9fc466e06 100644 --- a/locale/fr_CA/api.po +++ b/locale/fr_CA/api.po @@ -57,7 +57,7 @@ msgstr "Vous n'êtes pas autorisé-e à supprimer cette revue." msgid "api.contexts.404.contextNotFound" msgstr "La revue que vous avez demandée n'a pas été trouvée." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "Le DOI demandé ne fait pas partie de cette revue." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/fr_FR/api.po b/locale/fr_FR/api.po index 2a2d8801792..5647516dd07 100644 --- a/locale/fr_FR/api.po +++ b/locale/fr_FR/api.po @@ -53,7 +53,7 @@ msgstr "Vous n'avez pas l'autorisation de supprimer cette revue." msgid "api.contexts.404.contextNotFound" msgstr "La revue que vous avez demandée n'a pas été trouvée." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/gl/api.po b/locale/gl/api.po index 7719e0a6239..b08895d8952 100644 --- a/locale/gl/api.po +++ b/locale/gl/api.po @@ -51,7 +51,7 @@ msgstr "Non ten autorización para eliminar esta revista." msgid "api.contexts.404.contextNotFound" msgstr "A revista que solicitou non se atopou." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/he/api.po b/locale/he/api.po index bb66a9e1960..42bb57d2822 100644 --- a/locale/he/api.po +++ b/locale/he/api.po @@ -49,7 +49,7 @@ msgstr "אין לך הרשאה למחוק את כתב העת הזה." msgid "api.contexts.404.contextNotFound" msgstr "כתב העת שביקשת לא נמצא." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/hi/api.po b/locale/hi/api.po index 38478f498e7..9ead7a9bd5d 100644 --- a/locale/hi/api.po +++ b/locale/hi/api.po @@ -74,7 +74,7 @@ msgstr "आपके पास इस जर्नल को हटाने क msgid "api.contexts.404.contextNotFound" msgstr "आपके द्वारा अनुरोधित जर्नल नहीं मिली." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/hu/api.po b/locale/hu/api.po index a0f3a9e1421..bdcb22b675d 100644 --- a/locale/hu/api.po +++ b/locale/hu/api.po @@ -56,7 +56,7 @@ msgstr "Nincs jogosultsága törölni ezt a folyóiratot." msgid "api.contexts.404.contextNotFound" msgstr "A folyóirat nem található." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/hy/api.po b/locale/hy/api.po index 916383705d4..f0b75806160 100644 --- a/locale/hy/api.po +++ b/locale/hy/api.po @@ -51,7 +51,7 @@ msgstr "Դուք չունեք այս ամսագիրը ջնջելու թույլ msgid "api.contexts.404.contextNotFound" msgstr "Հարցված ամսագիրը չի գտնվել։" -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "Ձեր պահանջած DOI-ն այս ամսագրի մաս չէ:" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/id/api.po b/locale/id/api.po index eea62b8ff3c..dc726964613 100644 --- a/locale/id/api.po +++ b/locale/id/api.po @@ -52,7 +52,7 @@ msgstr "Anda tidak memiliki hak untuk menghapus jurnal ini." msgid "api.contexts.404.contextNotFound" msgstr "Jurnal yang Anda cari tidak ditemukan." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "DOI yang Anda cari bukan bagian dari jurnal ini." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/is/api.po b/locale/is/api.po index 77aae4df0ce..bfa964b12c9 100644 --- a/locale/is/api.po +++ b/locale/is/api.po @@ -50,7 +50,7 @@ msgstr "Þú hefur ekki heimild til að eyða þessu tímariti." msgid "api.contexts.404.contextNotFound" msgstr "Tímaritið sem þú baðst um finnst ekki." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/it/api.po b/locale/it/api.po index dec8bca503c..69f223be49f 100644 --- a/locale/it/api.po +++ b/locale/it/api.po @@ -53,7 +53,7 @@ msgstr "Non hai i permessi per cancellare questa testata." msgid "api.contexts.404.contextNotFound" msgstr "La testata che hai richiesto non è stata trovata." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "Il DOI che hai richiesto non è in questa rivista." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/ja/api.po b/locale/ja/api.po index 2d51db76d08..3ca8238338f 100644 --- a/locale/ja/api.po +++ b/locale/ja/api.po @@ -44,7 +44,7 @@ msgstr "このジャーナルを削除する権限がありません。" msgid "api.contexts.404.contextNotFound" msgstr "ご希望のジャーナルが見つかりませんでした。" -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/ka/api.po b/locale/ka/api.po index 8394839fb07..409bb70d0f4 100644 --- a/locale/ka/api.po +++ b/locale/ka/api.po @@ -50,7 +50,7 @@ msgstr "არ გაქვთ ამ ჟურნალის წაშლი msgid "api.contexts.404.contextNotFound" msgstr "მოთხოვნილი ჟურნალი ვერ მოიძებნა." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "თქვენ მიერ მოთხოვნილი DOI არ არის ამ ჟურნალის ნაწილი." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/kk/api.po b/locale/kk/api.po index 529266b6fd3..8203f240da2 100644 --- a/locale/kk/api.po +++ b/locale/kk/api.po @@ -52,7 +52,7 @@ msgstr "Сізге бұл журналды өшіруге рұқсат бері msgid "api.contexts.404.contextNotFound" msgstr "Сіз сұраған журнал жүйеден табылмады." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "Сіз сұраған DOI бұл журналдың бөлігі емес." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/ko/api.po b/locale/ko/api.po index 9d1e512ee46..3aa36682024 100644 --- a/locale/ko/api.po +++ b/locale/ko/api.po @@ -46,7 +46,7 @@ msgstr "" msgid "api.contexts.404.contextNotFound" msgstr "" -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/mk/api.po b/locale/mk/api.po index b8a5c52a8eb..4ef91f8fda3 100644 --- a/locale/mk/api.po +++ b/locale/mk/api.po @@ -52,7 +52,7 @@ msgstr "Немате дозвола да го бришете ова списан msgid "api.contexts.404.contextNotFound" msgstr "Бараното списание не е најдено." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "ДОИ бројот кој го побаравте не е дел од ова списание." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/ms/api.po b/locale/ms/api.po index aeac4ee54fb..8af4ad3d1f4 100644 --- a/locale/ms/api.po +++ b/locale/ms/api.po @@ -53,7 +53,7 @@ msgstr "Anda tidak mempunyai kebenaran untuk menghapuskan jurnal ini." msgid "api.contexts.404.contextNotFound" msgstr "Jurnal yang anda minta tidak dijumpai." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "DOI yang anda minta bukan sebahagian daripada jurnal ini." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/nb/api.po b/locale/nb/api.po index 77285ce5d41..8127db1ab69 100644 --- a/locale/nb/api.po +++ b/locale/nb/api.po @@ -51,7 +51,7 @@ msgstr "Du har ikke rettigheter til å slette dette tidsskriftet." msgid "api.contexts.404.contextNotFound" msgstr "Tidsskriftet du sendte forespørsel om etter ble ikke funnet." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "DOI-en du spurte etter tilhører ikke dette tidsskriftet." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/nl/api.po b/locale/nl/api.po index 43cd694b336..c04b552d9a0 100644 --- a/locale/nl/api.po +++ b/locale/nl/api.po @@ -51,7 +51,7 @@ msgstr "U heeft geen rechten om dit tijdschrift te verwijderen." msgid "api.contexts.404.contextNotFound" msgstr "Het tijdschrift werd niet gevonden." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/pl/api.po b/locale/pl/api.po index 0e6cc2ff40a..e9b8324cf4b 100644 --- a/locale/pl/api.po +++ b/locale/pl/api.po @@ -51,7 +51,7 @@ msgstr "Nie masz pozwolenia do usunięcia tego czasopisma." msgid "api.contexts.404.contextNotFound" msgstr "Nie znaleziono szukanego czasopisma." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "Żądane DOI nie należy do tego czasopisma." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/pt_BR/api.po b/locale/pt_BR/api.po index 7ad88609753..9b016c2f793 100644 --- a/locale/pt_BR/api.po +++ b/locale/pt_BR/api.po @@ -54,7 +54,7 @@ msgstr "Você não tem permissão para excluir esta revista." msgid "api.contexts.404.contextNotFound" msgstr "A revista solicitada não foi encontrada." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "O DOI solicitado não faz parte desta revista." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/pt_PT/api.po b/locale/pt_PT/api.po index 654c2352bff..64249871968 100644 --- a/locale/pt_PT/api.po +++ b/locale/pt_PT/api.po @@ -55,7 +55,7 @@ msgstr "Não tem permissões para eliminar esta revista." msgid "api.contexts.404.contextNotFound" msgstr "A revista que tentou aceder não foi encontrada." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "O DOI solicitado não faz parte desta revista." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/ro/api.po b/locale/ro/api.po index 4ffa7475536..a176991b591 100644 --- a/locale/ro/api.po +++ b/locale/ro/api.po @@ -52,7 +52,7 @@ msgstr "Nu aveți permisiunea de a șterge acest jurnal." msgid "api.contexts.404.contextNotFound" msgstr "Jurnalul pe care l-ați solicitat nu a fost găsit." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "DOI-ul pe care l-ați solicitat nu face parte din această revistă." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/ru/api.po b/locale/ru/api.po index f5de552adc6..6b77e361529 100644 --- a/locale/ru/api.po +++ b/locale/ru/api.po @@ -55,7 +55,7 @@ msgstr "У вас нет прав на удаление этого журнал msgid "api.contexts.404.contextNotFound" msgstr "Запрошенный вами журнал не найден." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "Запрошенный вами DOI не является частью этого журнала." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/sk/api.po b/locale/sk/api.po index a694b844c0e..960f51da21f 100644 --- a/locale/sk/api.po +++ b/locale/sk/api.po @@ -48,7 +48,7 @@ msgstr "Na odstránenie tohto denníka nemáte oprávnenie." msgid "api.contexts.404.contextNotFound" msgstr "Požadovaný časopis nebol nájdený." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/sl/api.po b/locale/sl/api.po index 87226d98b66..cc7dc809bf3 100644 --- a/locale/sl/api.po +++ b/locale/sl/api.po @@ -54,7 +54,7 @@ msgstr "Nimate pravic za izbris te revije." msgid "api.contexts.404.contextNotFound" msgstr "Zahtevana revija ne obstaja." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "Zahtevani DOI ni del te revije." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/sv/api.po b/locale/sv/api.po index 7ab4ae168fc..0d246d0c9a7 100644 --- a/locale/sv/api.po +++ b/locale/sv/api.po @@ -55,7 +55,7 @@ msgstr "Du har inte tillåtelse att ta bort denna tidskrift." msgid "api.contexts.404.contextNotFound" msgstr "Tidskriften som du efterfrågade kunde inte hittas." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "Den efterfrågade DOI:n finns inte i denna tidskrift." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/tr/api.po b/locale/tr/api.po index 45241c25cc5..c03886ebf00 100644 --- a/locale/tr/api.po +++ b/locale/tr/api.po @@ -53,7 +53,7 @@ msgstr "Bu dergiyi silme yetkisine sahip değilsiniz." msgid "api.contexts.404.contextNotFound" msgstr "Sorguladığınız dergi bulunamadı." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "İstediğiniz DOI bu dergide değil." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/uk/api.po b/locale/uk/api.po index 6631df7e6d0..7e59c8195f7 100644 --- a/locale/uk/api.po +++ b/locale/uk/api.po @@ -51,7 +51,7 @@ msgstr "У вас немає дозволу на видалення цього msgid "api.contexts.404.contextNotFound" msgstr "Запитаний вами журнал не був знайдений." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "Запитаний вами DOI не є частиною цього журналу." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/uz@cyrillic/api.po b/locale/uz@cyrillic/api.po index b5da5064bcf..df003c0f4bd 100644 --- a/locale/uz@cyrillic/api.po +++ b/locale/uz@cyrillic/api.po @@ -41,7 +41,7 @@ msgstr "" msgid "api.contexts.404.contextNotFound" msgstr "" -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/uz@latin/api.po b/locale/uz@latin/api.po index 3a02f0d0e64..887256a28d6 100644 --- a/locale/uz@latin/api.po +++ b/locale/uz@latin/api.po @@ -50,7 +50,7 @@ msgstr "Sizda ushbu jurnalni o'chirishga ruxsat yo'q." msgid "api.contexts.404.contextNotFound" msgstr "Siz so'ragan jurnal topilmadi." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "Siz soʻragan DOI ushbu jurnalning bir qismi emas." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/vi/api.po b/locale/vi/api.po index ea6449f6ca5..1a1baced87e 100644 --- a/locale/vi/api.po +++ b/locale/vi/api.po @@ -50,7 +50,7 @@ msgstr "Bạn không có quyền xóa tạp chí này." msgid "api.contexts.404.contextNotFound" msgstr "Tạp chí bạn yêu cầu không được tìm thấy." -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "DOI bạn yêu cầu không phải là một phần của tạp chí này." msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/zh_CN/api.po b/locale/zh_CN/api.po index 3002c3a5193..c0f03fd5c62 100644 --- a/locale/zh_CN/api.po +++ b/locale/zh_CN/api.po @@ -49,7 +49,7 @@ msgstr "您无权删除此期刊。" msgid "api.contexts.404.contextNotFound" msgstr "未找到您请求的期刊。" -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "" msgid "api.dois.400.noRegistrationAgencyConfigured" diff --git a/locale/zh_Hant/api.po b/locale/zh_Hant/api.po index 54b734b382e..0c4855fdfd1 100644 --- a/locale/zh_Hant/api.po +++ b/locale/zh_Hant/api.po @@ -48,7 +48,7 @@ msgstr "您沒有權限刪除此期刊。" msgid "api.contexts.404.contextNotFound" msgstr "未能找到您所查詢的期刊。" -msgid "api.dois.400.contextsNotMatched" +msgid "api.dois.403.contextsNotMatched" msgstr "你查詢的DOI並不在此期刊。" msgid "api.dois.400.noRegistrationAgencyConfigured" From 228973aed9683e4f0af822cd3805ba9f86812a24 Mon Sep 17 00:00:00 2001 From: Nate Wright Date: Thu, 23 Mar 2023 16:33:03 +0000 Subject: [PATCH 03/14] pkp/pkp-lib#8844 Add HTML titles to API docs --- docs/dev/swagger-source.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dev/swagger-source.json b/docs/dev/swagger-source.json index 482caab1545..fafcde9bc7e 100644 --- a/docs/dev/swagger-source.json +++ b/docs/dev/swagger-source.json @@ -64,7 +64,7 @@ { "name": "What's New in 3.4", "x-traitTag": true, - "description": "The [3.4 Release Notebook](https://docs.pkp.sfu.ca/dev/release-notebooks/en/3.4-release-notebook) contains full details about breaking changes introduced in 3.4. The following changes effect the REST API.\n\n- Use of the `apiToken` as a query parameter is deprecated. Use it in the `Authorization` header instead. See the \"Authentication\" section below.\n- Changes to request body to create a new submission.\n- Changes to the submission property, `submissionProgress`. It is now a string, not an integer.\n- Changes to the stats endpoints.\n- Changes to the endpoints to manage email templates.\n\nThe following new endpoints have been added.\n\n- New endpoint to save a submission for later.\n- New endpoint to submit a submissions.\n- New endpoints to manage a publication's contributors.\n- New endpoints to create and register DOIs.\n- New endpoints to record editorial decisions.\n- New endpoints to manage institutions." + "description": "The [3.4 Release Notebook](https://docs.pkp.sfu.ca/dev/release-notebooks/en/3.4-release-notebook) contains full details about breaking changes introduced in 3.4. The following changes effect the REST API.\n\n- Use of the `apiToken` as a query parameter is deprecated. Use it in the `Authorization` header instead. See the \"Authentication\" section below.\n- Changes to request body to create a new submission.\n- Changes to submission titles. They may now include HTML in the `fullTitle` and `title` properties.\n- Changes to the submission property, `submissionProgress`. It is now a string, not an integer.\n- Changes to the stats endpoints.\n- Changes to the endpoints to manage email templates.\n\nThe following new endpoints have been added.\n\n- New endpoint to save a submission for later.\n- New endpoint to submit a submissions.\n- New endpoints to manage a publication's contributors.\n- New endpoints to create and register DOIs.\n- New endpoints to record editorial decisions.\n- New endpoints to manage institutions." }, { "name": "Access", From 63af200a4b22b497fe9e868251e1e03159d7601b Mon Sep 17 00:00:00 2001 From: Nate Wright Date: Thu, 23 Mar 2023 16:38:44 +0000 Subject: [PATCH 04/14] pkp/pkp-lib#8844 Add HTML subtitles to API docs --- docs/dev/swagger-source.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dev/swagger-source.json b/docs/dev/swagger-source.json index fafcde9bc7e..9d9e383fb5b 100644 --- a/docs/dev/swagger-source.json +++ b/docs/dev/swagger-source.json @@ -64,7 +64,7 @@ { "name": "What's New in 3.4", "x-traitTag": true, - "description": "The [3.4 Release Notebook](https://docs.pkp.sfu.ca/dev/release-notebooks/en/3.4-release-notebook) contains full details about breaking changes introduced in 3.4. The following changes effect the REST API.\n\n- Use of the `apiToken` as a query parameter is deprecated. Use it in the `Authorization` header instead. See the \"Authentication\" section below.\n- Changes to request body to create a new submission.\n- Changes to submission titles. They may now include HTML in the `fullTitle` and `title` properties.\n- Changes to the submission property, `submissionProgress`. It is now a string, not an integer.\n- Changes to the stats endpoints.\n- Changes to the endpoints to manage email templates.\n\nThe following new endpoints have been added.\n\n- New endpoint to save a submission for later.\n- New endpoint to submit a submissions.\n- New endpoints to manage a publication's contributors.\n- New endpoints to create and register DOIs.\n- New endpoints to record editorial decisions.\n- New endpoints to manage institutions." + "description": "The [3.4 Release Notebook](https://docs.pkp.sfu.ca/dev/release-notebooks/en/3.4-release-notebook) contains full details about breaking changes introduced in 3.4. The following changes effect the REST API.\n\n- Use of the `apiToken` as a query parameter is deprecated. Use it in the `Authorization` header instead. See the \"Authentication\" section below.\n- Changes to request body to create a new submission.\n- Changes to submission titles. They may now include HTML in the `fullTitle`, `title`, and `subtitle` properties.\n- Changes to the submission property, `submissionProgress`. It is now a string, not an integer.\n- Changes to the stats endpoints.\n- Changes to the endpoints to manage email templates.\n\nThe following new endpoints have been added.\n\n- New endpoint to save a submission for later.\n- New endpoint to submit a submissions.\n- New endpoints to manage a publication's contributors.\n- New endpoints to create and register DOIs.\n- New endpoints to record editorial decisions.\n- New endpoints to manage institutions." }, { "name": "Access", From d374cd1a80e4913e958f588e8221b6bf76bd7d55 Mon Sep 17 00:00:00 2001 From: Nate Wright Date: Thu, 23 Mar 2023 16:42:19 +0000 Subject: [PATCH 05/14] pkp/pkp-lib#8844 Update error codes in DOI endpoints --- api/v1/_dois/BackendDoiHandler.php | 2 +- api/v1/dois/DoiHandler.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/v1/_dois/BackendDoiHandler.php b/api/v1/_dois/BackendDoiHandler.php index d60a5ed3976..c17fdb74a28 100644 --- a/api/v1/_dois/BackendDoiHandler.php +++ b/api/v1/_dois/BackendDoiHandler.php @@ -129,7 +129,7 @@ public function editIssue(SlimRequest $slimRequest, APIResponse $response, array $context, $this->getUserGroups($context->getId()), $this->getGenres($context->getId()) - )); + ), 200); } protected function getUserGroups(int $contextId): LazyCollection diff --git a/api/v1/dois/DoiHandler.php b/api/v1/dois/DoiHandler.php index d72f9e3a2ee..c2b1c65df09 100644 --- a/api/v1/dois/DoiHandler.php +++ b/api/v1/dois/DoiHandler.php @@ -327,7 +327,7 @@ public function assignIssueDois(SlimRequest $slimRequest, APIResponse $response, $context = $this->getRequest()->getContext(); $doiPrefix = $context->getData(Context::SETTING_DOI_PREFIX); if (empty($doiPrefix)) { - return $response->withStatus(400)->withJsonError('api.dois.400.prefixRequired'); + return $response->withStatus(403)->withJsonError('api.dois.403.prefixRequired'); } $failedDoiActions = []; From 6d4082192f59fe2b1e4dc1ed3381d1b52bcd15d7 Mon Sep 17 00:00:00 2001 From: Nate Wright Date: Mon, 27 Mar 2023 15:11:27 +0100 Subject: [PATCH 06/14] pkp/pkp-lib#8844 Document CSV response types for stats endpoints --- docs/dev/swagger-source.json | 332 +++++++++++++++++++++++++++-------- 1 file changed, 255 insertions(+), 77 deletions(-) diff --git a/docs/dev/swagger-source.json b/docs/dev/swagger-source.json index 9d9e383fb5b..93c96ff72d8 100644 --- a/docs/dev/swagger-source.json +++ b/docs/dev/swagger-source.json @@ -64,7 +64,7 @@ { "name": "What's New in 3.4", "x-traitTag": true, - "description": "The [3.4 Release Notebook](https://docs.pkp.sfu.ca/dev/release-notebooks/en/3.4-release-notebook) contains full details about breaking changes introduced in 3.4. The following changes effect the REST API.\n\n- Use of the `apiToken` as a query parameter is deprecated. Use it in the `Authorization` header instead. See the \"Authentication\" section below.\n- Changes to request body to create a new submission.\n- Changes to submission titles. They may now include HTML in the `fullTitle`, `title`, and `subtitle` properties.\n- Changes to the submission property, `submissionProgress`. It is now a string, not an integer.\n- Changes to the stats endpoints.\n- Changes to the endpoints to manage email templates.\n\nThe following new endpoints have been added.\n\n- New endpoint to save a submission for later.\n- New endpoint to submit a submissions.\n- New endpoints to manage a publication's contributors.\n- New endpoints to create and register DOIs.\n- New endpoints to record editorial decisions.\n- New endpoints to manage institutions." + "description": "
Read the 3.4 Release Notebook to learn about all the changes introduced in 3.4.
\n\nThe following changes were made to the REST API.\n\n- Use of the `apiToken` as a query parameter is deprecated. Use it in the `Authorization` header instead. See the \"Authentication\" section below.\n- Changes to request body to create a new submission.\n- Changes to submission titles. They may now include HTML in the `fullTitle`, `title`, and `subtitle` properties.\n- Changes to the submission property, `submissionProgress`. It is now a string, not an integer.\n- Changes to the stats endpoints.\n- Changes to the endpoints to manage email templates.\n\nThe following new endpoints have been added.\n\n- New endpoint to save a submission for later.\n- New endpoint to submit a submissions.\n- New endpoints to manage a publication's contributors.\n- New endpoints to create and register DOIs.\n- New endpoints to record editorial decisions.\n- New endpoints to manage institutions." }, { "name": "Access", @@ -160,15 +160,15 @@ }, { "name": "Stats / Contexts", - "description": "Only admins and journal managers can access these endpoints." + "description": "Only admins and journal managers can access these endpoints. Some of these endpoints can return results in CSV format. Where possible, send an `Accept: text/csv` header with the request to receive stats in CSV format." }, { "name": "Stats / Issues", - "description": "Only admins and journal managers can access these endpoints." + "description": "Only admins and journal managers can access these endpoints. Some of these endpoints can return results in CSV format. Where possible, send an `Accept: text/csv` header with the request to receive stats in CSV format." }, { "name": "Stats / Publications", - "description": "Only admins and journal managers can access these endpoints." + "description": "Only admins and journal managers can access these endpoints. Some of these endpoints can return results in CSV format. Where possible, send an `Accept: text/csv` header with the request to receive stats in CSV format." }, { "name": "Stats / Users", @@ -176,9 +176,9 @@ }, { "name": "Stats / Sushi", - "description": "Support automatic harvesting of COUNTER R5 reports via the COUNTER_SUSHI API at the path /stats/sushi.", + "description": "COUNTER R5 reports can be harvested via the COUNTER_SUSHI API at the path /stats/sushi. The specification is documented at the link below.", "externalDocs": { - "description": "COUNTER_SUSHI API specification:", + "description": "COUNTER/SUSHI 5.0 API", "url": "https://app.swaggerhub.com/apis/COUNTER/counter-sushi_5_0_api/" } }, @@ -527,13 +527,16 @@ "type": "object", "properties": { "date": { - "type": "string" + "type": "string", + "description": "A machine-readable date in the format `YYYY-MM-DD` or `YYYY-MM`." }, "label": { - "type": "string" + "type": "string", + "description": "A human-readable format of the date, based on the context's configured date foramts." }, "value": { - "type": "integer" + "type": "integer", + "description": "The total for this day or month." } } }, @@ -5108,19 +5111,19 @@ "tags": [ "Stats / Contexts" ], - "summary": "Get a list of contexts sorted by the number of visitors to their homepage.", + "summary": "Get a list of contexts sorted by the number of visits to their homepage.", "description": "Returns a list of journals, presses or preprint servers ordered by the number of visitors to their homepage. Only admins can access this endpoint.", "parameters": [ { "name": "dateStart", - "description": "Return stats for contexts after this date.", + "description": "Return stats for the number of visits after this date.", "in": "query", "required": false, "type": "string" }, { "name": "dateEnd", - "description": "Return stats for contexts before this date.", + "description": "Return stats for the number of visits before this date.", "in": "query", "required": false, "type": "string" @@ -5173,11 +5176,29 @@ "responses": { "200": { "x-summary": "Success", - "description": "A list of contexts with their total stats during the requested period.", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/ContextStats" + "description": "A list of contexts with the number of visits during the requested period.", + "headers": { + "X-Total-Count": { + "description": "Only included in `text/csv` responses. The total number of rows available for this request. Use this with the `count` and `offset` query params to fetch all records.", + "schema": { + "type": "integer" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ContextStats" + } + } + }, + "text/csv": { + "schema": { + "type": "string" + }, + "example": "ID,Title,Total\n1,Lorem Ipsum,100" } } }, @@ -5261,10 +5282,20 @@ "200": { "x-summary": "Success", "description": "A list of days or months with the total stats for that day or month.", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/TimelineInterval" + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TimelineInterval" + } + } + }, + "text/csv": { + "schema": { + "type": "string" + }, + "example": "Date,Label,Total\n2023-03-04,\"March 4, 2023\",532\n2023-03-05,\"March 5, 2023\",351" } } }, @@ -5326,8 +5357,18 @@ "200": { "x-summary": "Success", "description": "The total stats for the context during the period requested.", - "schema": { - "$ref": "#/definitions/ContextStats" + "content": { + "application/json": { + "schema": { + "$ref": "#/definitions/ContextStats" + } + }, + "text/csv": { + "schema": { + "type": "string" + }, + "example": "ID,Title,Total\n1,Lorem Ipsum,100" + } } }, "400": { @@ -5400,10 +5441,20 @@ "200": { "x-summary": "Success", "description": "A list of days or months with the total stats for that day or month.", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/TimelineInterval" + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TimelineInterval" + } + } + }, + "text/csv": { + "schema": { + "type": "string" + }, + "example": "Date,Label,Total\n2023-03-04,\"March 4, 2023\",532\n2023-03-05,\"March 5, 2023\",351" } } }, @@ -5502,10 +5553,20 @@ "200": { "x-summary": "Success", "description": "A list of issues with their total stats during the requested period.", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/IssueStats" + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/IssueStats" + } + } + }, + "text/csv": { + "schema": { + "type": "string" + }, + "example": "ID,\"Issue Identification\",Total,Views,Downloads\n123,\"Vol. 1, No. 2: Special issue name\",823,612,211" } } }, @@ -5599,10 +5660,20 @@ "200": { "x-summary": "Success", "description": "A list of days or months with the total stats for that day or month.", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/TimelineInterval" + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TimelineInterval" + } + } + }, + "text/csv": { + "schema": { + "type": "string" + }, + "example": "Date,Label,\n2023-01-02,\"January 2, 2023\",7341" } } }, @@ -5664,8 +5735,18 @@ "200": { "x-summary": "Success", "description": "The total stats for the issue during the period requested.", - "schema": { - "$ref": "#/definitions/IssueStats" + "content": { + "application/json": { + "schema": { + "$ref": "#/definitions/IssueStats" + } + }, + "text/csv": { + "schema": { + "type": "string" + }, + "example": "ID,\"Issue Identification\",Total,Views,Downloads\n123,\"Vol. 1, No. 2: Special issue name\",823,612,211" + } } }, "400": { @@ -5748,10 +5829,20 @@ "200": { "x-summary": "Success", "description": "A list of days or months with the total stats for that day or month.", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/TimelineInterval" + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TimelineInterval" + } + } + }, + "text/csv": { + "schema": { + "type": "string" + }, + "example": "Date,Label,\n2023-01-02,\"January 2, 2023\",7341" } } }, @@ -5870,10 +5961,28 @@ "200": { "x-summary": "Success", "description": "A list of publications with the number of visits during the requested period.", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/PublicationStats" + "headers": { + "X-Total-Count": { + "description": "Only included in `text/csv` responses. The total number of rows available for this request. Use this with the `count` and `offset` query params to fetch all records.", + "schema": { + "type": "integer" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PublicationStats" + } + } + }, + "text/csv": { + "schema": { + "type": "string" + }, + "example": "ID,Title,Total,Abstract Views,File Views,PDF,HTML,Other\n1,Lorem Ipsum,100,70,30,20,10,0" } } }, @@ -5987,10 +6096,20 @@ "200": { "x-summary": "Success", "description": "A list of days or months with the total stats for that day or month.", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/TimelineInterval" + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/TimelineInterval" + } + } + }, + "text/csv": { + "schema": { + "type": "string" + }, + "example": "Date,Label,\n2023-01-02,\"January 2, 2023\",7341" } } }, @@ -6258,10 +6377,20 @@ "200": { "x-summary": "Success", "description": "A list of files with their total stats during the requested period.", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/PublicationFileStats" + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PublicationFileStats" + } + } + }, + "text/csv": { + "schema": { + "type": "string" + }, + "example": "\"Publication Id\",Title,\"File Id\",Filename,Type,\"File Views\"\n123,\"Lorem Ipsum\",456,lorem-ipsum-file.pdf,\"Primary File\",789" } } }, @@ -6295,7 +6424,7 @@ "Stats / Publications" ], "summary": "Get a list of countries ordered by the number of visits to publications.", - "description": "Returns a list of countries ordered by the number of visits to publications from each country. IP Geolocation is provided by [DB-IP](https://db-ip.com).", + "description": "Returns a list of countries ordered by the number of visits to publications from each country. This endpoint is only available when the context has been configured to collect geographical statistics.", "parameters": [ { "name": "dateStart", @@ -6379,11 +6508,21 @@ "responses": { "200": { "x-summary": "Success", - "description": "A list of countries.", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/PublicationCountryStats" + "description": "A list of countries with their total stats during the requested period.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PublicationCountryStats" + } + } + }, + "text/csv": { + "schema": { + "type": "string" + }, + "example": "Country,Total,Unique\nCAN,456,321" } } }, @@ -6417,7 +6556,7 @@ "Stats / Publications" ], "summary": "Get a list of regions ordered by the number of visits to publications.", - "description": "Returns a list of regions ordered by the number of visits to publications from each country. IP Geolocation is provided by [DB-IP](https://db-ip.com).", + "description": "Returns a list of regions ordered by the number of visits to publications from each region. This endpoint is only available when the context has been configured to collect regional geographical statistics.", "parameters": [ { "name": "dateStart", @@ -6501,11 +6640,21 @@ "responses": { "200": { "x-summary": "Success", - "description": "A list of regions.", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/PublicationRegionStats" + "description": "A list of regions with their total stats during the requested period.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PublicationRegionStats" + } + } + }, + "text/csv": { + "schema": { + "type": "string" + }, + "example": "Region,Country,Total,Unique\nCA-BC,CA,456,321" } } }, @@ -6539,7 +6688,7 @@ "Stats / Publications" ], "summary": "Get a list of cities ordered by the number of visits to publications.", - "description": "Returns a list of cities ordered by the number of visits to publications from each country. IP Geolocation is provided by [DB-IP](https://db-ip.com).", + "description": "Returns a list of cities ordered by the number of visits to publications from each city. This endpoint is only available when the context has been configured to collect city geographical statistics.", "parameters": [ { "name": "dateStart", @@ -6623,11 +6772,21 @@ "responses": { "200": { "x-summary": "Success", - "description": "A list of cities.", - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/PublicationCityStats" + "description": "A list of cities with their total stats during the requested period.", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/PublicationCityStats" + } + } + }, + "text/csv": { + "schema": { + "type": "string" + }, + "example": "City,Region,Country,Total,Unique\nCA-BC-Vancouver,CA-BC,CA,456,321" } } }, @@ -6661,40 +6820,59 @@ "Stats / Users" ], "summary": "Get user statistics.", - "description": "Returns a count of the number of user registrations broken down by roles.\n\nPlease note when using the `registeredBefore` and `registeredAfter` parameters that role counts reflect current user roles.\n\nA user who registered as an author in January, 2019 but was later appointed to subeditor will be counted as a subeditor when the registration date range includes January, 2019.", + "description": "Returns a count of the number of registered users by role. The `registeredBefore` and `registeredAfter` params reflect current user roles. A user who registered as an author in January, 2019 but was later appointed to subeditor will be counted as a subeditor when the registration date range includes January, 2019, even though they did not become a subeditor until a later date.", "parameters": [ { "name": "registeredAfter", - "description": "Return counts reflecting users who registered after this date.", + "description": "Include users who registered after this date.", "in": "query", "required": false, "type": "string" }, { "name": "registeredBefore", - "description": "Return counts reflecting users who registered before this date.", + "description": "Include users who registered before this date.", "in": "query", "required": false, "type": "string" }, { "name": "status", - "description": "Count `active` or `disabled` users. Default: `active`.", + "description": "Whether to include `active`, `disabled` or all users. Default: `active`.", "in": "query", "required": false, "type": "string", "default": "active", "enum": [ "active", - "disabled" + "disabled", + "all" ] } ], "responses": { "200": { - "description": "An object containing the requested stats. The `id` relects the `ROLE_ID_*` constant in the application.", + "x-summary": "Success", + "description": "The user registration stats broken down by role.", "schema": { "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": ["integer", "string"], + "description": "One of the `ROLE_ID_*` constants. Or `total` for users in all roles." + }, + "name": { + "type": "string", + "description": "A user-facing name for the role." + }, + "value":{ + "type": "integer", + "description": "The number of registered users in this role." + } + } + }, "example": [ { "id": "total", From 27116595d4efb933438f77d06ce9926bc98e939a Mon Sep 17 00:00:00 2001 From: Nate Wright Date: Mon, 27 Mar 2023 15:21:32 +0100 Subject: [PATCH 07/14] pkp/pkp-lib##8844 Remove unused 404 responses from stats docs --- docs/dev/swagger-source.json | 91 ------------------------------------ 1 file changed, 91 deletions(-) diff --git a/docs/dev/swagger-source.json b/docs/dev/swagger-source.json index 93c96ff72d8..afd0228484c 100644 --- a/docs/dev/swagger-source.json +++ b/docs/dev/swagger-source.json @@ -5043,13 +5043,6 @@ "schema": { "$ref": "#/definitions/ErrorResponse" } - }, - "404": { - "x-summary": "Request Not Found", - "description": "The requested resource was not found. This should only occur if the API is requested without specifying the context.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } } } } @@ -5095,13 +5088,6 @@ "schema": { "$ref": "#/definitions/ErrorResponse" } - }, - "404": { - "x-summary": "Request Not Found", - "description": "The requested resource was not found. This should only occur if the API is requested without specifying the context.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } } } } @@ -5215,13 +5201,6 @@ "schema": { "$ref": "#/definitions/ErrorResponse" } - }, - "404": { - "x-summary": "Request Not Found", - "description": "The requested resource was not found.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } } } } @@ -5312,13 +5291,6 @@ "schema": { "$ref": "#/definitions/ErrorResponse" } - }, - "404": { - "x-summary": "Request Not Found", - "description": "The requested resource was not found.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } } } } @@ -5583,13 +5555,6 @@ "schema": { "$ref": "#/definitions/ErrorResponse" } - }, - "404": { - "x-summary": "Request Not Found", - "description": "The requested resource was not found.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } } } } @@ -5690,13 +5655,6 @@ "schema": { "$ref": "#/definitions/ErrorResponse" } - }, - "404": { - "x-summary": "Request Not Found", - "description": "The requested resource was not found.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } } } } @@ -5999,13 +5957,6 @@ "schema": { "$ref": "#/definitions/ErrorResponse" } - }, - "404": { - "x-summary": "Request Not Found", - "description": "The requested resource was not found.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } } } } @@ -6126,13 +6077,6 @@ "schema": { "$ref": "#/definitions/ErrorResponse" } - }, - "404": { - "x-summary": "Request Not Found", - "description": "The requested resource was not found.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } } } } @@ -6407,13 +6351,6 @@ "schema": { "$ref": "#/definitions/ErrorResponse" } - }, - "404": { - "x-summary": "Request Not Found", - "description": "The requested resource was not found.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } } } } @@ -6539,13 +6476,6 @@ "schema": { "$ref": "#/definitions/ErrorResponse" } - }, - "404": { - "x-summary": "Request Not Found", - "description": "The requested resource was not found.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } } } } @@ -6671,13 +6601,6 @@ "schema": { "$ref": "#/definitions/ErrorResponse" } - }, - "404": { - "x-summary": "Request Not Found", - "description": "The requested resource was not found.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } } } } @@ -6803,13 +6726,6 @@ "schema": { "$ref": "#/definitions/ErrorResponse" } - }, - "404": { - "x-summary": "Request Not Found", - "description": "The requested resource was not found.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } } } } @@ -6930,13 +6846,6 @@ "schema": { "$ref": "#/definitions/ErrorResponse" } - }, - "404": { - "x-summary": "Request Not Found", - "description": "The requested resource was not found. This should only occur if the API is requested without specifying the context.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } } } } From 95a802f6e700f5dba7d7eedb42891105c24e3c66 Mon Sep 17 00:00:00 2001 From: Nate Wright Date: Mon, 27 Mar 2023 16:03:32 +0100 Subject: [PATCH 08/14] pkp/pkp-lib#8844 Update mailables REST API documentation --- docs/dev/swagger-source.json | 174 ++++++++++++++++++++++------------- 1 file changed, 112 insertions(+), 62 deletions(-) diff --git a/docs/dev/swagger-source.json b/docs/dev/swagger-source.json index afd0228484c..b3b4e1bc566 100644 --- a/docs/dev/swagger-source.json +++ b/docs/dev/swagger-source.json @@ -322,6 +322,102 @@ "fr_CA": "Nom de fichier" } }, + "Mailable": { + "type": "object", + "example": { + "_href": "https://example.org/publicknowledge/api/v1/mailables/DISCUSSION_NOTIFICATION_COPYEDITING", + "dataDescriptions": { + "journalName": "The journal's name", + "journalUrl": "The URL to the journal's homepage", + "...": "All prepared data" + }, + "description": "This email is sent when a discussion is created or replied to in the copyediting stage.", + "emailTemplateKey": "DISCUSSION_NOTIFICATION_COPYEDITING", + "fromRoleIds": [ + 17, + 4097, + 65536 + ], + "groupIds": [ + "copyediting" + ], + "name": "Discussion (Copyediting)", + "supportsTemplates": true, + "toRoleIds": [ + 17, + 4097, + 65536 + ], + "emailTemplates": [ + { + "_href": "https://example.org/publicknowledge/api/v1/emailTemplates/DISCUSSION_NOTIFICATION_COPYEDITING", + "alternateTo": null, + "body": { + "fr_CA": "Prière de saisir votre message.", + "en": "Please enter your message." + }, + "contextId": null, + "id": null, + "key": "DISCUSSION_NOTIFICATION_COPYEDITING", + "name": { + "fr_CA": "", + "en": "Discussion (Copyediting)" + }, + "subject": { + "fr_CA": "Un message à propos de la revue {$journalName}", + "en": "A message regarding {$journalName}" + } + }, + { + "_href": "https://example.org/publicknowledge/api/v1/emailTemplates/COPYEDIT_REQUEST", + "alternateTo": "DISCUSSION_NOTIFICATION_COPYEDITING", + "body": { + "en": "

Dear {$recipientName},

A new submission is ready to be copyedited:

{$submissionId} {$submissionTitle}
{$journalName}

Please follow these steps to complete this task:

  1. 1. Click on the Submission URL below.
  2. 2. Open any files available under Draft Files and edit the files. Use the Copyediting Discussions area if you need to contact the editor(s) or author(s).
  3. 3. Save the copyedited file(s) and upload them to the Copyedited panel.
  4. 4. Use the Copyediting Discussions to notify the editor(s) that all files have been prepared, and that the Production process may begin.

If you are unable to undertake this work at this time or have any questions, please contact me. Thank you for your contribution to this journal.

Kind regards,

{$signature}", + "fr_CA": "{$recipientName},
\n
\nJ'aimerais que vous effectuiez la révision du manuscrit intitulé « {$submissionTitle} » pour la revue {$journalName} à l'aide des étapes suivantes.
\n1. Cliquer sur l'URL de la soumission ci-dessous.
\n2. Ouvrir le(s) fichier(s) disponible(s) sous Fichiers des ébauches finales et effectuer votre révision, tout en ajoutant des discussions sur la révision, le cas échéant.
\n3. Enregistrer le(s) fichier(s) révisé(s) et le(s) téléverser dans la section Version(s) révisée(s).
\n4. Informer le,la rédacteur-trice que tous les fichiers ont été révisés et que l'étape de production peut débuter.
\n
\nURL de la revue {$journalName} : {$journalUrl}
\nURL de la soumission : {$submissionUrl}
\nNom d'utilisateur-trice : {$recipientUsername}" + }, + "contextId": 1, + "id": 1, + "key": "COPYEDIT_REQUEST", + "name": { + "en": "Request Copyedit", + "fr_CA": "" + }, + "subject": { + "en": "Submission {$submissionId} is ready to be copyedited for {$contextAcronym}", + "fr_CA": "Demande de révision d'une soumission" + } + } + ] + } + }, + "MailableSummary": { + "type": "object", + "example": { + "_href": "https://example.org/publicknowledge/api/v1/mailables/DISCUSSION_NOTIFICATION_COPYEDITING", + "dataDescriptions": { + "journalName": "The journal's name", + "journalUrl": "The URL to the journal's homepage", + "...": "All prepared data" + }, + "description": "This email is sent when a discussion is created or replied to in the copyediting stage.", + "emailTemplateKey": "DISCUSSION_NOTIFICATION_COPYEDITING", + "fromRoleIds": [ + 17, + 4097, + 65536 + ], + "groupIds": [ + "copyediting" + ], + "name": "Discussion (Copyediting)", + "supportsTemplates": true, + "toRoleIds": [ + 17, + 4097, + 65536 + ] + } + }, "Publication": "publication", "PublicationCityStats": { "type": "object", @@ -4395,6 +4491,13 @@ "schema": { "$ref": "#/definitions/InvalidParametersResponse" } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to add an email template.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } } } } @@ -4548,6 +4651,13 @@ "type": "string" } } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to reset all email templates.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } } } } @@ -4807,7 +4917,7 @@ "schema": { "type": "array", "items": { - "type": "string" + "$ref": "#/definitions/MailableSummary" } } }, @@ -4842,7 +4952,7 @@ "x-summary": "Success", "description": "The mailable's fully qualified class name", "schema": { - "type": "string" + "$ref": "#/definitions/Mailable" } }, "403": { @@ -4862,66 +4972,6 @@ } } }, - "/mailables/{id}/emailTemplates": { - "put": { - "tags": [ - "Mailables" - ], - "summary": "Assign email templates", - "description": "Assign custom email templates to a `Mailable` class.", - "parameters": [ - { - "name": "id", - "description": "The ID of the mailable derived from the fully-qualified class name, such as `PKP-mail-mailables-ReviewRequest`.", - "in": "path", - "required": true, - "type": "string" - }, - { - "name": "templateKeys", - "description": "The `key`s of custom email templates.", - "in": "body", - "type": "array", - "items": { - "type": "string" - } - } - ], - "responses": { - "200": { - "x-summary": "Success", - "description": "The list of assigned custom email templates.", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "400": { - "x-summary": "Request Invalid", - "description": "No email template keys were sent with the request.", - "schema": { - "$ref": "#/definitions/InvalidParametersResponse" - } - }, - "403": { - "x-summary": "Request Unauthorized", - "description": "You do not have permission to assign email templates to mailables.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } - }, - "404": { - "x-summary": "Request Not Found", - "description": "The requested mailable or email template(s) could not be found.", - "schema": { - "$ref": "#/definitions/ErrorResponse" - } - } - } - } - }, "/stats/editorial": { "get": { "tags": [ From fd3526a709539accd93c22b52256de1fa4836958 Mon Sep 17 00:00:00 2001 From: Nate Wright Date: Tue, 28 Mar 2023 12:53:28 +0100 Subject: [PATCH 09/14] pkp/pkp-lib#8844 Add decision request body examples to API docs --- .../dev/swagger-source-decision-examples.json | 203 ++++++++++++++++++ docs/dev/swagger-source.json | 114 ++++++++++ 2 files changed, 317 insertions(+) create mode 100644 docs/dev/swagger-source-decision-examples.json diff --git a/docs/dev/swagger-source-decision-examples.json b/docs/dev/swagger-source-decision-examples.json new file mode 100644 index 00000000000..e1506c4b7d5 --- /dev/null +++ b/docs/dev/swagger-source-decision-examples.json @@ -0,0 +1,203 @@ +{ + "APP\\decision\\types\\Accept": { + "actions": [ + { + "type": "email", + "id": "notifyAuthors", + "canChangeRecipients": false + }, + { + "type": "email", + "id": "notifyReviewers", + "canChangeRecipients": true + }, + { + "type": "form", + "id": "payment", + "data": { + "requestPayment": true + } + } + ] + }, + "PKP\\decision\\types\\BackFromCopyediting": { + "actions": [ + { + "type": "email", + "id": "notifyAuthors", + "canChangeRecipients": false + } + ] + }, + "PKP\\decision\\types\\BackFromProduction": { + "actions": [ + { + "type": "email", + "id": "notifyAuthors", + "canChangeRecipients": false + } + ] + }, + "PKP\\decision\\types\\CancelReviewRound": { + "actions": [ + { + "type": "email", + "id": "notifyAuthors", + "canChangeRecipients": false + }, + { + "type": "email", + "id": "notifyReviewers", + "canChangeRecipients": true + } + ] + }, + "PKP\\decision\\types\\Decline": { + "actions": [ + { + "type": "email", + "id": "notifyAuthors", + "canChangeRecipients": false + }, + { + "type": "email", + "id": "notifyReviewers", + "canChangeRecipients": true + } + ] + }, + "PKP\\decision\\types\\InitialDecline": { + "actions": [ + { + "type": "email", + "id": "notifyAuthors", + "canChangeRecipients": false + } + ] + }, + "PKP\\decision\\types\\NewExternalReviewRound": { + "actions": [ + { + "type": "email", + "id": "notifyAuthors", + "canChangeRecipients": false + } + ] + }, + "PKP\\decision\\types\\RecommendAccept": { + "actions": [ + { + "type": "email", + "id": "discussion", + "canChangeRecipients": false + } + ] + }, + "PKP\\decision\\types\\RecommendDecline": { + "actions": [ + { + "type": "email", + "id": "discussion", + "canChangeRecipients": false + } + ] + }, + "PKP\\decision\\types\\RecommendResubmit": { + "actions": [ + { + "type": "email", + "id": "discussion", + "canChangeRecipients": false + } + ] + }, + "PKP\\decision\\types\\RecommendRevisions": { + "actions": [ + { + "type": "email", + "id": "discussion", + "canChangeRecipients": false + } + ] + }, + "PKP\\decision\\types\\RequestRevisions": { + "actions": [ + { + "type": "email", + "id": "notifyAuthors", + "canChangeRecipients": false + }, + { + "type": "email", + "id": "notifyReviewers", + "canChangeRecipients": true + } + ] + }, + "PKP\\decision\\types\\Resubmit": { + "actions": [ + { + "type": "email", + "id": "notifyAuthors", + "canChangeRecipients": false + }, + { + "type": "email", + "id": "notifyReviewers", + "canChangeRecipients": true + } + ] + }, + "PKP\\decision\\types\\RevertDecline": { + "actions": [ + { + "type": "email", + "id": "notifyAuthors", + "canChangeRecipients": false + } + ] + }, + "PKP\\decision\\types\\RevertInitialDecline": { + "actions": [ + { + "type": "email", + "id": "notifyAuthors", + "canChangeRecipients": false + } + ] + }, + "PKP\\decision\\types\\SendExternalReview": { + "actions": [ + { + "type": "email", + "id": "notifyAuthors", + "canChangeRecipients": false + } + ] + }, + "PKP\\decision\\types\\SendToProduction": { + "actions": [ + { + "type": "email", + "id": "notifyAuthors", + "canChangeRecipients": false + } + ] + }, + "APP\\decision\\types\\SkipExternalReview": { + "actions": [ + { + "type": "email", + "id": "notifyAuthors", + "canChangeRecipients": false + }, + { + "type": "form", + "id": "payment", + "data": { + "requestPayment": true + } + } + ] + } +} \ No newline at end of file diff --git a/docs/dev/swagger-source.json b/docs/dev/swagger-source.json index b3b4e1bc566..f692eb7695d 100644 --- a/docs/dev/swagger-source.json +++ b/docs/dev/swagger-source.json @@ -33,6 +33,7 @@ "name": "Endpoints", "tags": [ "Submissions", + "Submissions / Decisions", "Submissions / Files", "Submissions / Participants", "Submissions / Publications", @@ -99,6 +100,10 @@ { "name": "Submissions" }, + { + "name": "Submissions / Decisions", + "description": "Use these endpoints to get or record editorial decisions on a submission. Editorial decisions include actions like accepting or declining a submission, sending a submission to the next stage, and requesting revisions. Editorial decisions can not be edited or deleted after they are recorded. Learn more about [Decisions](https://docs.pkp.sfu.ca/dev/documentation/en/decisions)." + }, { "name": "Submissions / Files" }, @@ -250,6 +255,16 @@ } } }, + "Decision": "decision", + "DecisionAction": { + "a": "b", + "c": "d", + "actions": [ + { + "$ref": "#/definitions/DecisionEmail" + } + ] + }, "Doi": "doi", "ErrorResponse": { "type": "object", @@ -1120,6 +1135,105 @@ } } }, + "/submissions/{submissionId}/decisions": { + "get": { + "tags": [ + "Submissions / Decisions" + ], + "summary": "Get decisions for a submission.", + "description": "Get the editorial decisions that have been recorded for this submission.", + "parameters": [ + { + "name": "submissionId", + "in": "path", + "description": "Submission ID", + "required": true, + "type": "integer" + } + ], + "responses": { + "200": { + "x-summary": "Success.", + "description": "An array of the decisions recorded for this submission.", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/DecisionSummary" + } + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to view decisions for the requested submission.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The submission could not be found.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + }, + "post": { + "tags": [ + "Submissions / Decisions" + ], + "summary": "Record a decision for a submission.", + "description": "Record a new editorial decision for this submission. This endpoint is configured to support customizable actions when recording a decision. Each decision supports pre-defined actions, but plugins can extend each decision to take additional actions or create new decisions.\n\nMost of the built-in decisions use one or more actions. View the \"Request samples\" for this endpoint to see which decisions use which actions. Most decisions use one or more of the following types:\n\n| Action | Description |\n| --- | --- |\n| Email | Details about the email message, recipients and attachments. If the example request body includes an empty `recipients` array, that means the decision does not allow the recipients to be modified. It is configured to always send to the same recipients. For example, most emails to notify authors will automatically be sent to the assigned authors and co-authors, depending on how the journal has configured their email notification settings. |\n| Form | A form payload that includes the action `id` and any input data from the form. |\n\nA custom decision is not restricted to these types. Any data can be sent through the `actions` property and handled on the server. Learn more about [Decisions](https://docs.pkp.sfu.ca/dev/documentation/en/decisions).", + "parameters": [ + { + "name": "submissionId", + "in": "path", + "description": "Submission ID", + "required": true, + "type": "integer" + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/definitions/DecisionEditable" + } + } + } + }, + "responses": { + "200": { + "x-summary": "Success.", + "description": "The decision that was recorded.", + "schema": { + "$ref": "#/definitions/DecisionSummary" + } + }, + "400": { + "x-summary": "Request Invalid", + "description": "The values you sent with the request did not pass validation. The response will contain information about which parameters failed validation.", + "schema": { + "$ref": "#/definitions/InvalidParametersResponse" + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You do not have permission to view decisions for the requested submission.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The submission could not be found.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, "/submissions/{submissionId}/files": { "get": { "tags": [ From efb24bf615460c007b4ddb568b093b6fa48a8fbd Mon Sep 17 00:00:00 2001 From: Nate Wright Date: Tue, 28 Mar 2023 15:58:23 +0100 Subject: [PATCH 10/14] pkp/pkp-lib#8844 Document submission file copy API endpoint --- docs/dev/swagger-source.json | 86 ++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/docs/dev/swagger-source.json b/docs/dev/swagger-source.json index f692eb7695d..86c68d40777 100644 --- a/docs/dev/swagger-source.json +++ b/docs/dev/swagger-source.json @@ -1481,6 +1481,92 @@ "schema": { "$ref": "#/definitions/ErrorResponse" } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The requested submission or file could not be found.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + } + } + } + }, + "/submissions/{submissionId}/files/{submissionFileId}/copy": { + "put": { + "tags": [ + "Submissions / Files" + ], + "summary": "Copy a submission file.", + "description": "Copy a submission file to a new file stage. This is usually used to promote a file from one stage to another. For example, a file in \"Revisions\" can be promoted to \"Files for Copyediting\" so that a copyeditor can begin working with it. Learn more about [File Stages](https://docs.pkp.sfu.ca/dev/documentation/en/submission-files#file-stages).", + "parameters": [ + { + "name": "submissionId", + "in": "path", + "description": "Submission ID", + "required": true, + "type": "integer" + }, + { + "name": "submissionFileId", + "in": "path", + "description": "Submission File ID", + "required": true, + "type": "integer" + }, + { + "name": "stageId", + "in": "query", + "description": "The workflow stage id of the file to be copied. For example, `WORKFLOW_STAGE_ID_PRODUCTION`.", + "required": true, + "type": "integer" + }, + { + "in": "body", + "schema": { + "type": "object", + "required": ["toFileStage"], + "properties": { + "reviewRoundId": { + "type": "integer", + "description": "Optional. The ID of a review round to copy this file to. Only use this when you want to copy a file to a file stage in a particular review round. If omitted, the file will be copied to the latest review round." + }, + "toFileStage": { + "type": "integer", + "description": "One of the `SubmissionFile::SUBMISSION_FILE_*` constants. Learn about [File Stages](https://docs.pkp.sfu.ca/dev/documentation/en/submission-files#file-stages)." + } + } + } + } + ], + "responses": { + "200": { + "x-summary": "Success", + "description": "The new submission file that was created.", + "schema": { + "$ref": "#/definitions/SubmissionFile" + } + }, + "400": { + "x-summary": "Request Invalid", + "description": "There was an error when uploading the file or the values you sent with the request did not pass validation. The response will contain information about which parameters failed validation.\n\n| Error Code | Message |\n| --- | --- |\n| `api.submissionFiles.400.noFileStageId` | No parameter `toFileStage` was found in the request body. |\n| `api.submissionFiles.400.invalidFileStage` | The value of `toFileStage` does not match a known file stage. |\n| `api.submissionFiles.400.reviewRoundSubmissionNotMatch` | The `reviewRoundId` specified is not part of this submission. |\n| `api.submissionFiles.400.reviewRoundIdRequired` | No valid review round was found to copy this file to. |", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "403": { + "x-summary": "Request Unauthorized", + "description": "You are not allowed to copy the requested file.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } + }, + "404": { + "x-summary": "Request Not Found", + "description": "The requested submission or file could not be found.", + "schema": { + "$ref": "#/definitions/ErrorResponse" + } } } } From c0b583b12337edd93277698152fabb7d4519ee42 Mon Sep 17 00:00:00 2001 From: Nate Wright Date: Tue, 28 Mar 2023 16:02:42 +0100 Subject: [PATCH 11/14] pkp/pkp-lib#8844 Add submission file copying and mailable endpoints to API what's new docs for 3.4 --- docs/dev/swagger-source.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dev/swagger-source.json b/docs/dev/swagger-source.json index 86c68d40777..00cfec48569 100644 --- a/docs/dev/swagger-source.json +++ b/docs/dev/swagger-source.json @@ -65,7 +65,7 @@ { "name": "What's New in 3.4", "x-traitTag": true, - "description": "
Read the 3.4 Release Notebook to learn about all the changes introduced in 3.4.
\n\nThe following changes were made to the REST API.\n\n- Use of the `apiToken` as a query parameter is deprecated. Use it in the `Authorization` header instead. See the \"Authentication\" section below.\n- Changes to request body to create a new submission.\n- Changes to submission titles. They may now include HTML in the `fullTitle`, `title`, and `subtitle` properties.\n- Changes to the submission property, `submissionProgress`. It is now a string, not an integer.\n- Changes to the stats endpoints.\n- Changes to the endpoints to manage email templates.\n\nThe following new endpoints have been added.\n\n- New endpoint to save a submission for later.\n- New endpoint to submit a submissions.\n- New endpoints to manage a publication's contributors.\n- New endpoints to create and register DOIs.\n- New endpoints to record editorial decisions.\n- New endpoints to manage institutions." + "description": "
Read the 3.4 Release Notebook to learn about all the changes introduced in 3.4.
\n\nThe following changes were made to the REST API.\n\n- Use of the `apiToken` as a query parameter is deprecated. Use it in the `Authorization` header instead. See the \"Authentication\" section below.\n- Changes to request body to create a new submission.\n- Changes to submission titles. They may now include HTML in the `fullTitle`, `title`, and `subtitle` properties.\n- Changes to the submission property, `submissionProgress`. It is now a string, not an integer.\n- Changes to the stats endpoints.\n- Changes to the endpoints to manage email templates.\n\nThe following new endpoints have been added.\n\n- New endpoint to save a submission for later.\n- New endpoint to submit a submission.\n- New endpoint to copy a submission file from one file stage to another.\n- New endpoints to manage a publication's contributors.\n- New endpoints to create and register DOIs.\n- New endpoints to record editorial decisions.\n- New endpoints to manage institutions.\n- New endpoints to get mailables." }, { "name": "Access", From 9afa7763a36872de42ca567e0959d6ccc7019979 Mon Sep 17 00:00:00 2001 From: Nate Wright Date: Tue, 28 Mar 2023 16:04:23 +0100 Subject: [PATCH 12/14] pkp/pkp-lib#8844 Remove incomplete warning in 3.4 API docs --- docs/dev/swagger-source.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dev/swagger-source.json b/docs/dev/swagger-source.json index 00cfec48569..6d34de1e467 100644 --- a/docs/dev/swagger-source.json +++ b/docs/dev/swagger-source.json @@ -3,7 +3,7 @@ "info": { "version": "3.4", "title": "REST API - OJS", - "description": "
The documentation for 3.4 is still being completed. Some of the information below may change before release.
\n\nThis document describes how to interact with the REST API in [Open Journal Systems](https://pkp.sfu.ca/software/ojs). It is a technical document intended for software developers who wish to build applications to interact with OJS. This document only describes the REST API for OJS. However, similar REST APIs exist for [Open Monograph Press](https://pkp.sfu.ca/software/omp) and [Open Preprint Systems](https://pkp.sfu.ca/software/ops).\n\nView the [Developer Documentation Hub](https://docs.pkp.sfu.ca/dev) to view all documentation for these applications.", + "description": "This document describes how to interact with the REST API in [Open Journal Systems](https://pkp.sfu.ca/software/ojs). It is a technical document intended for software developers who wish to build applications to interact with OJS. This document only describes the REST API for OJS. However, similar REST APIs exist for [Open Monograph Press](https://pkp.sfu.ca/software/omp) and [Open Preprint Systems](https://pkp.sfu.ca/software/ops).\n\nView the [Developer Documentation Hub](https://docs.pkp.sfu.ca/dev) to view all documentation for these applications.", "contact": { "name": "Public Knowledge Project", "url": "https://docs.pkp.sfu.ca" From e5a67242ee87bea6a4c15f991ca237ad34622bd1 Mon Sep 17 00:00:00 2001 From: Nate Wright Date: Tue, 28 Mar 2023 16:13:09 +0100 Subject: [PATCH 13/14] pkp/pkp-lib#8844 Adjust margin in API docs section header --- docs/dev/swagger-source.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dev/swagger-source.json b/docs/dev/swagger-source.json index 6d34de1e467..9e1774c8782 100644 --- a/docs/dev/swagger-source.json +++ b/docs/dev/swagger-source.json @@ -65,7 +65,7 @@ { "name": "What's New in 3.4", "x-traitTag": true, - "description": "
Read the 3.4 Release Notebook to learn about all the changes introduced in 3.4.
\n\nThe following changes were made to the REST API.\n\n- Use of the `apiToken` as a query parameter is deprecated. Use it in the `Authorization` header instead. See the \"Authentication\" section below.\n- Changes to request body to create a new submission.\n- Changes to submission titles. They may now include HTML in the `fullTitle`, `title`, and `subtitle` properties.\n- Changes to the submission property, `submissionProgress`. It is now a string, not an integer.\n- Changes to the stats endpoints.\n- Changes to the endpoints to manage email templates.\n\nThe following new endpoints have been added.\n\n- New endpoint to save a submission for later.\n- New endpoint to submit a submission.\n- New endpoint to copy a submission file from one file stage to another.\n- New endpoints to manage a publication's contributors.\n- New endpoints to create and register DOIs.\n- New endpoints to record editorial decisions.\n- New endpoints to manage institutions.\n- New endpoints to get mailables." + "description": "
Read the 3.4 Release Notebook to learn about all the changes introduced in 3.4.
\n\nThe following changes were made to the REST API.\n\n- Use of the `apiToken` as a query parameter is deprecated. Use it in the `Authorization` header instead. See the \"Authentication\" section below.\n- Changes to request body to create a new submission.\n- Changes to submission titles. They may now include HTML in the `fullTitle`, `title`, and `subtitle` properties.\n- Changes to the submission property, `submissionProgress`. It is now a string, not an integer.\n- Changes to the stats endpoints.\n- Changes to the endpoints to manage email templates.\n\nThe following new endpoints have been added.\n\n- New endpoint to save a submission for later.\n- New endpoint to submit a submission.\n- New endpoint to copy a submission file from one file stage to another.\n- New endpoints to manage a publication's contributors.\n- New endpoints to create and register DOIs.\n- New endpoints to record editorial decisions.\n- New endpoints to manage institutions.\n- New endpoints to get mailables." }, { "name": "Access", From 7bd9c639642733370f8251daad6b38bc5350bdc4 Mon Sep 17 00:00:00 2001 From: Nate Wright Date: Wed, 29 Mar 2023 10:17:53 +0100 Subject: [PATCH 14/14] Submodule update ##NateWr/i8844_api_docs## --- lib/pkp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/pkp b/lib/pkp index 05cefb0940d..32ce6fb7309 160000 --- a/lib/pkp +++ b/lib/pkp @@ -1 +1 @@ -Subproject commit 05cefb0940dc3d32e82798db8b49c119794a41ba +Subproject commit 32ce6fb7309b66e0587a32f08ca15a9ee221177e