diff --git a/.redocly.lint-ignore.yaml b/.redocly.lint-ignore.yaml index 344c852dc29..94a8ecedfc4 100644 --- a/.redocly.lint-ignore.yaml +++ b/.redocly.lint-ignore.yaml @@ -1,470 +1,9 @@ -# This file instructs Redocly's linter to ignore the rules contained for specific parts of your API. -# See https://redoc.ly/docs/cli/ for more information. -docs/api/apiv3/openapi-spec.yml: - no-empty-servers: - - '#/servers' +tmp/oas-generated.yml: info-license: - '#/info' - no-ambiguous-paths: - - '#/paths/~1api~1v3~1queries~1{id}~1star' - - '#/paths/~1api~1v3~1queries~1{id}~1unstar' - - '#/paths/~1api~1v3~1relations~1{id}~1form' - - '#/paths/~1api~1v3~1work_packages~1{id}~1activities' - - '#/paths/~1api~1v3~1work_packages~1{id}~1attachments' - - '#/paths/~1api~1v3~1work_packages~1{id}~1available_projects' - - '#/paths/~1api~1v3~1work_packages~1{id}~1available_relation_candidates' - - '#/paths/~1api~1v3~1work_packages~1{id}~1available_watchers' - - '#/paths/~1api~1v3~1work_packages~1{id}~1form' - - '#/paths/~1api~1v3~1work_packages~1{id}~1revisions' - - '#/paths/~1api~1v3~1work_packages~1{work_package_id}~1relations' - - '#/paths/~1api~1v3~1work_packages~1{work_package_id}~1watchers' -docs/api/apiv3/paths/root.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links -docs/api/apiv3/components/schemas/activity_model.yml: - spec: - - '#/properties/details/type' -docs/api/apiv3/paths/activity.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_type -docs/api/apiv3/components/schemas/attachment_model.yml: - spec: - - '#/properties/digest/type' -docs/api/apiv3/components/schemas/link.yml: - spec: - - '#/examples' -docs/api/apiv3/paths/attachments.yml: - no-invalid-media-type-examples: - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/filesize - - '#/post/responses/200/content/application~1hal+json/examples/response/value' - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/staticDownloadLocation -docs/api/apiv3/paths/attachment.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/filesize - - '#/get/responses/200/content/application~1hal+json/examples/response/value' - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/staticDownloadLocation -docs/api/apiv3/paths/budget.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/id - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/subject -docs/api/apiv3/paths/category.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type -docs/api/apiv3/components/schemas/configuration_model.yml: - spec: - - '#/properties/perPageOptions/type' -docs/api/apiv3/paths/configuration.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type -docs/api/apiv3/paths/custom_object.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type -docs/api/apiv3/paths/document.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_embedded - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/description - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/addAttachment -docs/api/apiv3/components/schemas/grid_model.yml: - spec: - - '#/properties/widgets/type' -docs/api/apiv3/paths/grids.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/scope - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links -docs/api/apiv3/paths/grid.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/scope - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links -docs/api/apiv3/paths/news_item.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_embedded - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/description -docs/api/apiv3/paths/post.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_embedded - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/attachments - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/project - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/self -docs/api/apiv3/paths/priority.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type -docs/api/apiv3/paths/project_copy.yml: operation-2xx-response: - - '#/post/responses' -docs/api/apiv3/paths/project_work_packages.yml: - no-invalid-media-type-examples: - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/customField1 - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/customField2 - - '#/post/responses/200/content/application~1hal+json/examples/response/value' - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/startDate - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/dueDate - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/derivedStartDate - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/derivedDueDate - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/changeParent - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/customField3 - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/delete - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/logTime - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/move - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/addWatcher/payload - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/customActions - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/watch/payload - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/ancestors - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/children - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/timeEntries/type -docs/api/apiv3/components/schemas/query_model.yml: - spec: - - '#/properties/filters/type' - - '#/properties/timelineLabels/type' -docs/api/apiv3/paths/queries.yml: - no-invalid-media-type-examples: - - >- - #/post/responses/201/content/application~1hal+json/examples/response/value/_embedded - - >- - #/post/responses/201/content/application~1hal+json/examples/response/value/_type - - >- - #/post/responses/201/content/application~1hal+json/examples/response/value/_links/columns - - >- - #/post/responses/201/content/application~1hal+json/examples/response/value/_links/groupBy - - >- - #/post/responses/201/content/application~1hal+json/examples/response/value/_links/highlightedAttributes - - >- - #/post/responses/201/content/application~1hal+json/examples/response/value/_links/project - - >- - #/post/responses/201/content/application~1hal+json/examples/response/value/_links/results - - >- - #/post/responses/201/content/application~1hal+json/examples/response/value/_links/self - - >- - #/post/responses/201/content/application~1hal+json/examples/response/value/_links/sortBy - - >- - #/post/responses/201/content/application~1hal+json/examples/response/value/_links/user -docs/api/apiv3/paths/queries_column.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type -docs/api/apiv3/components/schemas/query_filter_instance_schema_model.yml: - spec: - - '#/properties/name/type' - - '#/properties/filter/type' -docs/api/apiv3/paths/queries_filter.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type -docs/api/apiv3/paths/queries_operator.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type -docs/api/apiv3/paths/queries_sort_by.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type -docs/api/apiv3/paths/query.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_embedded - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/columns - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/groupBy - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/highlightedAttributes - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/project - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/results - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/self - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/sortBy - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/user - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_embedded - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/columns - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/groupBy - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/highlightedAttributes - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/project - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/results - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/self - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/sortBy - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/user -docs/api/apiv3/paths/relation.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/delay - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/delay - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links -docs/api/apiv3/paths/revision.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type -docs/api/apiv3/paths/role.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type -docs/api/apiv3/paths/status.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type -docs/api/apiv3/components/schemas/type_model.yml: - spec: - - '#/properties/color/type' -docs/api/apiv3/paths/type.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type -docs/api/apiv3/paths/version.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/customField14 - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/endDate - - '#/get/responses/200/content/application~1hal+json/examples/response/value' - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/customField4 -docs/api/apiv3/paths/wiki_page.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_embedded - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/attachments - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/project - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/self -docs/api/apiv3/paths/work_packages.yml: - no-invalid-media-type-examples: - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/customField1 - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/customField2 - - '#/post/responses/200/content/application~1hal+json/examples/response/value' - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/startDate - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/dueDate - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/derivedStartDate - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/derivedDueDate - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/changeParent - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/customField3 - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/delete - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/logTime - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/move - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/addWatcher/payload - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/customActions - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/watch/payload - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/ancestors - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/children - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/timeEntries/type -docs/api/apiv3/paths/work_packages_schemas.yml: - no-path-trailing-slash: - - '#/' -docs/api/apiv3/paths/work_package.yml: - no-invalid-media-type-examples: - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/customField1 - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/customField2 - - '#/get/responses/200/content/application~1hal+json/examples/response/value' - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/startDate - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/dueDate - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/derivedStartDate - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/derivedDueDate - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/changeParent - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/customField3 - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/delete - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/logTime - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/move - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/addWatcher/payload - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/customActions - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/watch/payload - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/ancestors - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/children - - >- - #/get/responses/200/content/application~1hal+json/examples/response/value/_links/timeEntries/type - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/customField1 - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/customField2 - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/startDate - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/dueDate - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/derivedStartDate - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/derivedDueDate - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/changeParent - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/customField3 - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/delete - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/logTime - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/move - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/addWatcher/payload - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/customActions - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/watch/payload - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/ancestors - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/children - - >- - #/patch/responses/200/content/application~1hal+json/examples/response/value/_links/timeEntries/type -docs/api/apiv3/paths/work_package_attachments.yml: - no-invalid-media-type-examples: - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_type - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/filesize - - '#/post/responses/200/content/application~1hal+json/examples/response/value' - - >- - #/post/responses/200/content/application~1hal+json/examples/response/value/_links/staticDownloadLocation -docs/api/apiv3/paths/work_package_relations.yml: - operation-2xx-response: - - '#/get/responses' -docs/api/apiv3/components/schemas/schema_model.yml: - spec: - - '#/properties/_dependencies/type' -docs/api/apiv3/components/schemas/time_entry_model.yml: - spec: - - '#/properties/hours/type' + - '#/paths/~1api~1v3~1work_packages~1{id}~1relations/get/responses' + - '#/paths/~1api~1v3~1work_packages~1{id}~1file_links~1{file_link_id}~1download/get/responses' + - '#/paths/~1api~1v3~1work_packages~1{id}~1file_links~1{file_link_id}~1open/get/responses' + operation-4xx-response: + - '#/paths/~1api~1v3~1work_packages~1{id}~1relations/get/responses' \ No newline at end of file diff --git a/docs/api/apiv3/components/schemas/file_link_model.yml b/docs/api/apiv3/components/schemas/file_link_model.yml index ab0a8002a76..49298aa0e90 100644 --- a/docs/api/apiv3/components/schemas/file_link_model.yml +++ b/docs/api/apiv3/components/schemas/file_link_model.yml @@ -4,7 +4,6 @@ type: object required: - id - _type - - storageType - originData properties: id: @@ -15,8 +14,6 @@ properties: type: string enum: - FileLink - storageType: - type: string readOnly: true createdAt: type: string @@ -30,6 +27,17 @@ properties: readOnly: true originData: $ref: '#/components/schemas/File_Link_Origin_DataModel' + _embedded: + type: object + required: + - storage + - container + properties: + storage: + $ref: '#/components/schemas/StorageModel' + container: + oneOf: + - $ref: '#/components/schemas/Work_PackageModel' _links: type: object required: @@ -45,18 +53,26 @@ properties: allOf: - $ref: './link.yml' - description: |- - This file link + This file link. **Resource**: FileLink readOnly: true storage: + allOf: + - $ref: './link.yml' + - description: |- + The storage resource of the linked file. + + **Resource**: Storage + readOnly: true + storageUrl: allOf: - $ref: './link.yml' - description: |- The storage url the file link references to. **Resource**: N/A - readOnly: true + writeOnly: true container: allOf: - $ref: './link.yml' @@ -71,7 +87,7 @@ properties: allOf: - $ref: './link.yml' - description: |- - The uri to delete the file link + The uri to delete the file link. **Resource**: N/A readOnly: true @@ -79,7 +95,7 @@ properties: allOf: - $ref: './link.yml' - description: |- - The uri to download the origin file from + The uri to download the origin file from. **Resource**: N/A readOnly: true @@ -87,7 +103,7 @@ properties: allOf: - $ref: './link.yml' - description: |- - A static uri to fetch the download uri + A static uri to download the origin filefrom the storage. Responds with a redirect. **Resource**: N/A readOnly: true @@ -95,7 +111,15 @@ properties: allOf: - $ref: './link.yml' - description: |- - The uri to open the origin file on the origin itself + The uri to open the origin file on the origin itself. + + **Resource**: N/A + readOnly: true + staticOriginOpen: + allOf: + - $ref: './link.yml' + - description: |- + A static uri to open the origin file on the storage. Responds with a redirect. **Resource**: N/A readOnly: true @@ -103,7 +127,6 @@ properties: example: id: 1337 _type: FileLink - storageType: nextcloud createdAt: '2021-12-20T13:37:00.211Z' updatedAt: '2021-12-20T13:37:00.211Z' originData: @@ -114,13 +137,163 @@ example: lastModifiedAt: '2021-12-20T14:00:13.987Z' createdByName: Luke Skywalker lastModifiedByName: Anakin Skywalker + _embedded: + storage: + id: 1337 + _type: Storage + href: https://nextcloud.deathstar.rocks/ + storageType: nextcloud + createdAt: '2021-12-20T13:37:00.211Z' + updatedAt: '2021-12-20T13:37:00.211Z' + _links: + self: + href: /api/v3/storages/1337 + title: storage + container: + _type: WorkPackage + _links: + self: + href: "/api/v3/work_packages/1528" + title: Develop API + schema: + href: "/api/v3/work_packages/schemas/11-2" + update: + href: "/api/v3/work_packages/1528" + method: patch + title: Update Develop API + delete: + href: "/work_packages/bulk?ids=1528" + method: delete + title: Delete Develop API + logTime: + href: "/work_packages/1528/time_entries/new" + type: text/html + title: Log time on Develop API + move: + href: "/work_packages/1528/move/new" + type: text/html + title: Move Develop API + attachments: + href: "/api/v3/work_packages/1528/attachments" + addAttachment: + href: "/api/v3/work_packages/1528/attachments" + method: post + author: + href: "/api/v3/users/1" + title: OpenProject Admin - admin + customActions: + - href: "/api/v3/work_packages/1528/custom_actions/153/execute" + method: post + title: Reset + - href: "/api/v3/work_packages/1528/custom_actions/94/execute" + method: post + title: Forward to accounting + responsible: + href: "/api/v3/users/23" + title: Laron Leuschke - Alaina5788 + relations: + href: "/api/v3/work_packages/1528/relations" + title: Show relations + revisions: + href: "/api/v3/work_packages/1528/revisions" + assignee: + href: "/api/v3/users/11" + title: Emmie Okuneva - Adele5450 + priority: + href: "/api/v3/priorities/2" + title: Normal + project: + href: "/api/v3/projects/1" + title: A Test Project + status: + href: "/api/v3/statuses/1" + title: New + type: + href: "/api/v3/types/1" + title: A Type + version: + href: "/api/v3/versions/1" + title: Version 1 + availableWatchers: + href: "/api/v3/work_packages/1528/available_watchers" + watch: + href: "/api/v3/work_packages/1528/watchers" + method: post + payload: + user: + href: "/api/v3/users/1" + addWatcher: + href: "/api/v3/work_packages/1528/watchers" + method: post + payload: + user: + href: "/api/v3/users/{user_id}" + templated: true + removeWatcher: + href: "/api/v3/work_packages/1528/watchers/{user_id}" + method: delete + templated: true + addRelation: + href: "/api/v3/relations" + method: post + title: Add relation + changeParent: + href: "/api/v3/work_packages/694" + method: patch + title: Change parent of Bug in OpenProject + addComment: + href: "/api/v3/work_packages/1528/activities" + method: post + title: Add comment + parent: + href: "/api/v3/work_packages/1298" + title: nisi eligendi officiis eos delectus quis voluptas dolores + category: + href: "/api/v3/categories/1298" + title: eligend isi + children: + - href: "/api/v3/work_packages/1529" + title: Write API documentation + ancestors: + - href: "/api/v3/work_packages/1290" + title: Root node of hierarchy + - href: "/api/v3/work_packages/1291" + title: Intermediate node of hierarchy + - href: "/api/v3/work_packages/1298" + title: nisi eligendi officiis eos delectus quis voluptas dolores + timeEntries: + href: "/work_packages/1528/time_entries" + type: text/html + title: Time entries + watchers: + href: "/api/v3/work_packages/1528/watchers" + customField3: + href: api/v3/users/14 + id: 1528 + subject: Develop API + description: + format: markdown + raw: Develop super cool OpenProject API. + html: "

Develop super cool OpenProject API.

" + scheduleManually: false + startDate: + dueDate: + derivedStartDate: + derivedDueDate: + estimatedTime: PT2H + derivedEstimatedTime: PT10H + percentageDone: 0 + customField1: Foo + customField2: 42 + createdAt: '2014-08-29T12:40:53Z' + updatedAt: '2014-08-29T12:44:41Z' _links: self: href: /api/v3/work_package/17/file_links/1337 title: file link storage: - href: https://nextcloud.deathstar.rocks/ - title: Link to storage + href: /api/v3/storage/42 + title: storage container: href: /api/v3/work_package/17 title: work package @@ -136,3 +309,6 @@ example: originOpen: href: https://nextcloud.deathstar.rocks/index.php/f?fileid=5503 title: file open + staticOriginOpen: + href: /api/v3/work_package/17/file_links/1337/open + title: file open diff --git a/docs/api/apiv3/components/schemas/storage_model.yml b/docs/api/apiv3/components/schemas/storage_model.yml new file mode 100644 index 00000000000..c6e7700eaf3 --- /dev/null +++ b/docs/api/apiv3/components/schemas/storage_model.yml @@ -0,0 +1,59 @@ +# Schema: StorageModel +--- +type: object +required: + - id + - _type + - href + - storageType +properties: + id: + type: integer + description: Storage id + _type: + type: string + enum: + - Storage + href: + type: string + format: uri + description: web uri of the storage instance + storageType: + type: string + enum: + - nextcloud + description: |- + The type of the storage resource. Currently only nextcloud storages are supported. + createdAt: + type: string + format: date-time + description: Time of creation + updatedAt: + type: string + format: date-time + description: Time of the most recent change to the storage + _links: + type: object + required: + - self + properties: + self: + allOf: + - $ref: './link.yml' + - description: |- + This storage resource + + **Resource**: Storage +example: + id: 1337 + _type: Storage + href: https://nextcloud.deathstar.rocks/ + storageType: nextcloud + createdAt: '2021-12-20T13:37:00.211Z' + updatedAt: '2021-12-20T13:37:00.211Z' + _links: + self: + href: /api/v3/storages/1337 + title: storage + + \ No newline at end of file diff --git a/docs/api/apiv3/openapi-spec.yml b/docs/api/apiv3/openapi-spec.yml index 5a662ff3f7c..945eb29e728 100644 --- a/docs/api/apiv3/openapi-spec.yml +++ b/docs/api/apiv3/openapi-spec.yml @@ -322,6 +322,8 @@ paths: "$ref": "./paths/statuses.yml" "/api/v3/statuses/{id}": "$ref": "./paths/status.yml" + "/api/v3/storages/{id}": + "$ref": "./paths/storage.yml" "/api/v3/time_entries": "$ref": "./paths/time_entries.yml" "/api/v3/time_entries/{id}/form": @@ -667,6 +669,8 @@ components: "$ref": "./components/schemas/status_model.yml" StatusesModel: "$ref": "./components/schemas/statuses_model.yml" + StorageModel: + "$ref": "./components/schemas/storage_model.yml" Time_EntryModel: "$ref": "./components/schemas/time_entry_model.yml" Time_Entry_ActivityModel: diff --git a/docs/api/apiv3/paths/storage.yml b/docs/api/apiv3/paths/storage.yml new file mode 100644 index 00000000000..0e20e1039b8 --- /dev/null +++ b/docs/api/apiv3/paths/storage.yml @@ -0,0 +1,38 @@ +# /api/v3/storages/{id} +--- +get: + summary: Gets a file link. + operationId: Get_Storage + tags: + - File links + description: |- + Gets a storage resource. + parameters: + - name: id + description: Storage id + in: path + required: true + schema: + type: integer + example: 1337 + responses: + '200': + description: OK + content: + application/hal+json: + schema: + $ref: '#/components/schemas/StorageModel' + '404': + content: + application/hal+json: + schema: + $ref: "#/components/schemas/ErrorResponse" + example: + _type: Error + errorIdentifier: urn:openproject-org:api:v3:errors:NotFound + message: The requested resource could not be found. + description: |- + Returned if the storage does not exist or the client does not have sufficient permissions to see it. + + **Required permission:** view file links + diff --git a/docs/api/apiv3/paths/work_package_file_link.yml b/docs/api/apiv3/paths/work_package_file_link.yml index c720708a78a..b609f3e61ce 100644 --- a/docs/api/apiv3/paths/work_package_file_link.yml +++ b/docs/api/apiv3/paths/work_package_file_link.yml @@ -30,22 +30,6 @@ get: application/hal+json: schema: $ref: '#/components/schemas/File_LinkModel' - headers: { } - '403': - content: - application/hal+json: - schema: - $ref: "#/components/schemas/ErrorResponse" - example: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission - message: You are not allowed to delete file links of this work package. - description: |- - Returned if the client does not have sufficient permissions. - - **Required permission:** view file links - - *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.* '404': content: application/hal+json: @@ -58,7 +42,7 @@ get: description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. - **Required permission:** view work package + **Required permission:** view work package, view file links delete: summary: Removes a file link. @@ -88,7 +72,6 @@ delete: responses: '200': description: OK - headers: { } '403': content: application/hal+json: @@ -97,7 +80,7 @@ delete: example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission - message: You are not allowed to delete file links of this work package. + message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. @@ -114,6 +97,7 @@ delete: errorIdentifier: urn:openproject-org:api:v3:errors:NotFound message: The requested resource could not be found. description: |- - Returned if the work package does not exist or the client does not have sufficient permissions to see it. + Returned if the work package or the file link does not exist or the client does not have sufficient permissions + to see it. - **Required permission:** view work package + **Required permission:** view work package, view file links diff --git a/docs/api/apiv3/paths/work_package_file_link_download.yml b/docs/api/apiv3/paths/work_package_file_link_download.yml index 8c1311ec8a1..9ecfe5f7669 100644 --- a/docs/api/apiv3/paths/work_package_file_link_download.yml +++ b/docs/api/apiv3/paths/work_package_file_link_download.yml @@ -1,6 +1,6 @@ # /api/v3/work_packages/{id}/file_links/{file_link_id}/download --- -post: +get: summary: Creates a download uri of the linked file. operationId: Work_Package_File_Link_Download tags: @@ -25,28 +25,15 @@ post: type: integer example: 42 responses: - '200': - description: OK - content: - application/hal+json: + '303': + headers: + Location: schema: - $ref: '#/components/schemas/Link' - headers: { } - '403': - content: - application/hal+json: - schema: - $ref: "#/components/schemas/ErrorResponse" - example: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission - message: You are not allowed to delete file links of this work package. + type: string + format: uri description: |- - Returned if the client does not have sufficient permissions. - - **Required permission:** view file links - - *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.* + Returned if the request was succesful. In the `Location` header is the uri where the client can download the + origin file from the storage. '404': content: application/hal+json: @@ -59,4 +46,4 @@ post: description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. - **Required permission:** view work package + **Required permission:** view work package, view file links diff --git a/docs/api/apiv3/paths/work_package_file_link_open.yml b/docs/api/apiv3/paths/work_package_file_link_open.yml index 6c1ece6c890..9b42f697131 100644 --- a/docs/api/apiv3/paths/work_package_file_link_open.yml +++ b/docs/api/apiv3/paths/work_package_file_link_open.yml @@ -1,6 +1,6 @@ # /api/v3/work_packages/{id}/file_links/{file_link_id}/open --- -post: +get: summary: Creates an opening uri of the linked file. operationId: Work_Package_File_Link_Open tags: @@ -25,28 +25,15 @@ post: type: integer example: 42 responses: - '200': - description: OK - content: - application/hal+json: + '303': + headers: + Location: schema: - $ref: '#/components/schemas/Link' - headers: { } - '403': - content: - application/hal+json: - schema: - $ref: "#/components/schemas/ErrorResponse" - example: - _type: Error - errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission - message: You are not allowed to delete file links of this work package. + type: string + format: uri description: |- - Returned if the client does not have sufficient permissions. - - **Required permission:** view file links - - *Note that you will only receive this error, if you are at least allowed to see the corresponding work package.* + Returned if the request was succesful. In the `Location` header is the uri where the client can open the origin + file on the storage. '404': content: application/hal+json: @@ -59,4 +46,4 @@ post: description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. - **Required permission:** view work package + **Required permission:** view work package, view file links diff --git a/docs/api/apiv3/paths/work_package_file_links.yml b/docs/api/apiv3/paths/work_package_file_links.yml index b937b95a5ef..e2f7f5a9c7b 100644 --- a/docs/api/apiv3/paths/work_package_file_links.yml +++ b/docs/api/apiv3/paths/work_package_file_links.yml @@ -31,20 +31,12 @@ post: type: object required: - _type - - count - - total - _embedded properties: _type: type: string enum: - Collection - count: - type: integer - minimum: 0 - total: - type: integer - minimum: 0 _embedded: type: object required: @@ -62,6 +54,23 @@ post: storageUrl: type: string format: uri + example: + _type: Collection + _embedded: + elements: + - originData: + id: 5503 + name: logo.png + mimeType: image/png + createdAt: '2021-12-19T09:42:10.170Z' + lastModifiedAt: '2021-12-20T14:00:13.987Z' + createdByName: Luke Skywalker + lastModifiedByName: Anakin Skywalker + _links: + storageUrl: + href: https://nextcloud.deathstar.rocks/ + title: Link to storage + responses: '201': description: Created @@ -112,7 +121,7 @@ post: example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission - message: You are not allowed to create file links of this work package. + message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. @@ -131,7 +140,7 @@ post: description: |- Returned if the work package does not exist or the client does not have sufficient permissions to see it. - **Required permission:** view work package + **Required permission:** view work package, view file links get: summary: Gets all file links of a work package operationId: Work_Package_Get_File_Links @@ -190,7 +199,7 @@ get: example: _type: Error errorIdentifier: urn:openproject-org:api:v3:errors:MissingPermission - message: You are not allowed to create file links of this work package. + message: You are not authorized to access this resource. description: |- Returned if the client does not have sufficient permissions. diff --git a/package.json b/package.json index 21e6897fd70..7d830700e6c 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "npm": "~6.14.13" }, "devDependencies": { + "@redocly/openapi-cli": "^1.0.0-beta.80", "webfonts-generator": "^0.4.0" } } diff --git a/script/api/validate_spec b/script/api/validate_spec index d0dbbdea185..19cc20b6aa0 100755 --- a/script/api/validate_spec +++ b/script/api/validate_spec @@ -7,7 +7,7 @@ require 'yaml' load 'lib/api/open_api.rb' -assembled_path = Tempfile.new.path +assembled_path = "./tmp/oas-generated.yml" spec_path = Pathname(__dir__).join("../../docs/api/apiv3/openapi-spec.yml") full_spec = API::OpenAPI.send(:assemble_spec, spec_path).to_yaml status = 1