From dffed665c5f09a57ffeabf3e83a5653192b88e1f Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 23 Dec 2025 17:36:06 +0000
Subject: [PATCH 1/6] Initial plan
From 095c4a3a913030bac2c28007960ea274957237d2 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 23 Dec 2025 17:43:59 +0000
Subject: [PATCH 2/6] Return 413 Content Too Large when response exceeds
MaxBodyBytes
Co-authored-by: bwalsh <47808+bwalsh@users.noreply.github.com>
---
.../middleware/openapi_response_validator.go | 20 +++++++------------
1 file changed, 7 insertions(+), 13 deletions(-)
diff --git a/cmd/server/middleware/openapi_response_validator.go b/cmd/server/middleware/openapi_response_validator.go
index 0dbff52..2391750 100644
--- a/cmd/server/middleware/openapi_response_validator.go
+++ b/cmd/server/middleware/openapi_response_validator.go
@@ -87,21 +87,15 @@ func NewOpenAPIResponseValidator(cfg ResponseValidatorConfig) gin.HandlerFunc {
return
}
- // If response too large to buffer, decide policy
+ // If response too large to buffer, return 413 Content Too Large
if bw.tooLarge {
- msg := fmt.Sprintf("response body exceeded max buffer (%d bytes); skipping OpenAPI response validation", cfg.MaxBodyBytes)
- if cfg.Mode == ResponseValidationEnforce {
- // In enforce mode, safest is to fail closed *before committing*.
- // We can still send a 500 because we haven’t committed yet.
- c.Writer = bw.underlying // restore
- c.Status(http.StatusInternalServerError)
- c.Header("Content-Type", "application/json")
- c.Writer.Write([]byte(fmt.Sprintf(`{"error":"openapi response validation failed","detail":%q}`, msg)))
- return
- }
- // audit mode: commit and log
+ msg := fmt.Sprintf("response body exceeded max buffer (%d bytes)", cfg.MaxBodyBytes)
logOpenAPIResponseIssue(c, cfg, msg, status, bw.header, bw.body.Bytes())
- _ = bw.commit()
+ // Return 413 Payload Too Large instead of committing truncated response
+ c.Writer = bw.underlying // restore
+ c.Status(http.StatusRequestEntityTooLarge) // 413
+ c.Header("Content-Type", "application/json")
+ c.Writer.Write([]byte(fmt.Sprintf(`{"error":"response too large","detail":%q}`, msg)))
return
}
From 2cd596b66aca93fc0fa21b81260c32ad8f0a21ef Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 23 Dec 2025 17:45:15 +0000
Subject: [PATCH 3/6] Fix terminology: use "Content Too Large" consistently
Co-authored-by: bwalsh <47808+bwalsh@users.noreply.github.com>
---
cmd/server/middleware/openapi_response_validator.go | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/cmd/server/middleware/openapi_response_validator.go b/cmd/server/middleware/openapi_response_validator.go
index 2391750..3e02496 100644
--- a/cmd/server/middleware/openapi_response_validator.go
+++ b/cmd/server/middleware/openapi_response_validator.go
@@ -91,11 +91,11 @@ func NewOpenAPIResponseValidator(cfg ResponseValidatorConfig) gin.HandlerFunc {
if bw.tooLarge {
msg := fmt.Sprintf("response body exceeded max buffer (%d bytes)", cfg.MaxBodyBytes)
logOpenAPIResponseIssue(c, cfg, msg, status, bw.header, bw.body.Bytes())
- // Return 413 Payload Too Large instead of committing truncated response
+ // Return 413 Content Too Large instead of committing truncated response
c.Writer = bw.underlying // restore
c.Status(http.StatusRequestEntityTooLarge) // 413
c.Header("Content-Type", "application/json")
- c.Writer.Write([]byte(fmt.Sprintf(`{"error":"response too large","detail":%q}`, msg)))
+ c.Writer.Write([]byte(fmt.Sprintf(`{"error":"content too large","detail":%q}`, msg)))
return
}
From 2c9461b10ab692a06b4006100e74f586cb417731 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 23 Dec 2025 17:46:56 +0000
Subject: [PATCH 4/6] Make error message more descriptive: "response body too
large"
Co-authored-by: bwalsh <47808+bwalsh@users.noreply.github.com>
---
.../middleware/openapi_response_validator.go | 2 +-
internal/apigen/.openapi-generator-ignore | 23 -
internal/apigen/.openapi-generator/FILES | 53 -
internal/apigen/.openapi-generator/VERSION | 1 -
internal/apigen/Dockerfile | 16 -
internal/apigen/api/openapi.yaml | 3014 -----------------
internal/apigen/go.mod | 32 -
internal/apigen/go.sum | 49 -
internal/apigen/go/README.md | 41 -
internal/apigen/go/api_objects.go | 117 -
internal/apigen/go/api_service_info.go | 26 -
internal/apigen/go/api_upload_request.go | 26 -
internal/apigen/go/model_access_method.go | 33 -
.../go/model_access_method_access_url.go | 20 -
.../go/model_access_method_authorizations.go | 25 -
.../go/model_access_method_update_request.go | 20 -
internal/apigen/go/model_access_url.go | 20 -
internal/apigen/go/model_authorizations.go | 25 -
...model_bulk_access_method_update_request.go | 20 -
...ess_method_update_request_updates_inner.go | 20 -
internal/apigen/go/model_bulk_access_url.go | 24 -
.../apigen/go/model_bulk_delete_request.go | 24 -
.../apigen/go/model_bulk_object_access_id.go | 19 -
..._access_id_bulk_object_access_ids_inner.go | 20 -
.../go/model_bulk_object_id_no_passport.go | 18 -
...bulk_update_access_methods_200_response.go | 17 -
internal/apigen/go/model_checksum.go | 20 -
internal/apigen/go/model_contents_object.go | 26 -
internal/apigen/go/model_delete_request.go | 21 -
internal/apigen/go/model_drs_object.go | 57 -
.../apigen/go/model_drs_object_candidate.go | 41 -
internal/apigen/go/model_drs_service.go | 21 -
internal/apigen/go/model_drs_service_drs.go | 68 -
internal/apigen/go/model_drs_service_type.go | 16 -
internal/apigen/go/model_error.go | 21 -
.../model_get_bulk_access_url_200_response.go | 21 -
.../go/model_get_bulk_objects_200_response.go | 21 -
.../go/model_get_bulk_objects_request.go | 20 -
.../go/model_get_service_info_200_response.go | 54 -
.../model_options_bulk_object_200_response.go | 21 -
.../go/model_post_access_url_request.go | 17 -
.../apigen/go/model_post_object_request.go | 20 -
.../go/model_register_objects_201_response.go | 17 -
.../go/model_register_objects_request.go | 20 -
internal/apigen/go/model_service.go | 50 -
.../apigen/go/model_service_organization.go | 21 -
internal/apigen/go/model_service_type.go | 24 -
internal/apigen/go/model_summary.go | 24 -
internal/apigen/go/model_unresolved_inner.go | 18 -
internal/apigen/go/model_upload_method.go | 25 -
.../go/model_upload_method_access_url.go | 20 -
internal/apigen/go/model_upload_request.go | 20 -
.../apigen/go/model_upload_request_object.go | 32 -
internal/apigen/go/model_upload_response.go | 17 -
.../apigen/go/model_upload_response_object.go | 35 -
internal/apigen/go/routers.go | 173 -
internal/apigen/main.go | 30 -
57 files changed, 1 insertion(+), 4695 deletions(-)
delete mode 100644 internal/apigen/.openapi-generator-ignore
delete mode 100644 internal/apigen/.openapi-generator/FILES
delete mode 100644 internal/apigen/.openapi-generator/VERSION
delete mode 100644 internal/apigen/Dockerfile
delete mode 100644 internal/apigen/api/openapi.yaml
delete mode 100644 internal/apigen/go.mod
delete mode 100644 internal/apigen/go.sum
delete mode 100644 internal/apigen/go/README.md
delete mode 100644 internal/apigen/go/api_objects.go
delete mode 100644 internal/apigen/go/api_service_info.go
delete mode 100644 internal/apigen/go/api_upload_request.go
delete mode 100644 internal/apigen/go/model_access_method.go
delete mode 100644 internal/apigen/go/model_access_method_access_url.go
delete mode 100644 internal/apigen/go/model_access_method_authorizations.go
delete mode 100644 internal/apigen/go/model_access_method_update_request.go
delete mode 100644 internal/apigen/go/model_access_url.go
delete mode 100644 internal/apigen/go/model_authorizations.go
delete mode 100644 internal/apigen/go/model_bulk_access_method_update_request.go
delete mode 100644 internal/apigen/go/model_bulk_access_method_update_request_updates_inner.go
delete mode 100644 internal/apigen/go/model_bulk_access_url.go
delete mode 100644 internal/apigen/go/model_bulk_delete_request.go
delete mode 100644 internal/apigen/go/model_bulk_object_access_id.go
delete mode 100644 internal/apigen/go/model_bulk_object_access_id_bulk_object_access_ids_inner.go
delete mode 100644 internal/apigen/go/model_bulk_object_id_no_passport.go
delete mode 100644 internal/apigen/go/model_bulk_update_access_methods_200_response.go
delete mode 100644 internal/apigen/go/model_checksum.go
delete mode 100644 internal/apigen/go/model_contents_object.go
delete mode 100644 internal/apigen/go/model_delete_request.go
delete mode 100644 internal/apigen/go/model_drs_object.go
delete mode 100644 internal/apigen/go/model_drs_object_candidate.go
delete mode 100644 internal/apigen/go/model_drs_service.go
delete mode 100644 internal/apigen/go/model_drs_service_drs.go
delete mode 100644 internal/apigen/go/model_drs_service_type.go
delete mode 100644 internal/apigen/go/model_error.go
delete mode 100644 internal/apigen/go/model_get_bulk_access_url_200_response.go
delete mode 100644 internal/apigen/go/model_get_bulk_objects_200_response.go
delete mode 100644 internal/apigen/go/model_get_bulk_objects_request.go
delete mode 100644 internal/apigen/go/model_get_service_info_200_response.go
delete mode 100644 internal/apigen/go/model_options_bulk_object_200_response.go
delete mode 100644 internal/apigen/go/model_post_access_url_request.go
delete mode 100644 internal/apigen/go/model_post_object_request.go
delete mode 100644 internal/apigen/go/model_register_objects_201_response.go
delete mode 100644 internal/apigen/go/model_register_objects_request.go
delete mode 100644 internal/apigen/go/model_service.go
delete mode 100644 internal/apigen/go/model_service_organization.go
delete mode 100644 internal/apigen/go/model_service_type.go
delete mode 100644 internal/apigen/go/model_summary.go
delete mode 100644 internal/apigen/go/model_unresolved_inner.go
delete mode 100644 internal/apigen/go/model_upload_method.go
delete mode 100644 internal/apigen/go/model_upload_method_access_url.go
delete mode 100644 internal/apigen/go/model_upload_request.go
delete mode 100644 internal/apigen/go/model_upload_request_object.go
delete mode 100644 internal/apigen/go/model_upload_response.go
delete mode 100644 internal/apigen/go/model_upload_response_object.go
delete mode 100644 internal/apigen/go/routers.go
delete mode 100644 internal/apigen/main.go
diff --git a/cmd/server/middleware/openapi_response_validator.go b/cmd/server/middleware/openapi_response_validator.go
index 3e02496..e588baa 100644
--- a/cmd/server/middleware/openapi_response_validator.go
+++ b/cmd/server/middleware/openapi_response_validator.go
@@ -95,7 +95,7 @@ func NewOpenAPIResponseValidator(cfg ResponseValidatorConfig) gin.HandlerFunc {
c.Writer = bw.underlying // restore
c.Status(http.StatusRequestEntityTooLarge) // 413
c.Header("Content-Type", "application/json")
- c.Writer.Write([]byte(fmt.Sprintf(`{"error":"content too large","detail":%q}`, msg)))
+ c.Writer.Write([]byte(fmt.Sprintf(`{"error":"response body too large","detail":%q}`, msg)))
return
}
diff --git a/internal/apigen/.openapi-generator-ignore b/internal/apigen/.openapi-generator-ignore
deleted file mode 100644
index 7484ee5..0000000
--- a/internal/apigen/.openapi-generator-ignore
+++ /dev/null
@@ -1,23 +0,0 @@
-# OpenAPI Generator Ignore
-# Generated by openapi-generator https://github.com/openapitools/openapi-generator
-
-# Use this file to prevent files from being overwritten by the generator.
-# The patterns follow closely to .gitignore or .dockerignore.
-
-# As an example, the C# client generator defines ApiClient.cs.
-# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
-#ApiClient.cs
-
-# You can match any string of characters against a directory, file or extension with a single asterisk (*):
-#foo/*/qux
-# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
-
-# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
-#foo/**/qux
-# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
-
-# You can also negate patterns with an exclamation (!).
-# For example, you can ignore all files in a docs folder with the file extension .md:
-#docs/*.md
-# Then explicitly reverse the ignore rule for a single file:
-#!docs/README.md
diff --git a/internal/apigen/.openapi-generator/FILES b/internal/apigen/.openapi-generator/FILES
deleted file mode 100644
index 75dd5fd..0000000
--- a/internal/apigen/.openapi-generator/FILES
+++ /dev/null
@@ -1,53 +0,0 @@
-.openapi-generator-ignore
-Dockerfile
-api/openapi.yaml
-go.mod
-go/README.md
-go/api_objects.go
-go/api_service_info.go
-go/api_upload_request.go
-go/model_access_method.go
-go/model_access_method_access_url.go
-go/model_access_method_authorizations.go
-go/model_access_method_update_request.go
-go/model_access_url.go
-go/model_authorizations.go
-go/model_bulk_access_method_update_request.go
-go/model_bulk_access_method_update_request_updates_inner.go
-go/model_bulk_access_url.go
-go/model_bulk_delete_request.go
-go/model_bulk_object_access_id.go
-go/model_bulk_object_access_id_bulk_object_access_ids_inner.go
-go/model_bulk_object_id_no_passport.go
-go/model_bulk_update_access_methods_200_response.go
-go/model_checksum.go
-go/model_contents_object.go
-go/model_delete_request.go
-go/model_drs_object.go
-go/model_drs_object_candidate.go
-go/model_drs_service.go
-go/model_drs_service_drs.go
-go/model_drs_service_type.go
-go/model_error.go
-go/model_get_bulk_access_url_200_response.go
-go/model_get_bulk_objects_200_response.go
-go/model_get_bulk_objects_request.go
-go/model_get_service_info_200_response.go
-go/model_options_bulk_object_200_response.go
-go/model_post_access_url_request.go
-go/model_post_object_request.go
-go/model_register_objects_201_response.go
-go/model_register_objects_request.go
-go/model_service.go
-go/model_service_organization.go
-go/model_service_type.go
-go/model_summary.go
-go/model_unresolved_inner.go
-go/model_upload_method.go
-go/model_upload_method_access_url.go
-go/model_upload_request.go
-go/model_upload_request_object.go
-go/model_upload_response.go
-go/model_upload_response_object.go
-go/routers.go
-main.go
diff --git a/internal/apigen/.openapi-generator/VERSION b/internal/apigen/.openapi-generator/VERSION
deleted file mode 100644
index 2fb556b..0000000
--- a/internal/apigen/.openapi-generator/VERSION
+++ /dev/null
@@ -1 +0,0 @@
-7.18.0-SNAPSHOT
diff --git a/internal/apigen/Dockerfile b/internal/apigen/Dockerfile
deleted file mode 100644
index bde270e..0000000
--- a/internal/apigen/Dockerfile
+++ /dev/null
@@ -1,16 +0,0 @@
-FROM golang:1.19 AS build
-WORKDIR /go/src
-COPY go ./go
-COPY main.go .
-COPY go.sum .
-COPY go.mod .
-
-ENV CGO_ENABLED=0
-
-RUN go build -o openapi .
-
-FROM scratch AS runtime
-ENV GIN_MODE=release
-COPY --from=build /go/src/openapi ./
-EXPOSE 8080/tcp
-ENTRYPOINT ["./openapi"]
diff --git a/internal/apigen/api/openapi.yaml b/internal/apigen/api/openapi.yaml
deleted file mode 100644
index 3ddbcd4..0000000
--- a/internal/apigen/api/openapi.yaml
+++ /dev/null
@@ -1,3014 +0,0 @@
-components:
- parameters:
- AccessId:
- description: An `access_id` from the `access_methods` list of a `DrsObject`
- in: path
- name: access_id
- required: true
- schema:
- type: string
- Checksum:
- description: A `checksum` value from the `checksums` list of a `DrsObject`
- in: path
- name: checksum
- required: true
- schema:
- type: string
- Expand:
- description: |-
- If false and the object_id refers to a bundle, then the ContentsObject array contains only those objects directly contained in the bundle. That is, if the bundle contains other bundles, those other bundles are not recursively included in the result.
- If true and the object_id refers to a bundle, then the entire set of objects in the bundle is expanded. That is, if the bundle contains other bundles, then those other bundles are recursively expanded and included in the result. Recursion continues through the entire sub-tree of the bundle.
- If the object_id refers to a blob, then the query parameter is ignored.
- in: query
- name: expand
- schema:
- type: boolean
- ObjectId:
- description: '`DrsObject` identifier'
- in: path
- name: object_id
- required: true
- schema:
- type: string
- requestBodies:
- AccessMethodUpdateBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AccessMethodUpdateRequest'
- description: Request body for updating access methods of a DRS object
- required: true
- BulkAccessMethodUpdateBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkAccessMethodUpdateRequest'
- description: Request body for bulk updating access methods of multiple DRS objects
- required: true
- BulkDeleteBody:
- content:
- application/json:
- examples:
- bulk_full_delete:
- description: Delete both metadata and storage data for multiple objects (requires server support via deleteStorageDataSupported)
- summary: Bulk delete metadata and storage data
- value:
- bulk_object_ids:
- - drs_object_123456
- - drs_object_789012
- delete_storage_data: true
- passports:
- - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
- bulk_metadata_delete:
- description: Delete multiple DRS objects metadata while preserving underlying storage data (default and safest option)
- summary: Bulk delete metadata only
- value:
- bulk_object_ids:
- - drs_object_123456
- - drs_object_789012
- - drs_object_345678
- delete_storage_data: false
- passports:
- - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
- bulk_no_auth_delete:
- description: Bulk delete operation without GA4GH Passport authentication (for public objects or when using Bearer token in headers)
- summary: Bulk delete without authentication
- value:
- bulk_object_ids:
- - drs_object_123456
- - drs_object_789012
- delete_storage_data: false
- large_bulk_delete:
- description: Delete many objects in a single request (check maxBulkDeleteLength in service-info for limits)
- summary: Large bulk delete operation
- value:
- bulk_object_ids:
- - drs_object_001
- - drs_object_002
- - drs_object_003
- - drs_object_004
- - drs_object_005
- - drs_object_006
- - drs_object_007
- - drs_object_008
- - drs_object_009
- - drs_object_010
- delete_storage_data: false
- passports:
- - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
- minimal_bulk_request:
- description: Simplest bulk delete request with required fields only
- summary: Minimal bulk delete request
- value:
- bulk_object_ids:
- - drs_object_123456
- - drs_object_789012
- mixed_object_types:
- description: Delete objects with different ID formats and types in a single request
- summary: Mixed object types deletion
- value:
- bulk_object_ids:
- - drs://example.org/123456
- - local_object_789
- - uuid:550e8400-e29b-41d4-a716-446655440000
- - compact:prefix:identifier
- delete_storage_data: false
- passports:
- - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
- schema:
- $ref: '#/components/schemas/BulkDeleteRequest'
- required: true
- BulkObjectBody:
- content:
- application/json:
- examples:
- bulk_retrieve:
- description: Retrieve metadata for multiple existing DRS objects using their IDs
- summary: Bulk retrieve objects
- value:
- bulk_object_ids:
- - drs_object_123456
- - drs_object_789012
- - drs_object_345678
- passports:
- - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
- bulk_retrieve_no_auth:
- description: Retrieve metadata for public DRS objects
- summary: Bulk retrieve without authentication
- value:
- bulk_object_ids:
- - drs_object_public_123
- - drs_object_public_456
- schema:
- $ref: '#/components/schemas/GetBulkObjects_request'
- required: true
- DeleteBody:
- content:
- application/json:
- examples:
- full_delete:
- description: Delete both DRS object metadata and underlying storage data (requires server support via deleteStorageDataSupported)
- summary: Delete metadata and storage data
- value:
- delete_storage_data: true
- passports:
- - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
- metadata_only_delete:
- description: Delete DRS object metadata while preserving underlying storage data. This is the default and safest option.
- summary: Delete metadata only (default)
- value:
- delete_storage_data: false
- passports:
- - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
- minimal_request:
- description: Simplest delete request with no authentication and default behavior (metadata only)
- summary: Minimal delete request
- value: {}
- multiple_passports:
- description: Delete request with multiple GA4GH Passports for complex authorization scenarios
- summary: Multiple GA4GH Passports
- value:
- delete_storage_data: false
- passports:
- - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
- - eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.AbCdEfGhIjKlMnOpQrStUvWxYz
- no_auth_delete:
- description: Delete operation without GA4GH Passport authentication (for public objects or when using Bearer token in headers)
- summary: Delete without authentication
- value:
- delete_storage_data: false
- update_workflow:
- description: Delete metadata only to enable safe update pattern (delete metadata, then re-register with new metadata)
- summary: Safe update workflow
- value:
- delete_storage_data: false
- passports:
- - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
- schema:
- $ref: '#/components/schemas/DeleteRequest'
- required: false
- Passports:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/PostAccessURL_request'
- required: true
- PostObjectBody:
- content:
- application/json:
- examples:
- retrieve_expanded_bundle:
- description: Request expanded bundle contents with passport authentication
- summary: Retrieve expanded bundle with authentication
- value:
- expand: true
- passports:
- - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
- - eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.additional_passport_signature
- retrieve_with_auth:
- description: Request object metadata with passport authentication
- summary: Retrieve object with authentication
- value:
- expand: false
- passports:
- - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
- schema:
- $ref: '#/components/schemas/PostObject_request'
- required: true
- RegisterObjectsBody:
- content:
- application/json:
- examples:
- bulk_object_registration:
- description: Register multiple DRS objects in a single request
- summary: Register multiple objects
- value:
- candidates:
- - access_methods:
- - access_url:
- url: s3://genomics-bucket/assemblies/hg38.fasta
- type: s3
- checksums:
- - checksum: a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
- type: sha-256
- description: Human genome reference assembly
- mime_type: text/plain
- name: genome_assembly.fasta
- size: 3221225472
- - access_methods:
- - access_url:
- url: https://data.example.org/files/annotations.gff3
- type: https
- checksums:
- - checksum: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
- type: sha-256
- description: Gene annotations in GFF3 format
- mime_type: text/plain
- name: annotations.gff3
- size: 524288000
- single_object_registration:
- description: Register one DRS object after upload
- summary: Register a single object
- value:
- candidates:
- - access_methods:
- - access_url:
- url: s3://my-bucket/uploads/sample_data.vcf
- type: s3
- checksums:
- - checksum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- type: sha-256
- description: Variant call format file for sample analysis
- mime_type: text/plain
- name: sample_data.vcf
- size: 1048576
- passports:
- - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
- schema:
- $ref: '#/components/schemas/RegisterObjects_request'
- description: Request body for registering DRS objects after upload
- required: true
- UploadRequestBody:
- content:
- application/json:
- examples:
- multiple_files:
- description: Request upload methods for multiple files with different types
- summary: Multiple files upload request
- value:
- requests:
- - aliases:
- - hg38_reference
- checksums:
- - checksum: a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
- type: sha-256
- - checksum: 098f6bcd4621d373cade4e832627b4f6
- type: md5
- description: Human genome reference assembly
- mime_type: text/plain
- name: genome_assembly.fasta
- size: 3221225472
- - checksums:
- - checksum: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
- type: sha-256
- description: Gene annotations in GFF3 format
- mime_type: text/plain
- name: annotations.gff3
- size: 524288000
- - checksums:
- - checksum: c89e4c5c7f2c8c8e8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c
- type: sha-256
- description: Sample metadata and experimental conditions
- mime_type: application/json
- name: metadata.json
- size: 2048
- no_passports:
- description: Request for public upload endpoints that don't require authentication
- summary: Upload request without authentication
- value:
- requests:
- - checksums:
- - checksum: d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35
- type: sha-256
- description: Public research dataset
- mime_type: text/csv
- name: public_dataset.csv
- size: 10240
- single_file:
- description: Request upload methods for a single file
- summary: Single file upload request
- value:
- passports:
- - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
- requests:
- - aliases:
- - sample_001_variants
- - vcf_batch_2024
- checksums:
- - checksum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- type: sha-256
- description: Variant call format file for sample analysis
- mime_type: text/plain
- name: sample_data.vcf
- size: 1048576
- schema:
- $ref: '#/components/schemas/UploadRequest'
- required: true
- responses:
- 200AccessMethodUpdate:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/DrsObject'
- description: Access methods successfully updated. Returns the updated DRS object with new access methods and updated timestamp.
- 200BulkAccessMethodUpdate:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/bulkUpdateAccessMethods_200_response'
- description: Access methods successfully updated for all objects. Returns updated DRS objects with new access methods and updated timestamps.
- 200OkAccess:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AccessURL'
- description: The `AccessURL` was found successfully
- 200OkAccesses:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/GetBulkAccessURL_200_response'
- description: The `AccessURL` was found successfully
- 200OkAuthorizations:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Authorizations'
- description: '`Authorizations` were found successfully'
- 200OkBulkAuthorizations:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/OptionsBulkObject_200_response'
- description: '`Authorizations` were found successfully'
- 200OkDrsObject:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/DrsObject'
- description: The `DrsObject` was found successfully
- 200OkDrsObjects:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/GetBulkObjects_200_response'
- description: The `DrsObjects` were found successfully
- 200ServiceInfo:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/GetServiceInfo_200_response'
- description: Retrieve info about the DRS service
- 200UploadRequest:
- content:
- application/json:
- examples:
- https_upload:
- description: Response with HTTPS presigned POST URL for direct upload
- summary: HTTPS upload method response
- value:
- responses:
- - aliases:
- - hg38_reference
- checksums:
- - checksum: a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
- type: sha-256
- - checksum: 098f6bcd4621d373cade4e832627b4f6
- type: md5
- description: Human genome reference assembly
- mime_type: text/plain
- name: genome_assembly.fasta
- size: 3221225472
- upload_methods:
- - access_url:
- url: https://upload.example.org/v1/files/drs_object_789012
- type: https
- upload_details:
- post_url: https://upload.example.org/v1/files/drs_object_789012?signature=abc123
- multiple_methods:
- description: Response offering multiple upload method options for flexibility
- summary: Multiple upload methods response
- value:
- responses:
- - checksums:
- - checksum: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
- type: sha-256
- description: Gene annotations in GFF3 format
- mime_type: text/plain
- name: annotations.gff3
- size: 524288000
- upload_methods:
- - access_url:
- url: https://genomics-bucket.s3.us-west-2.amazonaws.com/uploads/drs_object_345678
- region: us-west-2
- type: s3
- upload_details:
- access_key_id: AKIAI44QH8DHBEXAMPLE
- bucket: genomics-bucket
- expires_at: 2024-01-01T12:00:00Z
- key: uploads/drs_object_345678
- secret_access_key: je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
- session_token: temporary_session_token_here
- - access_url:
- url: https://upload-api.example.org/files/drs_object_345678
- type: https
- upload_details:
- post_url: https://upload-api.example.org/files/drs_object_345678?token=upload_token_12345
- - access_url:
- url: https://storage.googleapis.com/genomics-uploads/drs_object_345678
- region: us-central1
- type: gs
- upload_details:
- access_token: ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg
- bucket: genomics-uploads
- expires_at: 2024-01-01T12:00:00Z
- key: drs_object_345678
- s3_upload:
- description: Response with S3 upload method and temporary credentials
- summary: S3 upload method response
- value:
- responses:
- - aliases:
- - sample_001_variants
- - vcf_batch_2024
- checksums:
- - checksum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- type: sha-256
- description: Variant call format file for sample analysis
- mime_type: text/plain
- name: sample_data.vcf
- size: 1048576
- upload_methods:
- - access_url:
- url: https://my-bucket.s3.amazonaws.com/uploads/drs_object_123456
- region: us-east-1
- type: s3
- upload_details:
- access_key_id: AKIAIOSFODNN7EXAMPLE
- bucket: my-bucket
- expires_at: 2024-01-01T12:00:00Z
- key: uploads/drs_object_123456
- secret_access_key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
- session_token: AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE
- schema:
- $ref: '#/components/schemas/UploadResponse'
- description: Upload request processed successfully. Returns upload methods and temporary credentials for the requested files.
- 201ObjectsCreated:
- content:
- application/json:
- examples:
- multiple_objects_created:
- description: Response after registering multiple DRS objects
- summary: Multiple objects registered
- value:
- objects:
- - access_methods:
- - access_url:
- url: s3://genomics-bucket/assemblies/hg38.fasta
- type: s3
- checksums:
- - checksum: a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
- type: sha-256
- created_time: 2024-01-15T09:00:00Z
- description: Human genome reference assembly
- id: drs_obj_a1b2c3d4e5f6
- mime_type: text/plain
- name: genome_assembly.fasta
- self_uri: drs://drs.example.org/drs_obj_a1b2c3d4e5f6
- size: 3221225472
- updated_time: 2024-01-15T09:00:00Z
- version: "1.0"
- - access_methods:
- - access_url:
- url: https://data.example.org/files/annotations.gff3
- type: https
- checksums:
- - checksum: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
- type: sha-256
- created_time: 2024-01-15T09:15:00Z
- description: Gene annotations in GFF3 format
- id: drs_obj_f6e5d4c3b2a1
- mime_type: text/plain
- name: annotations.gff3
- self_uri: drs://drs.example.org/drs_obj_f6e5d4c3b2a1
- size: 524288000
- updated_time: 2024-01-15T09:15:00Z
- version: "1.0"
- single_object_created:
- description: Response after registering one DRS object
- summary: Single object registered
- value:
- objects:
- - access_methods:
- - access_url:
- url: s3://my-bucket/uploads/sample_data.vcf
- type: s3
- checksums:
- - checksum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- type: sha-256
- created_time: 2024-01-15T10:30:00Z
- description: Variant call format file for sample analysis
- id: drs_obj_a1b2c3d4e5f6
- mime_type: text/plain
- name: sample_data.vcf
- self_uri: drs://drs.example.org/drs_obj_a1b2c3d4e5f6
- size: 1048576
- updated_time: 2024-01-15T10:30:00Z
- version: "1.0"
- schema:
- $ref: '#/components/schemas/RegisterObjects_201_response'
- description: DRS objects were successfully registered as an atomic transaction. Returns the complete DRS objects with server-minted IDs and timestamps. All candidate objects were validated and registered together - if any had failed, none would have been registered.
- 202Accepted:
- description: |
- The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
- headers:
- Retry-After:
- description: |
- Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
- schema:
- format: int64
- type: integer
- 204DeleteSuccess:
- description: All DRS objects were successfully deleted. For bulk operations, this indicates that the entire atomic transaction completed successfully - all requested objects have been deleted. Storage data deletion (if requested) was attempted but success is not guaranteed.
- 400BadRequest:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is malformed.
- 400BadRequestDelete:
- content:
- application/json:
- examples:
- empty_object_list:
- description: Bulk delete request with empty object ID array
- summary: Empty object ID list
- value:
- msg: bulk_object_ids cannot be empty
- status_code: 400
- invalid_request_format:
- description: Request body contains invalid JSON or missing required fields
- summary: Malformed request body
- value:
- msg: 'Invalid request body: bulk_object_ids is required for bulk delete operations'
- status_code: 400
- unsupported_storage_deletion:
- description: Client requested storage data deletion but server doesn't support it
- summary: Storage data deletion not supported
- value:
- msg: Server does not support storage data deletion. Set delete_storage_data to false or omit the parameter.
- status_code: 400
- schema:
- $ref: '#/components/schemas/Error'
- description: 'The delete request is malformed or contains unsupported parameters (e.g., delete_storage_data: true when server doesn''t support storage data deletion).'
- 401Unauthorized:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is unauthorized.
- 403Forbidden:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requester is not authorized to perform this action.
- 403ForbiddenDelete:
- content:
- application/json:
- examples:
- insufficient_permissions:
- description: Client lacks permission to delete the specified object
- summary: Insufficient delete permissions
- value:
- msg: Client lacks delete permission for object drs_object_123456
- status_code: 403
- invalid_passport:
- description: Provided GA4GH Passport is invalid or expired
- summary: Invalid GA4GH Passport
- value:
- msg: Invalid or expired GA4GH Passport provided
- status_code: 403
- missing_visa:
- description: GA4GH Passport lacks required visa for delete operation
- summary: Missing required visa
- value:
- msg: GA4GH Passport does not contain required visa for delete operation on this object
- status_code: 403
- schema:
- $ref: '#/components/schemas/Error'
- description: The client is not authorized to delete the requested DRS object.
- 404NotFoundAccess:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested `AccessURL` wasn't found.
- 404NotFoundDelete:
- content:
- application/json:
- examples:
- delete_not_supported:
- description: This server does not support delete operations
- summary: Delete operations not supported
- value:
- msg: Delete operations are not supported by this server
- status_code: 404
- endpoint_not_found:
- description: Delete endpoints are not implemented on this server
- summary: Delete endpoint not available
- value:
- msg: The requested endpoint /objects/delete is not available on this server
- status_code: 404
- object_not_found:
- description: The specified DRS object does not exist
- summary: DRS object not found
- value:
- msg: DRS object drs_object_123456 does not exist
- status_code: 404
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested DRS object for deletion wasn't found, or delete endpoints are not supported by this server.
- 404NotFoundDrsObject:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested `DrsObject` wasn't found.
- 413RequestTooLarge:
- content:
- application/json:
- examples:
- bulk_limit_exceeded:
- description: Request contains more objects than server's maximum bulk delete limit
- summary: Bulk delete limit exceeded
- value:
- msg: Bulk delete request contains 150 objects but server maximum is 100. Check maxBulkDeleteLength in service-info.
- status_code: 413
- request_size_too_large:
- description: The overall request payload exceeds server limits
- summary: Request payload too large
- value:
- msg: Request payload size exceeds server limit of 1MB
- status_code: 413
- schema:
- $ref: '#/components/schemas/Error'
- description: The bulk request is too large.
- 500InternalServerError:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- AuthorizationsNotSupported:
- description: '`Authorizations` are not supported for this object. Default to `None`.'
- schemas:
- AccessMethod:
- properties:
- access_id:
- description: An arbitrary string to be passed to the `/access` method to get an `AccessURL`. This string must be unique within the scope of a single object. Note that at least one of `access_url` and `access_id` must be provided.
- type: string
- access_url:
- $ref: '#/components/schemas/AccessMethod_access_url'
- authorizations:
- $ref: '#/components/schemas/AccessMethod_authorizations'
- available:
- description: Availablity of file in the cloud. This label defines if this file is immediately accessible via DRS. Any delay or requirement of thawing mechanism if the file is in offline/archival storage is classified as false, meaning it is unavailable.
- type: boolean
- cloud:
- description: Name of the cloud service provider that the object belongs to. If the cloud service is Amazon Web Services, Google Cloud Platform or Azure the values should be `aws`, `gcp`, or `azure` respectively.
- type: string
- region:
- description: Name of the region in the cloud service provider that the object belongs to.
- type: string
- type:
- description: Type of the access method.
- enum:
- - s3
- - gs
- - ftp
- - gsiftp
- - globus
- - htsget
- - https
- - file
- type: string
- required:
- - type
- type: object
- AccessMethod_access_url:
- allOf:
- - $ref: '#/components/schemas/AccessURL'
- - description: An `AccessURL` that can be used to fetch the actual object bytes. Note that at least one of `access_url` and `access_id` must be provided.
- type: object
- AccessMethod_authorizations:
- allOf:
- - $ref: '#/components/schemas/Authorizations'
- - description: When `access_id` is provided, `authorizations` provides information about how to authorize the `/access` method.
- type: object
- AccessMethodUpdateRequest:
- properties:
- access_methods:
- description: New access methods for the DRS object
- items:
- $ref: '#/components/schemas/AccessMethod'
- minItems: 1
- type: array
- passports:
- description: Optional GA4GH Passport JWTs for authorization
- items:
- type: string
- type: array
- required:
- - access_methods
- type: object
- AccessURL:
- properties:
- headers:
- description: An optional list of headers to include in the HTTP request to `url`. These headers can be used to provide auth tokens required to fetch the object bytes.
- items:
- type: string
- type: array
- url:
- description: A fully resolvable URL that can be used to fetch the actual object bytes.
- type: string
- required:
- - url
- type: object
- Authorizations:
- properties:
- bearer_auth_issuers:
- description: If authorizations contain `BearerAuth` this is an optional list of issuers that may authorize access to this object. The caller must provide a token from one of these issuers. If this is empty or missing it assumed the caller knows which token to send via other means. It is strongly recommended that the caller validate that it is appropriate to send the requested token to the DRS server to mitigate attacks by malicious DRS servers requesting credentials they should not have.
- items:
- type: string
- type: array
- drs_object_id:
- type: string
- passport_auth_issuers:
- description: If authorizations contain `PassportAuth` this is a required list of visa issuers (as found in a visa's `iss` claim) that may authorize access to this object. The caller must only provide passports that contain visas from this list. It is strongly recommended that the caller validate that it is appropriate to send the requested passport/visa to the DRS server to mitigate attacks by malicious DRS servers requesting credentials they should not have.
- items:
- type: string
- type: array
- supported_types:
- description: An Optional list of support authorization types. More than one can be supported and tried in sequence. Defaults to `None` if empty or missing.
- items:
- enum:
- - None
- - BasicAuth
- - BearerAuth
- - PassportAuth
- type: string
- type: array
- type: object
- BulkAccessMethodUpdateRequest:
- properties:
- passports:
- description: Optional GA4GH Passport JWTs for authorization
- items:
- type: string
- type: array
- updates:
- description: Array of access method updates to perform
- items:
- $ref: '#/components/schemas/BulkAccessMethodUpdateRequest_updates_inner'
- minItems: 1
- type: array
- required:
- - updates
- type: object
- BulkAccessMethodUpdateRequest_updates_inner:
- properties:
- access_methods:
- description: New access methods for this object
- items:
- $ref: '#/components/schemas/AccessMethod'
- minItems: 1
- type: array
- object_id:
- description: DRS object ID to update
- type: string
- required:
- - access_methods
- - object_id
- type: object
- BulkAccessURL:
- properties:
- drs_access_id:
- type: string
- drs_object_id:
- type: string
- headers:
- description: An optional list of headers to include in the HTTP request to `url`. These headers can be used to provide auth tokens required to fetch the object bytes.
- items:
- type: string
- type: array
- url:
- description: A fully resolvable URL that can be used to fetch the actual object bytes.
- type: string
- required:
- - url
- type: object
- BulkDeleteRequest:
- description: Request body for bulk delete operations
- properties:
- bulk_object_ids:
- description: Array of DRS object IDs to delete
- items:
- type: string
- type: array
- delete_storage_data:
- default: false
- description: If true, delete both DRS object metadata and underlying storage data (follows server's deleteStorageDataSupported capability). If false (default), only delete DRS object metadata while preserving underlying storage data. Clients must explicitly set this to true to enable storage data deletion, ensuring intentional choice for this potentially destructive operation.
- type: boolean
- passports:
- description: the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
- items:
- type: string
- type: array
- required:
- - bulk_object_ids
- type: object
- BulkObjectAccessId:
- description: The object that contains object_id/access_id tuples
- properties:
- bulk_object_access_ids:
- items:
- $ref: '#/components/schemas/BulkObjectAccessId_bulk_object_access_ids_inner'
- type: array
- passports:
- items:
- type: string
- type: array
- type: object
- BulkObjectAccessId_bulk_object_access_ids_inner:
- properties:
- bulk_access_ids:
- description: DRS object access ID
- items:
- type: string
- type: array
- bulk_object_id:
- description: DRS object ID
- type: string
- type: object
- BulkObjectIdNoPassport:
- description: The object that contains the DRS object IDs array
- properties:
- bulk_object_ids:
- description: An array of ObjectIDs.
- items:
- type: string
- type: array
- type: object
- Checksum:
- properties:
- checksum:
- description: The hex-string encoded checksum for the data
- type: string
- type:
- description: |-
- The digest method used to create the checksum.
- The value (e.g. `sha-256`) SHOULD be listed as `Hash Name String` in the https://www.iana.org/assignments/named-information/named-information.xhtml#hash-alg[IANA Named Information Hash Algorithm Registry]. Other values MAY be used, as long as implementors are aware of the issues discussed in https://tools.ietf.org/html/rfc6920#section-9.4[RFC6920].
- GA4GH may provide more explicit guidance for use of non-IANA-registered algorithms in the future. Until then, if implementers do choose such an algorithm (e.g. because it's implemented by their storage provider), they SHOULD use an existing standard `type` value such as `md5`, `etag`, `crc32c`, `trunc512`, or `sha1`.
- type: string
- required:
- - checksum
- - type
- type: object
- ContentsObject:
- properties:
- contents:
- description: If this ContentsObject describes a nested bundle and the caller specified "?expand=true" on the request, then this contents array must be present and describe the objects within the nested bundle.
- items:
- $ref: '#/components/schemas/ContentsObject'
- type: array
- drs_uri:
- description: A list of full DRS identifier URI paths that may be used to obtain the object. These URIs may be external to this DRS instance.
- items:
- type: string
- type: array
- id:
- description: A DRS identifier of a `DrsObject` (either a single blob or a nested bundle). If this ContentsObject is an object within a nested bundle, then the id is optional. Otherwise, the id is required.
- type: string
- name:
- description: A name declared by the bundle author that must be used when materialising this object, overriding any name directly associated with the object itself. The name must be unique within the containing bundle. This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].
- type: string
- required:
- - name
- type: object
- DeleteRequest:
- description: Request body for single object delete operations
- properties:
- delete_storage_data:
- default: false
- description: If true, delete both DRS object metadata and underlying storage data (follows server's deleteStorageDataSupported capability). If false (default), only delete DRS object metadata while preserving underlying storage data. Clients must explicitly set this to true to enable storage data deletion, ensuring intentional choice for this potentially destructive operation.
- type: boolean
- passports:
- description: the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
- items:
- type: string
- type: array
- type: object
- DrsObject:
- properties:
- access_methods:
- description: |-
- The list of access methods that can be used to fetch the `DrsObject`.
- Required for single blobs; optional for bundles.
- items:
- $ref: '#/components/schemas/AccessMethod'
- minItems: 1
- type: array
- aliases:
- description: A list of strings that can be used to find other metadata about this `DrsObject` from external metadata sources. These aliases can be used to represent secondary accession numbers or external GUIDs.
- items:
- type: string
- type: array
- checksums:
- description: |-
- The checksum of the `DrsObject`. At least one checksum must be provided.
- For blobs, the checksum is computed over the bytes in the blob.
- For bundles, the checksum is computed over a sorted concatenation of the checksums of its top-level contained objects (not recursive, names not included). The list of checksums is sorted alphabetically (hex-code) before concatenation and a further checksum is performed on the concatenated checksum value.
- For example, if a bundle contains blobs with the following checksums:
- md5(blob1) = 72794b6d
- md5(blob2) = 5e089d29
- Then the checksum of the bundle is:
- md5( concat( sort( md5(blob1), md5(blob2) ) ) )
- = md5( concat( sort( 72794b6d, 5e089d29 ) ) )
- = md5( concat( 5e089d29, 72794b6d ) )
- = md5( 5e089d2972794b6d )
- = f7a29a04
- items:
- $ref: '#/components/schemas/Checksum'
- minItems: 1
- type: array
- contents:
- description: |-
- If not set, this `DrsObject` is a single blob.
- If set, this `DrsObject` is a bundle containing the listed `ContentsObject` s (some of which may be further nested).
- items:
- $ref: '#/components/schemas/ContentsObject'
- type: array
- created_time:
- description: |-
- Timestamp of content creation in RFC3339.
- (This is the creation time of the underlying content, not of the JSON object.)
- format: date-time
- type: string
- description:
- description: A human readable description of the `DrsObject`.
- type: string
- id:
- description: An identifier unique to this `DrsObject`
- type: string
- mime_type:
- description: A string providing the mime-type of the `DrsObject`.
- type: string
- name:
- description: |-
- A string that can be used to name a `DrsObject`.
- This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].
- type: string
- self_uri:
- description: |-
- A drs:// hostname-based URI, as defined in the DRS documentation, that tells clients how to access this object.
- The intent of this field is to make DRS objects self-contained, and therefore easier for clients to store and pass around. For example, if you arrive at this DRS JSON by resolving a compact identifier-based DRS URI, the `self_uri` presents you with a hostname and properly encoded DRS ID for use in subsequent `access` endpoint calls.
- type: string
- size:
- description: |-
- For blobs, the blob size in bytes.
- For bundles, the cumulative size, in bytes, of items in the `contents` field.
- format: int64
- type: integer
- updated_time:
- description: Timestamp of content update in RFC3339, identical to `created_time` in systems that do not support updates. (This is the update time of the underlying content, not of the JSON object.)
- format: date-time
- type: string
- version:
- description: |-
- A string representing a version.
- (Some systems may use checksum, a RFC3339 timestamp, or an incrementing version number.)
- type: string
- required:
- - checksums
- - created_time
- - id
- - self_uri
- - size
- type: object
- DrsObjectCandidate:
- properties:
- access_methods:
- description: |-
- The list of access methods that can be used to fetch the `DrsObject`.
- Required for single blobs; optional for bundles.
- items:
- $ref: '#/components/schemas/AccessMethod'
- minItems: 1
- type: array
- aliases:
- description: A list of strings that can be used to find other metadata about this `DrsObject` from external metadata sources. These aliases can be used to represent secondary accession numbers or external GUIDs.
- items:
- type: string
- type: array
- checksums:
- description: |-
- The checksum of the `DrsObject`. At least one checksum must be provided.
- For blobs, the checksum is computed over the bytes in the blob.
- For bundles, the checksum is computed over a sorted concatenation of the checksums of its top-level contained objects (not recursive, names not included). The list of checksums is sorted alphabetically (hex-code) before concatenation and a further checksum is performed on the concatenated checksum value.
- For example, if a bundle contains blobs with the following checksums:
- md5(blob1) = 72794b6d
- md5(blob2) = 5e089d29
- Then the checksum of the bundle is:
- md5( concat( sort( md5(blob1), md5(blob2) ) ) )
- = md5( concat( sort( 72794b6d, 5e089d29 ) ) )
- = md5( concat( 5e089d29, 72794b6d ) )
- = md5( 5e089d2972794b6d )
- = f7a29a04
- items:
- $ref: '#/components/schemas/Checksum'
- minItems: 1
- type: array
- contents:
- description: |-
- If not set, this `DrsObject` is a single blob.
- If set, this `DrsObject` is a bundle containing the listed `ContentsObject` s (some of which may be further nested).
- items:
- $ref: '#/components/schemas/ContentsObject'
- type: array
- description:
- description: A human readable description of the `DrsObject`.
- type: string
- mime_type:
- description: A string providing the mime-type of the `DrsObject`.
- type: string
- name:
- description: |-
- A string that can be used to name a `DrsObject`.
- This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].
- type: string
- size:
- description: |-
- For blobs, the blob size in bytes.
- For bundles, the cumulative size, in bytes, of items in the `contents` field.
- format: int64
- type: integer
- version:
- description: |-
- A string representing a version.
- (Some systems may use checksum, a RFC3339 timestamp, or an incrementing version number.)
- type: string
- required:
- - checksums
- - size
- type: object
- DrsService:
- properties:
- drs:
- $ref: '#/components/schemas/DrsService_drs'
- maxBulkRequestLength:
- description: DEPRECATED - In 2.0 this will move to under the drs section of service info and not at the root level. The max length the bulk request endpoints can handle (>= 1) before generating a 413 error e.g. how long can the arrays bulk_object_ids and bulk_object_access_ids be for this server.
- type: integer
- type:
- $ref: '#/components/schemas/DrsService_type'
- required:
- - maxBulkRequestLength
- - type
- type: object
- DrsService_drs:
- properties:
- accessMethodUpdateSupported:
- default: false
- description: Indicates whether this DRS server supports updating access methods for existing objects. If true, clients can update access methods using `/objects/{object_id}/access-methods` and `/objects/access-methods` endpoints. If false or missing, the server does not support access method updates.
- type: boolean
- deleteStorageDataSupported:
- default: false
- description: 'Indicates whether this DRS server supports attempting to delete underlying storage data when clients request it. If true, the server will attempt to delete both metadata and storage files when `delete_storage_data: true` is specified in delete requests. If false or missing, the server only supports metadata deletion regardless of client request, preserving underlying storage data. Only present when deleteSupported is true. This is a capability flag indicating what the server can attempt, not a default behavior setting. Note: Storage deletion attempts may fail due to permissions, network issues, or storage service errors.'
- type: boolean
- deleteSupported:
- default: false
- description: Indicates whether this DRS server supports delete operations via the delete endpoints. If true, clients can delete DRS objects using POST requests to `/objects/{object_id}/delete` and `/objects/delete`. If false or missing, the server does not support delete operations and will return 404 for delete endpoint requests. Like upload functionality, delete support is entirely optional and servers remain DRS compliant without it.
- type: boolean
- maxBulkAccessMethodUpdateLength:
- description: Maximum number of objects that can be updated in a single bulk access method update request. Only present when accessMethodUpdateSupported is true. If not specified, defaults to maxBulkRequestLength.
- type: integer
- maxBulkDeleteLength:
- description: Maximum number of objects that can be deleted in a single bulk delete request via `/objects/delete`. Only present when deleteSupported is true. If not specified when delete is supported, defaults to the same value as maxBulkRequestLength. Servers may enforce lower limits for delete operations compared to other bulk operations for safety reasons.
- type: integer
- maxBulkRequestLength:
- description: The max length the bulk request endpoints can handle (>= 1) before generating a 413 error e.g. how long can the arrays bulk_object_ids and bulk_object_access_ids be for this server.
- type: integer
- maxRegisterRequestLength:
- description: Maximum number of candidate objects that can be included in a single registration request. Only present when objectRegistrationSupported is true. If not specified, defaults to the same value as maxBulkRequestLength.
- type: integer
- maxUploadRequestLength:
- description: Maximum number of files that can be included in a single upload request. Only present when uploadRequestSupported is true. If not specified, defaults to the same value as maxBulkRequestLength.
- type: integer
- maxUploadSize:
- description: Maximum file size in bytes that can be uploaded via the upload endpoints. Only present when uploadRequestSupported is true. If not specified, there is no explicit size limit.
- format: int64
- type: integer
- objectCount:
- description: The total number of objects in this DRS service.
- type: integer
- objectRegistrationSupported:
- default: false
- description: Indicates whether this DRS server supports object registration operations via the `/objects/register` endpoint. If true, clients can register uploaded files or existing data as DRS objects. If false or missing, the server does not support object registration.
- type: boolean
- relatedFileStorageSupported:
- default: false
- description: Indicates whether this DRS server supports storing files from the same upload request under a common prefix or folder structure. If true, the server will organize related files together in storage, enabling bioinformatics workflows that expect co-located files (e.g., CRAM + CRAI, VCF + TBI). If false or missing, the server may distribute files across different storage locations or prefixes. Only present when uploadRequestSupported is true. This feature is particularly valuable for genomics tools like samtools that expect index files to be co-located with data files.
- type: boolean
- supportedUploadMethods:
- description: |-
- List of upload methods supported by this DRS server. Only present when uploadRequestSupported is true. Clients can use this information to determine which upload methods are available before making upload requests.
- - **s3**: Direct S3 upload with temporary AWS credentials - **gs**: Google Cloud Storage upload with access tokens - **https**: Presigned POST URL for HTTP uploads - **ftp**: File Transfer Protocol uploads - **sftp**: Secure File Transfer Protocol uploads - **gsiftp**: GridFTP secure file transfer - **globus**: Globus transfer service for high-performance data movement
- items:
- enum:
- - s3
- - gs
- - https
- - ftp
- - sftp
- type: string
- type: array
- totalObjectSize:
- description: The total size of all objects in this DRS service in bytes. As a general best practice, file bytes are counted for each unique file and not cloud mirrors or other redundant copies.
- type: integer
- uploadRequestSupported:
- default: false
- description: Indicates whether this DRS server supports upload request operations via the `/upload-request` endpoint. If true, clients can request upload methods and credentials for uploading files. If false or missing, the server does not support upload request coordination.
- type: boolean
- validateAccessMethodUpdates:
- default: false
- description: Indicates whether this DRS server validates new access methods by verifying they point to the same data. If true, the server will attempt to verify checksums/content before updating access methods. If false or missing, the server trusts client-provided access methods without validation. Only present when accessMethodUpdateSupported is true.
- type: boolean
- validateUploadChecksums:
- default: false
- description: Indicates whether this DRS server validates uploaded file checksums against the provided metadata. If true, the server will verify that uploaded files match their declared checksums and may reject uploads with mismatches. If false or missing, the server does not perform checksum validation and relies on client-provided metadata. Only present when uploadRequestSupported or objectRegistrationSupported is true.
- type: boolean
- validateUploadFileSizes:
- default: false
- description: Indicates whether this DRS server validates uploaded file sizes against the provided metadata. If true, the server will verify that uploaded files match their declared sizes and may reject uploads with mismatches. If false or missing, the server does not perform file size validation and relies on client-provided metadata. Only present when uploadRequestSupported or objectRegistrationSupported is true.
- type: boolean
- required:
- - maxBulkRequestLength
- type: object
- DrsService_type:
- properties:
- artifact:
- enum:
- - drs
- type: string
- required:
- - artifact
- type: object
- Error:
- description: An object that can optionally include information about the error.
- properties:
- msg:
- description: A detailed error message.
- type: string
- status_code:
- description: The integer representing the HTTP status code (e.g. 200, 404).
- type: integer
- type: object
- GetBulkAccessURL_200_response:
- properties:
- resolved_drs_object_access_urls:
- items:
- $ref: '#/components/schemas/BulkAccessURL'
- type: array
- summary:
- $ref: '#/components/schemas/summary'
- unresolved_drs_objects:
- description: Error codes for each unresolved drs objects.
- items:
- $ref: '#/components/schemas/unresolved_inner'
- type: array
- type: object
- GetBulkObjects_200_response:
- properties:
- resolved_drs_object:
- items:
- $ref: '#/components/schemas/DrsObject'
- type: array
- summary:
- $ref: '#/components/schemas/summary'
- unresolved_drs_objects:
- description: Error codes for each unresolved drs objects.
- items:
- $ref: '#/components/schemas/unresolved_inner'
- type: array
- type: object
- GetBulkObjects_request:
- properties:
- bulk_object_ids:
- description: An array of ObjectIDs to retrieve metadata for
- items:
- type: string
- minItems: 1
- type: array
- passports:
- description: the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
- items:
- type: string
- type: array
- required:
- - bulk_object_ids
- type: object
- GetServiceInfo_200_response:
- allOf:
- - $ref: '#/components/schemas/Service'
- - $ref: '#/components/schemas/DrsService'
- OptionsBulkObject_200_response:
- properties:
- resolved_drs_object:
- items:
- $ref: '#/components/schemas/Authorizations'
- type: array
- summary:
- $ref: '#/components/schemas/summary'
- unresolved_drs_objects:
- description: Error codes for each unresolved drs objects.
- items:
- $ref: '#/components/schemas/unresolved_inner'
- type: array
- type: object
- PostAccessURL_request:
- properties:
- passports:
- description: the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
- items:
- type: string
- type: array
- type: object
- PostObject_request:
- properties:
- expand:
- description: |-
- If false and the object_id refers to a bundle, then the ContentsObject array contains only those objects directly contained in the bundle. That is, if the bundle contains other bundles, those other bundles are not recursively included in the result.
- If true and the object_id refers to a bundle, then the entire set of objects in the bundle is expanded. That is, if the bundle contains other bundles, then those other bundles are recursively expanded and included in the result. Recursion continues through the entire sub-tree of the bundle.
- If the object_id refers to a blob, then the query parameter is ignored.
- type: boolean
- passports:
- description: the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
- items:
- type: string
- type: array
- type: object
- RegisterObjects_201_response:
- properties:
- objects:
- description: Array of registered DRS objects in the same order as the candidates in the request
- items:
- $ref: '#/components/schemas/DrsObject'
- type: array
- required:
- - objects
- type: object
- RegisterObjects_request:
- properties:
- candidates:
- description: Array of DRS object candidates to register (server will mint IDs and timestamps)
- items:
- $ref: '#/components/schemas/DrsObjectCandidate'
- minItems: 1
- type: array
- passports:
- description: Optional array of GA4GH Passport JWTs for authorization
- items:
- type: string
- type: array
- required:
- - candidates
- type: object
- Service:
- description: GA4GH service
- properties:
- contactUrl:
- description: URL of the contact for the provider of this service, e.g. a link to a contact form (RFC 3986 format), or an email (RFC 2368 format).
- format: uri
- type: string
- createdAt:
- description: Timestamp describing when the service was first deployed and available (RFC 3339 format)
- format: date-time
- type: string
- description:
- description: Description of the service. Should be human readable and provide information about the service.
- type: string
- documentationUrl:
- description: URL of the documentation of this service (RFC 3986 format). This should help someone learn how to use your service, including any specifics required to access data, e.g. authentication.
- format: uri
- type: string
- environment:
- description: Environment the service is running in. Use this to distinguish between production, development and testing/staging deployments. Suggested values are prod, test, dev, staging. However this is advised and not enforced.
- type: string
- id:
- description: Unique ID of this service. Reverse domain name notation is recommended, though not required. The identifier should attempt to be globally unique so it can be used in downstream aggregator services e.g. Service Registry.
- type: string
- name:
- description: Name of this service. Should be human readable.
- type: string
- organization:
- $ref: '#/components/schemas/Service_organization'
- type:
- $ref: '#/components/schemas/ServiceType'
- updatedAt:
- description: Timestamp describing when the service was last updated (RFC 3339 format)
- format: date-time
- type: string
- version:
- description: Version of the service being described. Semantic versioning is recommended, but other identifiers, such as dates or commit hashes, are also allowed. The version should be changed whenever the service is updated.
- type: string
- required:
- - id
- - name
- - organization
- - type
- - version
- type: object
- Service_organization:
- description: Organization providing the service
- properties:
- name:
- description: Name of the organization responsible for the service
- type: string
- url:
- description: URL of the website of the organization (RFC 3986 format)
- format: uri
- type: string
- required:
- - name
- - url
- type: object
- ServiceType:
- description: Type of a GA4GH service
- properties:
- artifact:
- description: Name of the API or GA4GH specification implemented. Official GA4GH types should be assigned as part of standards approval process. Custom artifacts are supported.
- type: string
- group:
- description: Namespace in reverse domain name format. Use `org.ga4gh` for implementations compliant with official GA4GH specifications. For services with custom APIs not standardized by GA4GH, or implementations diverging from official GA4GH specifications, use a different namespace (e.g. your organization's reverse domain name).
- type: string
- version:
- description: Version of the API or specification. GA4GH specifications use semantic versioning.
- type: string
- required:
- - artifact
- - group
- - version
- type: object
- UploadMethod:
- properties:
- access_url:
- $ref: '#/components/schemas/UploadMethod_access_url'
- region:
- description: Cloud region for the upload location. Optional for non-cloud storage types.
- type: string
- type:
- description: |-
- Type of upload method. Implementations MAY support any subset of these types.
- The 'https' type can be used to return a presigned POST URL and is expected to be the most common implementation for typical file uploads. This method provides a simple HTTP POST interface that works with standard web clients.
- The 's3' type is primarily intended to support uploads of large files that want to take advantage of multipart uploads and automatic retries implemented in AWS libraries. This method provides direct access to S3-specific upload capabilities.
- Other common implementations include 'gs' for Google Cloud Storage and 'sftp' for secure FTP uploads.
- enum:
- - s3
- - gs
- - https
- - ftp
- - sftp
- - gsiftp
- - globus
- type: string
- upload_details:
- additionalProperties: true
- description: A dictionary of upload-specific configuration details that vary by upload method type. The contents and structure depend on the specific upload method being used.
- type: object
- required:
- - access_url
- - type
- type: object
- UploadMethod_access_url:
- allOf:
- - $ref: '#/components/schemas/AccessURL'
- - description: An `AccessURL` that specifies where the file will be accessible after upload. This URL will be used as the access_url in the eventual DRS object, ensuring consistency between upload and retrieval operations.
- type: object
- UploadRequest:
- properties:
- passports:
- description: Optional array of GA4GH Passport JWTs for authorization
- items:
- type: string
- type: array
- requests:
- description: Array of upload requests for files
- items:
- $ref: '#/components/schemas/UploadRequestObject'
- minItems: 1
- type: array
- required:
- - requests
- type: object
- UploadRequestObject:
- properties:
- aliases:
- description: Optional array of alternative names for the file
- items:
- type: string
- type: array
- checksums:
- description: Array of checksums for file integrity verification
- items:
- $ref: '#/components/schemas/Checksum'
- minItems: 1
- type: array
- description:
- description: Optional description of the file
- type: string
- mime_type:
- description: MIME type of the file
- type: string
- name:
- description: The name of the file to upload
- type: string
- size:
- description: Size of the file in bytes
- format: int64
- type: integer
- required:
- - checksums
- - mime_type
- - name
- - size
- type: object
- UploadResponse:
- properties:
- responses:
- description: List of upload responses for the requested files
- items:
- $ref: '#/components/schemas/UploadResponseObject'
- type: array
- required:
- - responses
- type: object
- UploadResponseObject:
- properties:
- aliases:
- description: Optional array of alternative names
- items:
- type: string
- type: array
- checksums:
- description: Array of checksums for file integrity verification
- items:
- $ref: '#/components/schemas/Checksum'
- minItems: 1
- type: array
- description:
- description: Optional description of the file
- type: string
- mime_type:
- description: MIME type of the file
- type: string
- name:
- description: The name of the file
- type: string
- size:
- description: Size of the file in bytes
- format: int64
- type: integer
- upload_methods:
- description: Available methods for uploading this file
- items:
- $ref: '#/components/schemas/UploadMethod'
- type: array
- required:
- - checksums
- - mime_type
- - name
- - size
- type: object
- bulkUpdateAccessMethods_200_response:
- properties:
- objects:
- description: Array of updated DRS objects
- items:
- $ref: '#/components/schemas/DrsObject'
- type: array
- required:
- - objects
- type: object
- summary:
- description: A summary of what was resolved.
- properties:
- requested:
- description: Number of items requested.
- type: integer
- resolved:
- description: Number of objects resolved.
- type: integer
- unresolved:
- description: Number of objects not resolved.
- type: integer
- type: object
- unresolved:
- description: Error codes for each unresolved drs objects.
- items:
- $ref: '#/components/schemas/unresolved_inner'
- type: array
- unresolved_inner:
- properties:
- error_code:
- type: integer
- object_ids:
- items:
- type: string
- type: array
- type: object
- securitySchemes:
- BasicAuth:
- description: |
- A valid authorization token must be passed in the 'Authorization' header,
- e.g. "Basic ${token_string}"
- scheme: basic
- type: http
- BearerAuth:
- description: A valid authorization token must be passed in the 'Authorization' header, e.g. "Bearer ${token_string}"
- scheme: bearer
- type: http
- PassportAuth:
- bearerFormat: JWT
- description: A valid GA4GH Passport must be passed in the body of an HTTP POST request as a tokens[] array.
- scheme: bearer
- type: http
- x-in: body
-info:
- contact:
- email: ga4gh-cloud@ga4gh.org
- name: GA4GH Cloud Work Stream
- license:
- name: Apache 2.0
- url: https://raw.githubusercontent.com/ga4gh/data-repository-service-schemas/master/LICENSE
- termsOfService: https://www.ga4gh.org/terms-and-conditions/
- title: Data Repository Service
- version: 1.5.0
- x-logo:
- url: https://www.ga4gh.org/wp-content/themes/ga4gh/dist/assets/svg/logos/logo-full-color.svg
-openapi: 3.0.3
-paths:
- /objects:
- options:
- description: Returns a structure that contains for each DrsObjects a list of `Authorizations` that can be used to determine how to authorize requests to `GetObject` or `PostObject` (or bulk equivalents).
- operationId: OptionsBulkObject
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkObjectIdNoPassport'
- required: true
- responses:
- "200":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/OptionsBulkObject_200_response'
- description: '`Authorizations` were found successfully'
- "204":
- description: '`Authorizations` are not supported for this object. Default to `None`.'
- "400":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is malformed.
- "404":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested `DrsObject` wasn't found.
- "405":
- description: '`Authorizations` are not supported for this object. Default to `None`.'
- "413":
- content:
- application/json:
- examples:
- bulk_limit_exceeded:
- description: Request contains more objects than server's maximum bulk delete limit
- summary: Bulk delete limit exceeded
- value:
- msg: Bulk delete request contains 150 objects but server maximum is 100. Check maxBulkDeleteLength in service-info.
- status_code: 413
- request_size_too_large:
- description: The overall request payload exceeds server limits
- summary: Request payload too large
- value:
- msg: Request payload size exceeds server limit of 1MB
- status_code: 413
- schema:
- $ref: '#/components/schemas/Error'
- description: The bulk request is too large.
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- security:
- - {}
- summary: Get Authorization info about multiple DrsObjects.
- tags:
- - Objects
- x-swagger-router-controller: ga4gh.drs.server
- post:
- description: |-
- Returns an array of object metadata and access methods for the specified object IDs.
- The request is limited to use passports (one or more) or a single bearer token, so make sure your bulk request is for objects that all use the same passports/token.
- **Note**: To register new DRS objects, use the dedicated `/objects/register` endpoint.
- operationId: GetBulkObjects
- parameters:
- - description: |-
- If false and the object_id refers to a bundle, then the ContentsObject array contains only those objects directly contained in the bundle. That is, if the bundle contains other bundles, those other bundles are not recursively included in the result.
- If true and the object_id refers to a bundle, then the entire set of objects in the bundle is expanded. That is, if the bundle contains other bundles, then those other bundles are recursively expanded and included in the result. Recursion continues through the entire sub-tree of the bundle.
- If the object_id refers to a blob, then the query parameter is ignored.
- in: query
- name: expand
- schema:
- type: boolean
- requestBody:
- $ref: '#/components/requestBodies/BulkObjectBody'
- responses:
- "200":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/GetBulkObjects_200_response'
- description: The `DrsObjects` were found successfully
- "202":
- description: |
- The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
- headers:
- Retry-After:
- description: |
- Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
- schema:
- format: int64
- type: integer
- "400":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is malformed.
- "401":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is unauthorized.
- "403":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requester is not authorized to perform this action.
- "404":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested `DrsObject` wasn't found.
- "413":
- content:
- application/json:
- examples:
- bulk_limit_exceeded:
- description: Request contains more objects than server's maximum bulk delete limit
- summary: Bulk delete limit exceeded
- value:
- msg: Bulk delete request contains 150 objects but server maximum is 100. Check maxBulkDeleteLength in service-info.
- status_code: 413
- request_size_too_large:
- description: The overall request payload exceeds server limits
- summary: Request payload too large
- value:
- msg: Request payload size exceeds server limit of 1MB
- status_code: 413
- schema:
- $ref: '#/components/schemas/Error'
- description: The bulk request is too large.
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- security:
- - PassportAuth: []
- summary: Get info about multiple DrsObjects with an optional Passport(s).
- tags:
- - Objects
- x-swagger-router-controller: ga4gh.drs.server
- /objects/{object_id}:
- get:
- description: Returns object metadata, and a list of access methods that can be used to fetch object bytes.
- operationId: GetObject
- parameters:
- - description: '`DrsObject` identifier'
- in: path
- name: object_id
- required: true
- schema:
- type: string
- - description: |-
- If false and the object_id refers to a bundle, then the ContentsObject array contains only those objects directly contained in the bundle. That is, if the bundle contains other bundles, those other bundles are not recursively included in the result.
- If true and the object_id refers to a bundle, then the entire set of objects in the bundle is expanded. That is, if the bundle contains other bundles, then those other bundles are recursively expanded and included in the result. Recursion continues through the entire sub-tree of the bundle.
- If the object_id refers to a blob, then the query parameter is ignored.
- in: query
- name: expand
- schema:
- type: boolean
- responses:
- "200":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/DrsObject'
- description: The `DrsObject` was found successfully
- "202":
- description: |
- The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
- headers:
- Retry-After:
- description: |
- Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
- schema:
- format: int64
- type: integer
- "400":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is malformed.
- "401":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is unauthorized.
- "403":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requester is not authorized to perform this action.
- "404":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested `DrsObject` wasn't found.
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- summary: Get info about a DrsObject.
- tags:
- - Objects
- x-swagger-router-controller: ga4gh.drs.server
- options:
- description: Returns a list of `Authorizations` that can be used to determine how to authorize requests to `GetObject` or `PostObject`.
- operationId: OptionsObject
- parameters:
- - description: '`DrsObject` identifier'
- in: path
- name: object_id
- required: true
- schema:
- type: string
- responses:
- "200":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Authorizations'
- description: '`Authorizations` were found successfully'
- "204":
- description: '`Authorizations` are not supported for this object. Default to `None`.'
- "400":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is malformed.
- "404":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested `DrsObject` wasn't found.
- "405":
- description: '`Authorizations` are not supported for this object. Default to `None`.'
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- security:
- - {}
- summary: Get Authorization info about a DrsObject.
- tags:
- - Objects
- x-swagger-router-controller: ga4gh.drs.server
- post:
- description: |-
- Returns object metadata and a list of access methods that can be used to fetch object bytes. Method is a POST to accommodate a JWT GA4GH Passport sent in the request body in order to authorize access.
- **Note**: To upload new files and register them as DRS objects, use the `/upload-request` endpoint to obtain upload methods and temporary credentials, then use POST `/objects/register` endpoint to register multiple objects at once. Note that upload functionality is optional and not all DRS servers implement the upload endpoints.
- operationId: PostObject
- parameters:
- - description: '`DrsObject` identifier'
- in: path
- name: object_id
- required: true
- schema:
- type: string
- requestBody:
- $ref: '#/components/requestBodies/PostObjectBody'
- responses:
- "200":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/DrsObject'
- description: The `DrsObject` was found successfully
- "202":
- description: |
- The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
- headers:
- Retry-After:
- description: |
- Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
- schema:
- format: int64
- type: integer
- "400":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is malformed.
- "401":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is unauthorized.
- "403":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requester is not authorized to perform this action.
- "404":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested `AccessURL` wasn't found.
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- security:
- - PassportAuth: []
- summary: Get info about a DrsObject through POST'ing a Passport.
- tags:
- - Objects
- x-swagger-router-controller: ga4gh.drs.server
- /objects/{object_id}/access-methods:
- post:
- description: |-
- **Optional Endpoint**: Not all DRS servers support access method updates.
- Update the access methods for an existing DRS object. Only access methods are modified - core object metadata (size, checksums, name) remains unchanged. Servers MAY validate that new access methods point to the same data.
- Note that existing access methods are overwritten, if clients want to add additional access methods they should first retrieve the current methods and include them along with the new methods in this request.
- **Authentication**: GA4GH Passports can be provided in the request body.
- operationId: updateObjectAccessMethods
- parameters:
- - description: DRS object identifier
- in: path
- name: object_id
- required: true
- schema:
- type: string
- requestBody:
- $ref: '#/components/requestBodies/AccessMethodUpdateBody'
- responses:
- "200":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/DrsObject'
- description: Access methods successfully updated. Returns the updated DRS object with new access methods and updated timestamp.
- "400":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is malformed.
- "401":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is unauthorized.
- "403":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requester is not authorized to perform this action.
- "404":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested `DrsObject` wasn't found.
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- security:
- - {}
- - BasicAuth: []
- - BearerAuth: []
- - PassportAuth: []
- summary: Update access methods for a DRS object
- tags:
- - Objects
- /objects/{object_id}/access/{access_id}:
- get:
- description: |-
- Returns a URL that can be used to fetch the bytes of a `DrsObject`.
- This method only needs to be called when using an `AccessMethod` that contains an `access_id` (e.g., for servers that use signed URLs for fetching object bytes).
- operationId: GetAccessURL
- parameters:
- - description: '`DrsObject` identifier'
- in: path
- name: object_id
- required: true
- schema:
- type: string
- - description: An `access_id` from the `access_methods` list of a `DrsObject`
- in: path
- name: access_id
- required: true
- schema:
- type: string
- responses:
- "200":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AccessURL'
- description: The `AccessURL` was found successfully
- "202":
- description: |
- The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
- headers:
- Retry-After:
- description: |
- Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
- schema:
- format: int64
- type: integer
- "400":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is malformed.
- "401":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is unauthorized.
- "403":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requester is not authorized to perform this action.
- "404":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested `AccessURL` wasn't found.
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- summary: Get a URL for fetching bytes
- tags:
- - Objects
- x-swagger-router-controller: ga4gh.drs.server
- post:
- description: |-
- Returns a URL that can be used to fetch the bytes of a `DrsObject`.
- This method only needs to be called when using an `AccessMethod` that contains an `access_id` (e.g., for servers that use signed URLs for fetching object bytes).
- Method is a POST to accommodate a JWT GA4GH Passport sent in the formData in order to authorize access.
- operationId: PostAccessURL
- parameters:
- - description: '`DrsObject` identifier'
- in: path
- name: object_id
- required: true
- schema:
- type: string
- - description: An `access_id` from the `access_methods` list of a `DrsObject`
- in: path
- name: access_id
- required: true
- schema:
- type: string
- requestBody:
- $ref: '#/components/requestBodies/Passports'
- responses:
- "200":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/AccessURL'
- description: The `AccessURL` was found successfully
- "202":
- description: |
- The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
- headers:
- Retry-After:
- description: |
- Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
- schema:
- format: int64
- type: integer
- "400":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is malformed.
- "401":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is unauthorized.
- "403":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requester is not authorized to perform this action.
- "404":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested `AccessURL` wasn't found.
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- security:
- - PassportAuth: []
- summary: Get a URL for fetching bytes through POST'ing a Passport
- tags:
- - Objects
- x-swagger-router-controller: ga4gh.drs.server
- /objects/{object_id}/delete:
- post:
- description: |-
- **Optional Endpoint**: This endpoint is not required for DRS server implementations. Not all DRS servers support delete functionality.
- Deletes a DRS object by ID. This operation removes the DRS object metadata and optionally attempts to delete the underlying storage data based on the delete_storage_data parameter and server capabilities.
- By default, only DRS object metadata is deleted while preserving underlying storage data. To attempt storage data deletion, clients must explicitly set delete_storage_data to true and the server must support storage data deletion (advertised via `deleteStorageDataSupported` in service-info). Servers will make a best effort attempt to delete storage data, but success is not guaranteed.
- This endpoint uses POST method to accommodate GA4GH Passport authentication in the request body, ensuring compatibility across all HTTP clients and proxies.
- **Important**: HTTP responses (204 No Content) indicate metadata deletion success only, not storage deletion success (which are not guaranteed to complete synchronously if they occur at all)
- operationId: DeleteObject
- parameters:
- - description: '`DrsObject` identifier'
- in: path
- name: object_id
- required: true
- schema:
- type: string
- requestBody:
- $ref: '#/components/requestBodies/DeleteBody'
- responses:
- "204":
- description: All DRS objects were successfully deleted. For bulk operations, this indicates that the entire atomic transaction completed successfully - all requested objects have been deleted. Storage data deletion (if requested) was attempted but success is not guaranteed.
- "400":
- content:
- application/json:
- examples:
- empty_object_list:
- description: Bulk delete request with empty object ID array
- summary: Empty object ID list
- value:
- msg: bulk_object_ids cannot be empty
- status_code: 400
- invalid_request_format:
- description: Request body contains invalid JSON or missing required fields
- summary: Malformed request body
- value:
- msg: 'Invalid request body: bulk_object_ids is required for bulk delete operations'
- status_code: 400
- unsupported_storage_deletion:
- description: Client requested storage data deletion but server doesn't support it
- summary: Storage data deletion not supported
- value:
- msg: Server does not support storage data deletion. Set delete_storage_data to false or omit the parameter.
- status_code: 400
- schema:
- $ref: '#/components/schemas/Error'
- description: 'The delete request is malformed or contains unsupported parameters (e.g., delete_storage_data: true when server doesn''t support storage data deletion).'
- "401":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is unauthorized.
- "403":
- content:
- application/json:
- examples:
- insufficient_permissions:
- description: Client lacks permission to delete the specified object
- summary: Insufficient delete permissions
- value:
- msg: Client lacks delete permission for object drs_object_123456
- status_code: 403
- invalid_passport:
- description: Provided GA4GH Passport is invalid or expired
- summary: Invalid GA4GH Passport
- value:
- msg: Invalid or expired GA4GH Passport provided
- status_code: 403
- missing_visa:
- description: GA4GH Passport lacks required visa for delete operation
- summary: Missing required visa
- value:
- msg: GA4GH Passport does not contain required visa for delete operation on this object
- status_code: 403
- schema:
- $ref: '#/components/schemas/Error'
- description: The client is not authorized to delete the requested DRS object.
- "404":
- content:
- application/json:
- examples:
- delete_not_supported:
- description: This server does not support delete operations
- summary: Delete operations not supported
- value:
- msg: Delete operations are not supported by this server
- status_code: 404
- endpoint_not_found:
- description: Delete endpoints are not implemented on this server
- summary: Delete endpoint not available
- value:
- msg: The requested endpoint /objects/delete is not available on this server
- status_code: 404
- object_not_found:
- description: The specified DRS object does not exist
- summary: DRS object not found
- value:
- msg: DRS object drs_object_123456 does not exist
- status_code: 404
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested DRS object for deletion wasn't found, or delete endpoints are not supported by this server.
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- security:
- - {}
- - BasicAuth: []
- - BearerAuth: []
- - PassportAuth: []
- summary: Delete a DRS object (optional endpoint)
- tags:
- - Objects
- x-codegen-request-body-name: body
- x-swagger-router-controller: ga4gh.drs.server
- /objects/access:
- post:
- description: |-
- Returns an array of URL objects that can be used to fetch the bytes of multiple `DrsObject`s.
- This method only needs to be called when using an `AccessMethod` that contains an `access_id` (e.g., for servers that use signed URLs for fetching object bytes).
- Currently this is limited to use passports (one or more) or a single bearer token, so make sure your bulk request is for objects that all use the same passports/token.
- operationId: GetBulkAccessURL
- requestBody:
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/BulkObjectAccessId'
- required: true
- responses:
- "200":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/GetBulkAccessURL_200_response'
- description: The `AccessURL` was found successfully
- "202":
- description: |
- The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
- headers:
- Retry-After:
- description: |
- Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
- schema:
- format: int64
- type: integer
- "400":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is malformed.
- "401":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is unauthorized.
- "403":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requester is not authorized to perform this action.
- "404":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested `AccessURL` wasn't found.
- "413":
- content:
- application/json:
- examples:
- bulk_limit_exceeded:
- description: Request contains more objects than server's maximum bulk delete limit
- summary: Bulk delete limit exceeded
- value:
- msg: Bulk delete request contains 150 objects but server maximum is 100. Check maxBulkDeleteLength in service-info.
- status_code: 413
- request_size_too_large:
- description: The overall request payload exceeds server limits
- summary: Request payload too large
- value:
- msg: Request payload size exceeds server limit of 1MB
- status_code: 413
- schema:
- $ref: '#/components/schemas/Error'
- description: The bulk request is too large.
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- security:
- - PassportAuth: []
- summary: Get URLs for fetching bytes from multiple objects with an optional Passport(s).
- tags:
- - Objects
- x-swagger-router-controller: ga4gh.drs.server
- /objects/access-methods:
- post:
- description: |-
- **Optional Endpoint**: Not all DRS servers support access method updates.
- Update access methods for multiple DRS objects in a single atomic transaction. If ANY object fails to update, the ENTIRE request fails and NO objects are updated. Only access methods are modified - core object metadata remains unchanged.
- Note that existing access methods are overwritten, if clients want to add additional access methods they should first retrieve the current methods and include them along with the new methods in this request.
- **Authentication**: GA4GH Passports can be provided in the request body.
- operationId: bulkUpdateAccessMethods
- requestBody:
- $ref: '#/components/requestBodies/BulkAccessMethodUpdateBody'
- responses:
- "200":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/bulkUpdateAccessMethods_200_response'
- description: Access methods successfully updated for all objects. Returns updated DRS objects with new access methods and updated timestamps.
- "400":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is malformed.
- "401":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is unauthorized.
- "403":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requester is not authorized to perform this action.
- "404":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested `DrsObject` wasn't found.
- "413":
- content:
- application/json:
- examples:
- bulk_limit_exceeded:
- description: Request contains more objects than server's maximum bulk delete limit
- summary: Bulk delete limit exceeded
- value:
- msg: Bulk delete request contains 150 objects but server maximum is 100. Check maxBulkDeleteLength in service-info.
- status_code: 413
- request_size_too_large:
- description: The overall request payload exceeds server limits
- summary: Request payload too large
- value:
- msg: Request payload size exceeds server limit of 1MB
- status_code: 413
- schema:
- $ref: '#/components/schemas/Error'
- description: The bulk request is too large.
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- security:
- - {}
- - BasicAuth: []
- - BearerAuth: []
- - PassportAuth: []
- summary: Bulk update access methods for multiple DRS objects
- tags:
- - Objects
- /objects/checksum/{checksum}:
- get:
- description: |-
- Returns an array of `DRSObjects` that match a given checksum.
- The checksum type is not provide, the checksum check is done against all checksum types.
- operationId: GetObjectsByChecksum
- parameters:
- - description: A `checksum` value from the `checksums` list of a `DrsObject`
- in: path
- name: checksum
- required: true
- schema:
- type: string
- responses:
- "200":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/GetBulkObjects_200_response'
- description: The `DrsObjects` were found successfully
- "202":
- description: |
- The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
- headers:
- Retry-After:
- description: |
- Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
- schema:
- format: int64
- type: integer
- "400":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is malformed.
- "401":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is unauthorized.
- "403":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requester is not authorized to perform this action.
- "404":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested `DrsObject` wasn't found.
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- security:
- - PassportAuth: []
- summary: Get DRS objects that are a match for the checksum.
- tags:
- - Objects
- x-swagger-router-controller: ga4gh.drs.server
- /objects/delete:
- post:
- description: |-
- **Optional Endpoint**: This endpoint is not required for DRS server implementations. Not all DRS servers support delete functionality.
- Delete multiple DRS objects in a single atomic transaction. If ANY object fails to be deleted, the ENTIRE request fails and NO objects are deleted. This ensures data consistency and prevents partial deletion scenarios.
- **RECOMMENDED - Transactional Behavior**: Deletion operations SHOULD be atomic transactions. If ANY object fails validation or deletion, the ENTIRE request SHOULD fail and NO objects SHOULD be deleted. Servers SHOULD implement this as an all-or-nothing operation to ensure data consistency, but MAY implement partial deletion with appropriate error reporting if transactional behavior is not feasible.
- **Authentication**: GA4GH Passports can be provided in the request body for authorization.
- **Storage Data Deletion**: The `delete_storage_data` parameter controls whether the server will attempt to delete underlying storage files along with DRS metadata. This defaults to false for safety. Servers will make a best effort attempt to delete storage data, but success is not guaranteed.
- **Server Responsibilities**: - SHOULD treat deletion as an atomic transaction (all succeed or all fail) - SHOULD validate ALL object IDs exist and are accessible before deleting ANY - SHOULD roll back any partial changes if any object fails deletion - SHOULD return 400 if any object ID is invalid or inaccessible when using transactional behavior
- **Client Responsibilities**: - Provide valid object IDs for all objects to be deleted - Handle potential failure of entire batch if any single object cannot be deleted - Check service-info for `maxBulkDeleteLength` limits before making requests
- operationId: bulkDeleteObjects
- requestBody:
- $ref: '#/components/requestBodies/BulkDeleteBody'
- responses:
- "204":
- description: All DRS objects were successfully deleted. For bulk operations, this indicates that the entire atomic transaction completed successfully - all requested objects have been deleted. Storage data deletion (if requested) was attempted but success is not guaranteed.
- "400":
- content:
- application/json:
- examples:
- empty_object_list:
- description: Bulk delete request with empty object ID array
- summary: Empty object ID list
- value:
- msg: bulk_object_ids cannot be empty
- status_code: 400
- invalid_request_format:
- description: Request body contains invalid JSON or missing required fields
- summary: Malformed request body
- value:
- msg: 'Invalid request body: bulk_object_ids is required for bulk delete operations'
- status_code: 400
- unsupported_storage_deletion:
- description: Client requested storage data deletion but server doesn't support it
- summary: Storage data deletion not supported
- value:
- msg: Server does not support storage data deletion. Set delete_storage_data to false or omit the parameter.
- status_code: 400
- schema:
- $ref: '#/components/schemas/Error'
- description: 'The delete request is malformed or contains unsupported parameters (e.g., delete_storage_data: true when server doesn''t support storage data deletion).'
- "401":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is unauthorized.
- "403":
- content:
- application/json:
- examples:
- insufficient_permissions:
- description: Client lacks permission to delete the specified object
- summary: Insufficient delete permissions
- value:
- msg: Client lacks delete permission for object drs_object_123456
- status_code: 403
- invalid_passport:
- description: Provided GA4GH Passport is invalid or expired
- summary: Invalid GA4GH Passport
- value:
- msg: Invalid or expired GA4GH Passport provided
- status_code: 403
- missing_visa:
- description: GA4GH Passport lacks required visa for delete operation
- summary: Missing required visa
- value:
- msg: GA4GH Passport does not contain required visa for delete operation on this object
- status_code: 403
- schema:
- $ref: '#/components/schemas/Error'
- description: The client is not authorized to delete the requested DRS object.
- "404":
- content:
- application/json:
- examples:
- delete_not_supported:
- description: This server does not support delete operations
- summary: Delete operations not supported
- value:
- msg: Delete operations are not supported by this server
- status_code: 404
- endpoint_not_found:
- description: Delete endpoints are not implemented on this server
- summary: Delete endpoint not available
- value:
- msg: The requested endpoint /objects/delete is not available on this server
- status_code: 404
- object_not_found:
- description: The specified DRS object does not exist
- summary: DRS object not found
- value:
- msg: DRS object drs_object_123456 does not exist
- status_code: 404
- schema:
- $ref: '#/components/schemas/Error'
- description: The requested DRS object for deletion wasn't found, or delete endpoints are not supported by this server.
- "413":
- content:
- application/json:
- examples:
- bulk_limit_exceeded:
- description: Request contains more objects than server's maximum bulk delete limit
- summary: Bulk delete limit exceeded
- value:
- msg: Bulk delete request contains 150 objects but server maximum is 100. Check maxBulkDeleteLength in service-info.
- status_code: 413
- request_size_too_large:
- description: The overall request payload exceeds server limits
- summary: Request payload too large
- value:
- msg: Request payload size exceeds server limit of 1MB
- status_code: 413
- schema:
- $ref: '#/components/schemas/Error'
- description: The bulk request is too large.
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- security:
- - {}
- - BasicAuth: []
- - BearerAuth: []
- - PassportAuth: []
- summary: Delete multiple DRS objects
- tags:
- - Objects
- x-codegen-request-body-name: body
- /objects/register:
- post:
- description: "**Optional Endpoint**: This endpoint is not required for DRS server implementations. Not all DRS servers support object registration. \nRegisters one or more \"candidate\" DRS objects with the server. If it accepts the request, the server will create unique object IDs for each registered object and return them in fully-formed DRS objects in response.\nThis endpoint can be used after uploading files using methods negotiated with the `/upload-request` endpoint to register the uploaded files as DRS objects, or to register existinf data. The request body should contain candidate DRS objects with all required metadata including access methods that correspond to the upload methods used during file upload.\n**RECOMMENDED - Transactional Behavior**: Registration operations SHOULD be atomic transactions. If ANY candidate object fails validation or registration, the ENTIRE request SHOULD fail and NO objects SHOULD be registered. Servers SHOULD implement this as an all-or-nothing operation to ensure data consistency, but MAY implement partial registration with appropriate error reporting if transactional behavior is not feasible.\n**Authentication**: GA4GH Passports can be provided in the request body for authorization. Bearer tokens can be supplied in headers.\n**Server Responsibilities**: - SHOULD treat registration as an atomic transaction (all succeed or all fail) - SHOULD validate ALL candidate objects before registering ANY - Create unique object IDs for each registered object - Add timestamps (created_time, updated_time) - SHOULD roll back any partial changes if any candidate fails validation\n**Client Responsibilities**: - Provide required DRS object metadata for all candidates - Include access methods corresponding to uploaded file locations - Ensure checksums match uploaded file content - Handle potential failure of entire batch if any single object is invalid"
- operationId: RegisterObjects
- requestBody:
- $ref: '#/components/requestBodies/RegisterObjectsBody'
- responses:
- "201":
- content:
- application/json:
- examples:
- multiple_objects_created:
- description: Response after registering multiple DRS objects
- summary: Multiple objects registered
- value:
- objects:
- - access_methods:
- - access_url:
- url: s3://genomics-bucket/assemblies/hg38.fasta
- type: s3
- checksums:
- - checksum: a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
- type: sha-256
- created_time: 2024-01-15T09:00:00Z
- description: Human genome reference assembly
- id: drs_obj_a1b2c3d4e5f6
- mime_type: text/plain
- name: genome_assembly.fasta
- self_uri: drs://drs.example.org/drs_obj_a1b2c3d4e5f6
- size: 3221225472
- updated_time: 2024-01-15T09:00:00Z
- version: "1.0"
- - access_methods:
- - access_url:
- url: https://data.example.org/files/annotations.gff3
- type: https
- checksums:
- - checksum: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
- type: sha-256
- created_time: 2024-01-15T09:15:00Z
- description: Gene annotations in GFF3 format
- id: drs_obj_f6e5d4c3b2a1
- mime_type: text/plain
- name: annotations.gff3
- self_uri: drs://drs.example.org/drs_obj_f6e5d4c3b2a1
- size: 524288000
- updated_time: 2024-01-15T09:15:00Z
- version: "1.0"
- single_object_created:
- description: Response after registering one DRS object
- summary: Single object registered
- value:
- objects:
- - access_methods:
- - access_url:
- url: s3://my-bucket/uploads/sample_data.vcf
- type: s3
- checksums:
- - checksum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- type: sha-256
- created_time: 2024-01-15T10:30:00Z
- description: Variant call format file for sample analysis
- id: drs_obj_a1b2c3d4e5f6
- mime_type: text/plain
- name: sample_data.vcf
- self_uri: drs://drs.example.org/drs_obj_a1b2c3d4e5f6
- size: 1048576
- updated_time: 2024-01-15T10:30:00Z
- version: "1.0"
- schema:
- $ref: '#/components/schemas/RegisterObjects_201_response'
- description: DRS objects were successfully registered as an atomic transaction. Returns the complete DRS objects with server-minted IDs and timestamps. All candidate objects were validated and registered together - if any had failed, none would have been registered.
- "400":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is malformed.
- "401":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is unauthorized.
- "403":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requester is not authorized to perform this action.
- "413":
- content:
- application/json:
- examples:
- bulk_limit_exceeded:
- description: Request contains more objects than server's maximum bulk delete limit
- summary: Bulk delete limit exceeded
- value:
- msg: Bulk delete request contains 150 objects but server maximum is 100. Check maxBulkDeleteLength in service-info.
- status_code: 413
- request_size_too_large:
- description: The overall request payload exceeds server limits
- summary: Request payload too large
- value:
- msg: Request payload size exceeds server limit of 1MB
- status_code: 413
- schema:
- $ref: '#/components/schemas/Error'
- description: The bulk request is too large.
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- security:
- - {}
- - BasicAuth: []
- - BearerAuth: []
- - PassportAuth: []
- summary: Register DRS objects
- tags:
- - Objects
- x-codegen-request-body-name: body
- x-swagger-router-controller: ga4gh.drs.server
- /service-info:
- get:
- description: "Returns information about the DRS service along with stats pertaning to total object count and cumulative size in bytes.\nAlso indicates whether the server supports optional upload and delete operations and which methods are available.\n\nExtends the\n[v1.0.0 GA4GH Service Info specification](https://github.com/ga4gh-discovery/ga4gh-service-info)\nas the standardized format for GA4GH web services to self-describe.\n\nAccording to the \n[service-info type registry](https://github.com/ga4gh/TASC/blob/master/service-info/ga4gh-service-info.json)\nmaintained by the [Technical Alignment Sub Committee (TASC)](https://github.com/ga4gh/TASC),\na DRS service MUST have:\n * a `type.group` value of `org.ga4gh`\n * a `type.artifact` value of `drs`\n\n**Example 1: Server with upload and delete capabilities**\n```\n{\n \"id\": \"com.example.drs\",\n \"description\": \"Serves data according to DRS specification\",\n ...\n \"type\": {\n \"group\": \"org.ga4gh\",\n \"artifact\": \"drs\",\n \"version\": \"1.5\"\n }\n ...\n \"drs\":{\n \"maxBulkRequestLength\": 200,\n \"objectCount\": 774560,\n \"totalObjectSize\": 4018437188907752,\n \"uploadRequestSupported\": true,\n \"objectRegistrationSupported\": true,\n \"supportedUploadMethods\": [\"s3\", \"https\", \"gs\"],\n \"maxUploadSize\": 5368709120,\n \"maxUploadRequestLength\": 50,\n \"validateUploadChecksums\": true,\n \"validateUploadFileSizes\": false,\n \"relatedFileStorageSupported\": true,\n \"deleteSupported\": true,\n \"maxBulkDeleteLength\": 100,\n \"deleteStorageDataSupported\": true\n }\n}\n```\n\n**Example 2: Read-only server (no upload or delete)**\n```\n{\n \"id\": \"com.example.readonly-drs\",\n \"description\": \"Read-only DRS service\",\n ...\n \"type\": {\n \"group\": \"org.ga4gh\",\n \"artifact\": \"drs\",\n \"version\": \"1.5\"\n }\n ...\n \"drs\":{\n \"maxBulkRequestLength\": 500,\n \"objectCount\": 1250000,\n \"totalObjectSize\": 8500000000000000\n }\n}\n```\n\n**Example 3: Server with metadata-only delete capability**\n```\n{\n \"id\": \"com.example.metadata-drs\",\n \"description\": \"DRS service with metadata-only delete\",\n ...\n \"type\": {\n \"group\": \"org.ga4gh\",\n \"artifact\": \"drs\",\n \"version\": \"1.5\"\n }\n ...\n \"drs\":{\n \"maxBulkRequestLength\": 200,\n \"objectCount\": 500000,\n \"totalObjectSize\": 2500000000000000,\n \"deleteSupported\": true,\n \"maxBulkDeleteLength\": 50,\n \"deleteStorageDataSupported\": false\n }\n}\n```\n\nSee the [Service Registry Appendix](#tag/GA4GH-Service-Registry) for more information on how to register a DRS service with a service registry."
- operationId: GetServiceInfo
- responses:
- "200":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/GetServiceInfo_200_response'
- description: Retrieve info about the DRS service
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- summary: Retrieve information about this service
- tags:
- - Service Info
- /upload-request:
- post:
- description: "**Optional Endpoint**: This endpoint is not required for DRS server implementations. Not all DRS servers support upload functionality. \nRequest upload method details and temporary credentials for uploading one or more files to an underlying storage service. This endpoint allows clients to obtain the necessary information to upload files before they are registered as DRS objects.\n**Discovery**: Before using this endpoint, clients should check the `/service-info` endpoint to determine if upload operations are supported. Look for `drs.uploadRequestSupported: true` and `drs.supportedUploadMethods` to understand which upload methods are available. Also check `drs.maxUploadSize` and `drs.maxUploadRequestLength` for server limits.\n**Usage Flow:**\n1. **Discovery**: Client checks `/service-info` endpoint to confirm upload support (`drs.uploadRequestSupported: true`) and available methods (`drs.supportedUploadMethods`)\n2. Client sends an upload request with file metadata (name, size, checksums, MIME type)\n3. Server responds with available upload methods (S3, HTTPS, Google Cloud Storage, etc.) and temporary credentials\n4. Client selects one or more upload methods from the response and uses the corresponding credentials to upload the file to the storage service\n5. Once uploaded, the client registers the files as DRS objects including access methods that correspond to the upload methods used with a POST request to `/objects/register`, the server will return fully formed DRS objects with server minted unique IDs.\n6. The registered DRS object becomes accessible through standard DRS API endpoints\n\n**Authentication:**\nThe endpoint supports multiple authentication methods including GA4GH Passport tokens sent in the request body. Passport tokens enable fine-grained authorization based on data access policies.\n**Upload Methods**: Response may include multiple options (s3, https, gs, ftp/sftp) for flexibility. Note that servers may return a subset of their advertised `supportedUploadMethods` based on file-specific factors such as file type, size, or server policies.\n**File Integrity**: All requests must include at least one checksum per file (SHA-256, MD5, or other IANA-registered algorithms).\n**Server Validation**: Servers MAY validate checksums/sizes but are not required to. Check service-info for validation behavior. Servers do not validate MIME types against actual file content - clients are responsible for providing accurate MIME type information."
- operationId: PostUploadRequest
- requestBody:
- $ref: '#/components/requestBodies/UploadRequestBody'
- responses:
- "200":
- content:
- application/json:
- examples:
- https_upload:
- description: Response with HTTPS presigned POST URL for direct upload
- summary: HTTPS upload method response
- value:
- responses:
- - aliases:
- - hg38_reference
- checksums:
- - checksum: a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
- type: sha-256
- - checksum: 098f6bcd4621d373cade4e832627b4f6
- type: md5
- description: Human genome reference assembly
- mime_type: text/plain
- name: genome_assembly.fasta
- size: 3221225472
- upload_methods:
- - access_url:
- url: https://upload.example.org/v1/files/drs_object_789012
- type: https
- upload_details:
- post_url: https://upload.example.org/v1/files/drs_object_789012?signature=abc123
- multiple_methods:
- description: Response offering multiple upload method options for flexibility
- summary: Multiple upload methods response
- value:
- responses:
- - checksums:
- - checksum: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
- type: sha-256
- description: Gene annotations in GFF3 format
- mime_type: text/plain
- name: annotations.gff3
- size: 524288000
- upload_methods:
- - access_url:
- url: https://genomics-bucket.s3.us-west-2.amazonaws.com/uploads/drs_object_345678
- region: us-west-2
- type: s3
- upload_details:
- access_key_id: AKIAI44QH8DHBEXAMPLE
- bucket: genomics-bucket
- expires_at: 2024-01-01T12:00:00Z
- key: uploads/drs_object_345678
- secret_access_key: je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
- session_token: temporary_session_token_here
- - access_url:
- url: https://upload-api.example.org/files/drs_object_345678
- type: https
- upload_details:
- post_url: https://upload-api.example.org/files/drs_object_345678?token=upload_token_12345
- - access_url:
- url: https://storage.googleapis.com/genomics-uploads/drs_object_345678
- region: us-central1
- type: gs
- upload_details:
- access_token: ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg
- bucket: genomics-uploads
- expires_at: 2024-01-01T12:00:00Z
- key: drs_object_345678
- s3_upload:
- description: Response with S3 upload method and temporary credentials
- summary: S3 upload method response
- value:
- responses:
- - aliases:
- - sample_001_variants
- - vcf_batch_2024
- checksums:
- - checksum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
- type: sha-256
- description: Variant call format file for sample analysis
- mime_type: text/plain
- name: sample_data.vcf
- size: 1048576
- upload_methods:
- - access_url:
- url: https://my-bucket.s3.amazonaws.com/uploads/drs_object_123456
- region: us-east-1
- type: s3
- upload_details:
- access_key_id: AKIAIOSFODNN7EXAMPLE
- bucket: my-bucket
- expires_at: 2024-01-01T12:00:00Z
- key: uploads/drs_object_123456
- secret_access_key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
- session_token: AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE
- schema:
- $ref: '#/components/schemas/UploadResponse'
- description: Upload request processed successfully. Returns upload methods and temporary credentials for the requested files.
- "400":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is malformed.
- "401":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The request is unauthorized.
- "403":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: The requester is not authorized to perform this action.
- "500":
- content:
- application/json:
- schema:
- $ref: '#/components/schemas/Error'
- description: An unexpected error occurred.
- security:
- - {}
- - BasicAuth: []
- - BearerAuth: []
- - PassportAuth: []
- summary: Request upload methods for files
- tags:
- - Upload Request
-security:
- - {}
- - BasicAuth: []
- - BearerAuth: []
-servers:
- - url: https://{serverURL}/ga4gh/drs/v1
- variables:
- serverURL:
- default: drs.example.org
- description: |
- DRS server endpoints MUST be prefixed by the '/ga4gh/drs/v1' endpoint path
-tags:
- - name: Introduction
- - name: DRS API Principles
- - name: Authorization & Authentication
- - name: Objects
- - name: Upload Request
- - name: Access Method Updates
- - name: Service Info
- - description: |
-
- name: AccessMethodModel
- x-displayName: AccessMethod
- - description: |
-
- name: AccessURLModel
- x-displayName: AccessURL
- - description: |
-
- name: ChecksumModel
- x-displayName: Checksum
- - description: |
-
- name: ContentsObjectModel
- x-displayName: ContentsObject
- - description: |
-
- name: DrsObjectModel
- x-displayName: DrsObject
- - description: |
-
- name: DrsObjectCandidateModel
- x-displayName: DrsObjectCandidate
- - description: |
-
- name: ErrorModel
- x-displayName: Error
- - description: |
-
- name: UploadRequestModel
- x-displayName: UploadRequest
- - description: |
-
- name: UploadResponseModel
- x-displayName: UploadResponse
- - description: |
-
- name: UploadRequestObjectModel
- x-displayName: UploadRequestObject
- - description: |
-
- name: UploadResponseObjectModel
- x-displayName: UploadResponseObject
- - description: |
-
- name: UploadMethodModel
- x-displayName: UploadMethod
- - description: |
-
- name: DeleteRequestModel
- x-displayName: DeleteRequest
- - description: |
-
- name: BulkDeleteRequestModel
- x-displayName: BulkDeleteRequest
- - description: |
-
- name: DeleteResultModel
- x-displayName: DeleteResult
- - description: |
-
- name: BulkDeleteResponseModel
- x-displayName: BulkDeleteResponse
- - name: Motivation
- - name: Working With Compound Objects
- - name: Background Notes on DRS URIs
- - name: Compact Identifier-Based URIs
- - name: Hostname-Based URIs
- - name: GA4GH Service Registry
- - name: Upload Requests and Object Registration
- - name: Object Deletion
- - name: Access Method Update
-x-tagGroups:
- - name: Overview
- tags:
- - Introduction
- - DRS API Principles
- - Authorization & Authentication
- - name: Operations
- tags:
- - Objects
- - Upload Request
- - Service Info
- - name: Models
- tags:
- - AccessMethodModel
- - AccessURLModel
- - ChecksumModel
- - ContentsObjectModel
- - DrsObjectModel
- - DrsObjectCandidateModel
- - ErrorModel
- - UploadRequestModel
- - UploadResponseModel
- - UploadRequestObjectModel
- - UploadResponseObjectModel
- - UploadMethodModel
- - DeleteRequestModel
- - BulkDeleteRequestModel
- - DeleteResultModel
- - BulkDeleteResponseModel
- - name: Appendices
- tags:
- - Motivation
- - Working With Compound Objects
- - Background Notes on DRS URIs
- - Compact Identifier-Based URIs
- - Hostname-Based URIs
- - GA4GH Service Registry
- - Upload Requests and Object Registration
- - Object Deletion
- - Access Method Update
diff --git a/internal/apigen/go.mod b/internal/apigen/go.mod
deleted file mode 100644
index 0270e51..0000000
--- a/internal/apigen/go.mod
+++ /dev/null
@@ -1,32 +0,0 @@
-module github.com/calypr/drs-server
-
-go 1.24.0
-
-require github.com/gin-gonic/gin v1.9.1
-
-require (
- github.com/bytedance/sonic v1.9.1 // indirect
- github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
- github.com/gabriel-vasile/mimetype v1.4.2 // indirect
- github.com/gin-contrib/sse v0.1.0 // indirect
- github.com/go-playground/locales v0.14.1 // indirect
- github.com/go-playground/universal-translator v0.18.1 // indirect
- github.com/go-playground/validator/v10 v10.14.0 // indirect
- github.com/goccy/go-json v0.10.2 // indirect
- github.com/json-iterator/go v1.1.12 // indirect
- github.com/klauspost/cpuid/v2 v2.2.4 // indirect
- github.com/leodido/go-urn v1.2.4 // indirect
- github.com/mattn/go-isatty v0.0.19 // indirect
- github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
- github.com/modern-go/reflect2 v1.0.2 // indirect
- github.com/pelletier/go-toml/v2 v2.0.8 // indirect
- github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
- github.com/ugorji/go/codec v1.2.11 // indirect
- golang.org/x/arch v0.3.0 // indirect
- golang.org/x/crypto v0.45.0 // indirect
- golang.org/x/net v0.47.0 // indirect
- golang.org/x/sys v0.38.0 // indirect
- golang.org/x/text v0.31.0 // indirect
- google.golang.org/protobuf v1.33.0 // indirect
- gopkg.in/yaml.v3 v3.0.1 // indirect
-)
diff --git a/internal/apigen/go.sum b/internal/apigen/go.sum
deleted file mode 100644
index 1bbfa6f..0000000
--- a/internal/apigen/go.sum
+++ /dev/null
@@ -1,49 +0,0 @@
-github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
-github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
-github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
-github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
-github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
-github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
-github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
-github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
-github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
-github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
-github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
-github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
-github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
-github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
-github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
-github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
-github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
-github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
-github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
-github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
-github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
-github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
-github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
-github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
-github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
-github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
-github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
-golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
-golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
-golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
-golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
-google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
-gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
diff --git a/internal/apigen/go/README.md b/internal/apigen/go/README.md
deleted file mode 100644
index 1c63a9d..0000000
--- a/internal/apigen/go/README.md
+++ /dev/null
@@ -1,41 +0,0 @@
-# Go API Server for openapi
-
-No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
-
-## Overview
-This server was generated by the [openapi-generator]
-(https://openapi-generator.tech) project.
-By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub.
--
-
-To see how to make this your own, look here:
-
-[README](https://openapi-generator.tech)
-
-- API version: 1.5.0
-- Build date: 2025-12-22T21:29:17.216805507Z[Etc/UTC]
-- Generator version: 7.18.0-SNAPSHOT
-
-### Running the server
-
-To run the server, follow these simple steps:
-
-```
-go run main.go
-```
-
-To run the server in a docker container
-```
-docker build --network=host -t openapi .
-```
-
-Once the image is built, just run
-```
-docker run --rm -it openapi
-```
-
-### Known Issue
-
-Endpoints sharing a common path may result in issues. For example, `/v2/pet/findByTags` and `/v2/pet/:petId` will result in an issue with the Gin framework. For more information about this known limitation, please refer to [gin-gonic/gin#388](https://github.com/gin-gonic/gin/issues/388) for more information.
-
-A workaround is to manually update the path and handler. Please refer to [gin-gonic/gin/issues/205#issuecomment-296155497](https://github.com/gin-gonic/gin/issues/205#issuecomment-296155497) for more information.
diff --git a/internal/apigen/go/api_objects.go b/internal/apigen/go/api_objects.go
deleted file mode 100644
index 3d82e2c..0000000
--- a/internal/apigen/go/api_objects.go
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-import (
- "github.com/gin-gonic/gin"
-)
-
-type ObjectsAPI struct {
-}
-
-// Post /ga4gh/drs/v1/objects/delete
-// Delete multiple DRS objects
-func (api *ObjectsAPI) BulkDeleteObjects(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
-// Post /ga4gh/drs/v1/objects/access-methods
-// Bulk update access methods for multiple DRS objects
-func (api *ObjectsAPI) BulkUpdateAccessMethods(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
-// Post /ga4gh/drs/v1/objects/:object_id/delete
-// Delete a DRS object (optional endpoint)
-func (api *ObjectsAPI) DeleteObject(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
-// Get /ga4gh/drs/v1/objects/:object_id/access/:access_id
-// Get a URL for fetching bytes
-func (api *ObjectsAPI) GetAccessURL(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
-// Post /ga4gh/drs/v1/objects/access
-// Get URLs for fetching bytes from multiple objects with an optional Passport(s).
-func (api *ObjectsAPI) GetBulkAccessURL(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
-// Post /ga4gh/drs/v1/objects
-// Get info about multiple DrsObjects with an optional Passport(s).
-func (api *ObjectsAPI) GetBulkObjects(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
-// Get /ga4gh/drs/v1/objects/:object_id
-// Get info about a DrsObject.
-func (api *ObjectsAPI) GetObject(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
-// Get /ga4gh/drs/v1/objects/checksum/:checksum
-// Get DRS objects that are a match for the checksum.
-func (api *ObjectsAPI) GetObjectsByChecksum(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
-// Options /ga4gh/drs/v1/objects
-// Get Authorization info about multiple DrsObjects.
-func (api *ObjectsAPI) OptionsBulkObject(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
-// Options /ga4gh/drs/v1/objects/:object_id
-// Get Authorization info about a DrsObject.
-func (api *ObjectsAPI) OptionsObject(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
-// Post /ga4gh/drs/v1/objects/:object_id/access/:access_id
-// Get a URL for fetching bytes through POST'ing a Passport
-func (api *ObjectsAPI) PostAccessURL(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
-// Post /ga4gh/drs/v1/objects/:object_id
-// Get info about a DrsObject through POST'ing a Passport.
-func (api *ObjectsAPI) PostObject(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
-// Post /ga4gh/drs/v1/objects/register
-// Register DRS objects
-func (api *ObjectsAPI) RegisterObjects(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
-// Post /ga4gh/drs/v1/objects/:object_id/access-methods
-// Update access methods for a DRS object
-func (api *ObjectsAPI) UpdateObjectAccessMethods(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
diff --git a/internal/apigen/go/api_service_info.go b/internal/apigen/go/api_service_info.go
deleted file mode 100644
index e7ba843..0000000
--- a/internal/apigen/go/api_service_info.go
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-import (
- "github.com/gin-gonic/gin"
-)
-
-type ServiceInfoAPI struct {
-}
-
-// Get /ga4gh/drs/v1/service-info
-// Retrieve information about this service
-func (api *ServiceInfoAPI) GetServiceInfo(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
diff --git a/internal/apigen/go/api_upload_request.go b/internal/apigen/go/api_upload_request.go
deleted file mode 100644
index 0a7bafb..0000000
--- a/internal/apigen/go/api_upload_request.go
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-import (
- "github.com/gin-gonic/gin"
-)
-
-type UploadRequestAPI struct {
-}
-
-// Post /ga4gh/drs/v1/upload-request
-// Request upload methods for files
-func (api *UploadRequestAPI) PostUploadRequest(c *gin.Context) {
- // Your handler implementation
- c.JSON(200, gin.H{"status": "OK"})
-}
-
diff --git a/internal/apigen/go/model_access_method.go b/internal/apigen/go/model_access_method.go
deleted file mode 100644
index df9297b..0000000
--- a/internal/apigen/go/model_access_method.go
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type AccessMethod struct {
-
- // Type of the access method.
- Type string `json:"type"`
-
- AccessUrl AccessMethodAccessUrl `json:"access_url,omitempty"`
-
- // An arbitrary string to be passed to the `/access` method to get an `AccessURL`. This string must be unique within the scope of a single object. Note that at least one of `access_url` and `access_id` must be provided.
- AccessId string `json:"access_id,omitempty"`
-
- // Name of the cloud service provider that the object belongs to. If the cloud service is Amazon Web Services, Google Cloud Platform or Azure the values should be `aws`, `gcp`, or `azure` respectively.
- Cloud string `json:"cloud,omitempty"`
-
- // Name of the region in the cloud service provider that the object belongs to.
- Region string `json:"region,omitempty"`
-
- // Availablity of file in the cloud. This label defines if this file is immediately accessible via DRS. Any delay or requirement of thawing mechanism if the file is in offline/archival storage is classified as false, meaning it is unavailable.
- Available bool `json:"available,omitempty"`
-
- Authorizations AccessMethodAuthorizations `json:"authorizations,omitempty"`
-}
diff --git a/internal/apigen/go/model_access_method_access_url.go b/internal/apigen/go/model_access_method_access_url.go
deleted file mode 100644
index 26da91d..0000000
--- a/internal/apigen/go/model_access_method_access_url.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type AccessMethodAccessUrl struct {
-
- // A fully resolvable URL that can be used to fetch the actual object bytes.
- Url string `json:"url"`
-
- // An optional list of headers to include in the HTTP request to `url`. These headers can be used to provide auth tokens required to fetch the object bytes.
- Headers []string `json:"headers,omitempty"`
-}
diff --git a/internal/apigen/go/model_access_method_authorizations.go b/internal/apigen/go/model_access_method_authorizations.go
deleted file mode 100644
index b8528fc..0000000
--- a/internal/apigen/go/model_access_method_authorizations.go
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type AccessMethodAuthorizations struct {
-
- DrsObjectId string `json:"drs_object_id,omitempty"`
-
- // An Optional list of support authorization types. More than one can be supported and tried in sequence. Defaults to `None` if empty or missing.
- SupportedTypes []string `json:"supported_types,omitempty"`
-
- // If authorizations contain `PassportAuth` this is a required list of visa issuers (as found in a visa's `iss` claim) that may authorize access to this object. The caller must only provide passports that contain visas from this list. It is strongly recommended that the caller validate that it is appropriate to send the requested passport/visa to the DRS server to mitigate attacks by malicious DRS servers requesting credentials they should not have.
- PassportAuthIssuers []string `json:"passport_auth_issuers,omitempty"`
-
- // If authorizations contain `BearerAuth` this is an optional list of issuers that may authorize access to this object. The caller must provide a token from one of these issuers. If this is empty or missing it assumed the caller knows which token to send via other means. It is strongly recommended that the caller validate that it is appropriate to send the requested token to the DRS server to mitigate attacks by malicious DRS servers requesting credentials they should not have.
- BearerAuthIssuers []string `json:"bearer_auth_issuers,omitempty"`
-}
diff --git a/internal/apigen/go/model_access_method_update_request.go b/internal/apigen/go/model_access_method_update_request.go
deleted file mode 100644
index da7faf8..0000000
--- a/internal/apigen/go/model_access_method_update_request.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type AccessMethodUpdateRequest struct {
-
- // New access methods for the DRS object
- AccessMethods []AccessMethod `json:"access_methods"`
-
- // Optional GA4GH Passport JWTs for authorization
- Passports []string `json:"passports,omitempty"`
-}
diff --git a/internal/apigen/go/model_access_url.go b/internal/apigen/go/model_access_url.go
deleted file mode 100644
index 255b83f..0000000
--- a/internal/apigen/go/model_access_url.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type AccessUrl struct {
-
- // A fully resolvable URL that can be used to fetch the actual object bytes.
- Url string `json:"url"`
-
- // An optional list of headers to include in the HTTP request to `url`. These headers can be used to provide auth tokens required to fetch the object bytes.
- Headers []string `json:"headers,omitempty"`
-}
diff --git a/internal/apigen/go/model_authorizations.go b/internal/apigen/go/model_authorizations.go
deleted file mode 100644
index 089d305..0000000
--- a/internal/apigen/go/model_authorizations.go
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type Authorizations struct {
-
- DrsObjectId string `json:"drs_object_id,omitempty"`
-
- // An Optional list of support authorization types. More than one can be supported and tried in sequence. Defaults to `None` if empty or missing.
- SupportedTypes []string `json:"supported_types,omitempty"`
-
- // If authorizations contain `PassportAuth` this is a required list of visa issuers (as found in a visa's `iss` claim) that may authorize access to this object. The caller must only provide passports that contain visas from this list. It is strongly recommended that the caller validate that it is appropriate to send the requested passport/visa to the DRS server to mitigate attacks by malicious DRS servers requesting credentials they should not have.
- PassportAuthIssuers []string `json:"passport_auth_issuers,omitempty"`
-
- // If authorizations contain `BearerAuth` this is an optional list of issuers that may authorize access to this object. The caller must provide a token from one of these issuers. If this is empty or missing it assumed the caller knows which token to send via other means. It is strongly recommended that the caller validate that it is appropriate to send the requested token to the DRS server to mitigate attacks by malicious DRS servers requesting credentials they should not have.
- BearerAuthIssuers []string `json:"bearer_auth_issuers,omitempty"`
-}
diff --git a/internal/apigen/go/model_bulk_access_method_update_request.go b/internal/apigen/go/model_bulk_access_method_update_request.go
deleted file mode 100644
index b5acbce..0000000
--- a/internal/apigen/go/model_bulk_access_method_update_request.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type BulkAccessMethodUpdateRequest struct {
-
- // Array of access method updates to perform
- Updates []BulkAccessMethodUpdateRequestUpdatesInner `json:"updates"`
-
- // Optional GA4GH Passport JWTs for authorization
- Passports []string `json:"passports,omitempty"`
-}
diff --git a/internal/apigen/go/model_bulk_access_method_update_request_updates_inner.go b/internal/apigen/go/model_bulk_access_method_update_request_updates_inner.go
deleted file mode 100644
index b0f2450..0000000
--- a/internal/apigen/go/model_bulk_access_method_update_request_updates_inner.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type BulkAccessMethodUpdateRequestUpdatesInner struct {
-
- // DRS object ID to update
- ObjectId string `json:"object_id"`
-
- // New access methods for this object
- AccessMethods []AccessMethod `json:"access_methods"`
-}
diff --git a/internal/apigen/go/model_bulk_access_url.go b/internal/apigen/go/model_bulk_access_url.go
deleted file mode 100644
index a3ff812..0000000
--- a/internal/apigen/go/model_bulk_access_url.go
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type BulkAccessUrl struct {
-
- DrsObjectId string `json:"drs_object_id,omitempty"`
-
- DrsAccessId string `json:"drs_access_id,omitempty"`
-
- // A fully resolvable URL that can be used to fetch the actual object bytes.
- Url string `json:"url"`
-
- // An optional list of headers to include in the HTTP request to `url`. These headers can be used to provide auth tokens required to fetch the object bytes.
- Headers []string `json:"headers,omitempty"`
-}
diff --git a/internal/apigen/go/model_bulk_delete_request.go b/internal/apigen/go/model_bulk_delete_request.go
deleted file mode 100644
index 31a041a..0000000
--- a/internal/apigen/go/model_bulk_delete_request.go
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-// BulkDeleteRequest - Request body for bulk delete operations
-type BulkDeleteRequest struct {
-
- // Array of DRS object IDs to delete
- BulkObjectIds []string `json:"bulk_object_ids"`
-
- // the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
- Passports []string `json:"passports,omitempty"`
-
- // If true, delete both DRS object metadata and underlying storage data (follows server's deleteStorageDataSupported capability). If false (default), only delete DRS object metadata while preserving underlying storage data. Clients must explicitly set this to true to enable storage data deletion, ensuring intentional choice for this potentially destructive operation.
- DeleteStorageData bool `json:"delete_storage_data,omitempty"`
-}
diff --git a/internal/apigen/go/model_bulk_object_access_id.go b/internal/apigen/go/model_bulk_object_access_id.go
deleted file mode 100644
index fca4451..0000000
--- a/internal/apigen/go/model_bulk_object_access_id.go
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-// BulkObjectAccessId - The object that contains object_id/access_id tuples
-type BulkObjectAccessId struct {
-
- Passports []string `json:"passports,omitempty"`
-
- BulkObjectAccessIds []BulkObjectAccessIdBulkObjectAccessIdsInner `json:"bulk_object_access_ids,omitempty"`
-}
diff --git a/internal/apigen/go/model_bulk_object_access_id_bulk_object_access_ids_inner.go b/internal/apigen/go/model_bulk_object_access_id_bulk_object_access_ids_inner.go
deleted file mode 100644
index c29d191..0000000
--- a/internal/apigen/go/model_bulk_object_access_id_bulk_object_access_ids_inner.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type BulkObjectAccessIdBulkObjectAccessIdsInner struct {
-
- // DRS object ID
- BulkObjectId string `json:"bulk_object_id,omitempty"`
-
- // DRS object access ID
- BulkAccessIds []string `json:"bulk_access_ids,omitempty"`
-}
diff --git a/internal/apigen/go/model_bulk_object_id_no_passport.go b/internal/apigen/go/model_bulk_object_id_no_passport.go
deleted file mode 100644
index 82d9e5a..0000000
--- a/internal/apigen/go/model_bulk_object_id_no_passport.go
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-// BulkObjectIdNoPassport - The object that contains the DRS object IDs array
-type BulkObjectIdNoPassport struct {
-
- // An array of ObjectIDs.
- BulkObjectIds []string `json:"bulk_object_ids,omitempty"`
-}
diff --git a/internal/apigen/go/model_bulk_update_access_methods_200_response.go b/internal/apigen/go/model_bulk_update_access_methods_200_response.go
deleted file mode 100644
index def98f7..0000000
--- a/internal/apigen/go/model_bulk_update_access_methods_200_response.go
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type BulkUpdateAccessMethods200Response struct {
-
- // Array of updated DRS objects
- Objects []DrsObject `json:"objects"`
-}
diff --git a/internal/apigen/go/model_checksum.go b/internal/apigen/go/model_checksum.go
deleted file mode 100644
index 955cf5b..0000000
--- a/internal/apigen/go/model_checksum.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type Checksum struct {
-
- // The hex-string encoded checksum for the data
- Checksum string `json:"checksum"`
-
- // The digest method used to create the checksum. The value (e.g. `sha-256`) SHOULD be listed as `Hash Name String` in the https://www.iana.org/assignments/named-information/named-information.xhtml#hash-alg[IANA Named Information Hash Algorithm Registry]. Other values MAY be used, as long as implementors are aware of the issues discussed in https://tools.ietf.org/html/rfc6920#section-9.4[RFC6920]. GA4GH may provide more explicit guidance for use of non-IANA-registered algorithms in the future. Until then, if implementers do choose such an algorithm (e.g. because it's implemented by their storage provider), they SHOULD use an existing standard `type` value such as `md5`, `etag`, `crc32c`, `trunc512`, or `sha1`.
- Type string `json:"type"`
-}
diff --git a/internal/apigen/go/model_contents_object.go b/internal/apigen/go/model_contents_object.go
deleted file mode 100644
index 05e4787..0000000
--- a/internal/apigen/go/model_contents_object.go
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type ContentsObject struct {
-
- // A name declared by the bundle author that must be used when materialising this object, overriding any name directly associated with the object itself. The name must be unique within the containing bundle. This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].
- Name string `json:"name"`
-
- // A DRS identifier of a `DrsObject` (either a single blob or a nested bundle). If this ContentsObject is an object within a nested bundle, then the id is optional. Otherwise, the id is required.
- Id string `json:"id,omitempty"`
-
- // A list of full DRS identifier URI paths that may be used to obtain the object. These URIs may be external to this DRS instance.
- DrsUri []string `json:"drs_uri,omitempty"`
-
- // If this ContentsObject describes a nested bundle and the caller specified \"?expand=true\" on the request, then this contents array must be present and describe the objects within the nested bundle.
- Contents []ContentsObject `json:"contents,omitempty"`
-}
diff --git a/internal/apigen/go/model_delete_request.go b/internal/apigen/go/model_delete_request.go
deleted file mode 100644
index b767490..0000000
--- a/internal/apigen/go/model_delete_request.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-// DeleteRequest - Request body for single object delete operations
-type DeleteRequest struct {
-
- // the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
- Passports []string `json:"passports,omitempty"`
-
- // If true, delete both DRS object metadata and underlying storage data (follows server's deleteStorageDataSupported capability). If false (default), only delete DRS object metadata while preserving underlying storage data. Clients must explicitly set this to true to enable storage data deletion, ensuring intentional choice for this potentially destructive operation.
- DeleteStorageData bool `json:"delete_storage_data,omitempty"`
-}
diff --git a/internal/apigen/go/model_drs_object.go b/internal/apigen/go/model_drs_object.go
deleted file mode 100644
index 70bdd78..0000000
--- a/internal/apigen/go/model_drs_object.go
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-import (
- "time"
-)
-
-type DrsObject struct {
-
- // An identifier unique to this `DrsObject`
- Id string `json:"id"`
-
- // A string that can be used to name a `DrsObject`. This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].
- Name string `json:"name,omitempty"`
-
- // A drs:// hostname-based URI, as defined in the DRS documentation, that tells clients how to access this object. The intent of this field is to make DRS objects self-contained, and therefore easier for clients to store and pass around. For example, if you arrive at this DRS JSON by resolving a compact identifier-based DRS URI, the `self_uri` presents you with a hostname and properly encoded DRS ID for use in subsequent `access` endpoint calls.
- SelfUri string `json:"self_uri"`
-
- // For blobs, the blob size in bytes. For bundles, the cumulative size, in bytes, of items in the `contents` field.
- Size int64 `json:"size"`
-
- // Timestamp of content creation in RFC3339. (This is the creation time of the underlying content, not of the JSON object.)
- CreatedTime time.Time `json:"created_time"`
-
- // Timestamp of content update in RFC3339, identical to `created_time` in systems that do not support updates. (This is the update time of the underlying content, not of the JSON object.)
- UpdatedTime time.Time `json:"updated_time,omitempty"`
-
- // A string representing a version. (Some systems may use checksum, a RFC3339 timestamp, or an incrementing version number.)
- Version string `json:"version,omitempty"`
-
- // A string providing the mime-type of the `DrsObject`.
- MimeType string `json:"mime_type,omitempty"`
-
- // The checksum of the `DrsObject`. At least one checksum must be provided. For blobs, the checksum is computed over the bytes in the blob. For bundles, the checksum is computed over a sorted concatenation of the checksums of its top-level contained objects (not recursive, names not included). The list of checksums is sorted alphabetically (hex-code) before concatenation and a further checksum is performed on the concatenated checksum value. For example, if a bundle contains blobs with the following checksums: md5(blob1) = 72794b6d md5(blob2) = 5e089d29 Then the checksum of the bundle is: md5( concat( sort( md5(blob1), md5(blob2) ) ) ) = md5( concat( sort( 72794b6d, 5e089d29 ) ) ) = md5( concat( 5e089d29, 72794b6d ) ) = md5( 5e089d2972794b6d ) = f7a29a04
- Checksums []Checksum `json:"checksums"`
-
- // The list of access methods that can be used to fetch the `DrsObject`. Required for single blobs; optional for bundles.
- AccessMethods []AccessMethod `json:"access_methods,omitempty"`
-
- // If not set, this `DrsObject` is a single blob. If set, this `DrsObject` is a bundle containing the listed `ContentsObject` s (some of which may be further nested).
- Contents []ContentsObject `json:"contents,omitempty"`
-
- // A human readable description of the `DrsObject`.
- Description string `json:"description,omitempty"`
-
- // A list of strings that can be used to find other metadata about this `DrsObject` from external metadata sources. These aliases can be used to represent secondary accession numbers or external GUIDs.
- Aliases []string `json:"aliases,omitempty"`
-}
diff --git a/internal/apigen/go/model_drs_object_candidate.go b/internal/apigen/go/model_drs_object_candidate.go
deleted file mode 100644
index 3920034..0000000
--- a/internal/apigen/go/model_drs_object_candidate.go
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type DrsObjectCandidate struct {
-
- // A string that can be used to name a `DrsObject`. This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].
- Name string `json:"name,omitempty"`
-
- // For blobs, the blob size in bytes. For bundles, the cumulative size, in bytes, of items in the `contents` field.
- Size int64 `json:"size"`
-
- // A string representing a version. (Some systems may use checksum, a RFC3339 timestamp, or an incrementing version number.)
- Version string `json:"version,omitempty"`
-
- // A string providing the mime-type of the `DrsObject`.
- MimeType string `json:"mime_type,omitempty"`
-
- // The checksum of the `DrsObject`. At least one checksum must be provided. For blobs, the checksum is computed over the bytes in the blob. For bundles, the checksum is computed over a sorted concatenation of the checksums of its top-level contained objects (not recursive, names not included). The list of checksums is sorted alphabetically (hex-code) before concatenation and a further checksum is performed on the concatenated checksum value. For example, if a bundle contains blobs with the following checksums: md5(blob1) = 72794b6d md5(blob2) = 5e089d29 Then the checksum of the bundle is: md5( concat( sort( md5(blob1), md5(blob2) ) ) ) = md5( concat( sort( 72794b6d, 5e089d29 ) ) ) = md5( concat( 5e089d29, 72794b6d ) ) = md5( 5e089d2972794b6d ) = f7a29a04
- Checksums []Checksum `json:"checksums"`
-
- // The list of access methods that can be used to fetch the `DrsObject`. Required for single blobs; optional for bundles.
- AccessMethods []AccessMethod `json:"access_methods,omitempty"`
-
- // If not set, this `DrsObject` is a single blob. If set, this `DrsObject` is a bundle containing the listed `ContentsObject` s (some of which may be further nested).
- Contents []ContentsObject `json:"contents,omitempty"`
-
- // A human readable description of the `DrsObject`.
- Description string `json:"description,omitempty"`
-
- // A list of strings that can be used to find other metadata about this `DrsObject` from external metadata sources. These aliases can be used to represent secondary accession numbers or external GUIDs.
- Aliases []string `json:"aliases,omitempty"`
-}
diff --git a/internal/apigen/go/model_drs_service.go b/internal/apigen/go/model_drs_service.go
deleted file mode 100644
index 946533c..0000000
--- a/internal/apigen/go/model_drs_service.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type DrsService struct {
-
- // DEPRECATED - In 2.0 this will move to under the drs section of service info and not at the root level. The max length the bulk request endpoints can handle (>= 1) before generating a 413 error e.g. how long can the arrays bulk_object_ids and bulk_object_access_ids be for this server.
- MaxBulkRequestLength int32 `json:"maxBulkRequestLength"`
-
- Type DrsServiceType `json:"type"`
-
- Drs DrsServiceDrs `json:"drs,omitempty"`
-}
diff --git a/internal/apigen/go/model_drs_service_drs.go b/internal/apigen/go/model_drs_service_drs.go
deleted file mode 100644
index 7b933c9..0000000
--- a/internal/apigen/go/model_drs_service_drs.go
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type DrsServiceDrs struct {
-
- // The max length the bulk request endpoints can handle (>= 1) before generating a 413 error e.g. how long can the arrays bulk_object_ids and bulk_object_access_ids be for this server.
- MaxBulkRequestLength int32 `json:"maxBulkRequestLength"`
-
- // The total number of objects in this DRS service.
- ObjectCount int32 `json:"objectCount,omitempty"`
-
- // The total size of all objects in this DRS service in bytes. As a general best practice, file bytes are counted for each unique file and not cloud mirrors or other redundant copies.
- TotalObjectSize int32 `json:"totalObjectSize,omitempty"`
-
- // Indicates whether this DRS server supports upload request operations via the `/upload-request` endpoint. If true, clients can request upload methods and credentials for uploading files. If false or missing, the server does not support upload request coordination.
- UploadRequestSupported bool `json:"uploadRequestSupported,omitempty"`
-
- // Indicates whether this DRS server supports object registration operations via the `/objects/register` endpoint. If true, clients can register uploaded files or existing data as DRS objects. If false or missing, the server does not support object registration.
- ObjectRegistrationSupported bool `json:"objectRegistrationSupported,omitempty"`
-
- // List of upload methods supported by this DRS server. Only present when uploadRequestSupported is true. Clients can use this information to determine which upload methods are available before making upload requests. - **s3**: Direct S3 upload with temporary AWS credentials - **gs**: Google Cloud Storage upload with access tokens - **https**: Presigned POST URL for HTTP uploads - **ftp**: File Transfer Protocol uploads - **sftp**: Secure File Transfer Protocol uploads - **gsiftp**: GridFTP secure file transfer - **globus**: Globus transfer service for high-performance data movement
- SupportedUploadMethods []string `json:"supportedUploadMethods,omitempty"`
-
- // Maximum file size in bytes that can be uploaded via the upload endpoints. Only present when uploadRequestSupported is true. If not specified, there is no explicit size limit.
- MaxUploadSize int64 `json:"maxUploadSize,omitempty"`
-
- // Maximum number of files that can be included in a single upload request. Only present when uploadRequestSupported is true. If not specified, defaults to the same value as maxBulkRequestLength.
- MaxUploadRequestLength int32 `json:"maxUploadRequestLength,omitempty"`
-
- // Maximum number of candidate objects that can be included in a single registration request. Only present when objectRegistrationSupported is true. If not specified, defaults to the same value as maxBulkRequestLength.
- MaxRegisterRequestLength int32 `json:"maxRegisterRequestLength,omitempty"`
-
- // Indicates whether this DRS server validates uploaded file checksums against the provided metadata. If true, the server will verify that uploaded files match their declared checksums and may reject uploads with mismatches. If false or missing, the server does not perform checksum validation and relies on client-provided metadata. Only present when uploadRequestSupported or objectRegistrationSupported is true.
- ValidateUploadChecksums bool `json:"validateUploadChecksums,omitempty"`
-
- // Indicates whether this DRS server validates uploaded file sizes against the provided metadata. If true, the server will verify that uploaded files match their declared sizes and may reject uploads with mismatches. If false or missing, the server does not perform file size validation and relies on client-provided metadata. Only present when uploadRequestSupported or objectRegistrationSupported is true.
- ValidateUploadFileSizes bool `json:"validateUploadFileSizes,omitempty"`
-
- // Indicates whether this DRS server supports storing files from the same upload request under a common prefix or folder structure. If true, the server will organize related files together in storage, enabling bioinformatics workflows that expect co-located files (e.g., CRAM + CRAI, VCF + TBI). If false or missing, the server may distribute files across different storage locations or prefixes. Only present when uploadRequestSupported is true. This feature is particularly valuable for genomics tools like samtools that expect index files to be co-located with data files.
- RelatedFileStorageSupported bool `json:"relatedFileStorageSupported,omitempty"`
-
- // Indicates whether this DRS server supports delete operations via the delete endpoints. If true, clients can delete DRS objects using POST requests to `/objects/{object_id}/delete` and `/objects/delete`. If false or missing, the server does not support delete operations and will return 404 for delete endpoint requests. Like upload functionality, delete support is entirely optional and servers remain DRS compliant without it.
- DeleteSupported bool `json:"deleteSupported,omitempty"`
-
- // Maximum number of objects that can be deleted in a single bulk delete request via `/objects/delete`. Only present when deleteSupported is true. If not specified when delete is supported, defaults to the same value as maxBulkRequestLength. Servers may enforce lower limits for delete operations compared to other bulk operations for safety reasons.
- MaxBulkDeleteLength int32 `json:"maxBulkDeleteLength,omitempty"`
-
- // Indicates whether this DRS server supports attempting to delete underlying storage data when clients request it. If true, the server will attempt to delete both metadata and storage files when `delete_storage_data: true` is specified in delete requests. If false or missing, the server only supports metadata deletion regardless of client request, preserving underlying storage data. Only present when deleteSupported is true. This is a capability flag indicating what the server can attempt, not a default behavior setting. Note: Storage deletion attempts may fail due to permissions, network issues, or storage service errors.
- DeleteStorageDataSupported bool `json:"deleteStorageDataSupported,omitempty"`
-
- // Indicates whether this DRS server supports updating access methods for existing objects. If true, clients can update access methods using `/objects/{object_id}/access-methods` and `/objects/access-methods` endpoints. If false or missing, the server does not support access method updates.
- AccessMethodUpdateSupported bool `json:"accessMethodUpdateSupported,omitempty"`
-
- // Maximum number of objects that can be updated in a single bulk access method update request. Only present when accessMethodUpdateSupported is true. If not specified, defaults to maxBulkRequestLength.
- MaxBulkAccessMethodUpdateLength int32 `json:"maxBulkAccessMethodUpdateLength,omitempty"`
-
- // Indicates whether this DRS server validates new access methods by verifying they point to the same data. If true, the server will attempt to verify checksums/content before updating access methods. If false or missing, the server trusts client-provided access methods without validation. Only present when accessMethodUpdateSupported is true.
- ValidateAccessMethodUpdates bool `json:"validateAccessMethodUpdates,omitempty"`
-}
diff --git a/internal/apigen/go/model_drs_service_type.go b/internal/apigen/go/model_drs_service_type.go
deleted file mode 100644
index 0770489..0000000
--- a/internal/apigen/go/model_drs_service_type.go
+++ /dev/null
@@ -1,16 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type DrsServiceType struct {
-
- Artifact string `json:"artifact"`
-}
diff --git a/internal/apigen/go/model_error.go b/internal/apigen/go/model_error.go
deleted file mode 100644
index 377369e..0000000
--- a/internal/apigen/go/model_error.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-// Error - An object that can optionally include information about the error.
-type Error struct {
-
- // A detailed error message.
- Msg string `json:"msg,omitempty"`
-
- // The integer representing the HTTP status code (e.g. 200, 404).
- StatusCode int32 `json:"status_code,omitempty"`
-}
diff --git a/internal/apigen/go/model_get_bulk_access_url_200_response.go b/internal/apigen/go/model_get_bulk_access_url_200_response.go
deleted file mode 100644
index 2b51450..0000000
--- a/internal/apigen/go/model_get_bulk_access_url_200_response.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type GetBulkAccessUrl200Response struct {
-
- Summary Summary `json:"summary,omitempty"`
-
- // Error codes for each unresolved drs objects.
- UnresolvedDrsObjects []UnresolvedInner `json:"unresolved_drs_objects,omitempty"`
-
- ResolvedDrsObjectAccessUrls []BulkAccessUrl `json:"resolved_drs_object_access_urls,omitempty"`
-}
diff --git a/internal/apigen/go/model_get_bulk_objects_200_response.go b/internal/apigen/go/model_get_bulk_objects_200_response.go
deleted file mode 100644
index f3b035c..0000000
--- a/internal/apigen/go/model_get_bulk_objects_200_response.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type GetBulkObjects200Response struct {
-
- Summary Summary `json:"summary,omitempty"`
-
- // Error codes for each unresolved drs objects.
- UnresolvedDrsObjects []UnresolvedInner `json:"unresolved_drs_objects,omitempty"`
-
- ResolvedDrsObject []DrsObject `json:"resolved_drs_object,omitempty"`
-}
diff --git a/internal/apigen/go/model_get_bulk_objects_request.go b/internal/apigen/go/model_get_bulk_objects_request.go
deleted file mode 100644
index a51bdb8..0000000
--- a/internal/apigen/go/model_get_bulk_objects_request.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type GetBulkObjectsRequest struct {
-
- // the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
- Passports []string `json:"passports,omitempty"`
-
- // An array of ObjectIDs to retrieve metadata for
- BulkObjectIds []string `json:"bulk_object_ids"`
-}
diff --git a/internal/apigen/go/model_get_service_info_200_response.go b/internal/apigen/go/model_get_service_info_200_response.go
deleted file mode 100644
index 0b48b80..0000000
--- a/internal/apigen/go/model_get_service_info_200_response.go
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-import (
- "time"
-)
-
-type GetServiceInfo200Response struct {
-
- // Unique ID of this service. Reverse domain name notation is recommended, though not required. The identifier should attempt to be globally unique so it can be used in downstream aggregator services e.g. Service Registry.
- Id string `json:"id"`
-
- // Name of this service. Should be human readable.
- Name string `json:"name"`
-
- Type DrsServiceType `json:"type"`
-
- // Description of the service. Should be human readable and provide information about the service.
- Description string `json:"description,omitempty"`
-
- Organization ServiceOrganization `json:"organization"`
-
- // URL of the contact for the provider of this service, e.g. a link to a contact form (RFC 3986 format), or an email (RFC 2368 format).
- ContactUrl string `json:"contactUrl,omitempty"`
-
- // URL of the documentation of this service (RFC 3986 format). This should help someone learn how to use your service, including any specifics required to access data, e.g. authentication.
- DocumentationUrl string `json:"documentationUrl,omitempty"`
-
- // Timestamp describing when the service was first deployed and available (RFC 3339 format)
- CreatedAt time.Time `json:"createdAt,omitempty"`
-
- // Timestamp describing when the service was last updated (RFC 3339 format)
- UpdatedAt time.Time `json:"updatedAt,omitempty"`
-
- // Environment the service is running in. Use this to distinguish between production, development and testing/staging deployments. Suggested values are prod, test, dev, staging. However this is advised and not enforced.
- Environment string `json:"environment,omitempty"`
-
- // Version of the service being described. Semantic versioning is recommended, but other identifiers, such as dates or commit hashes, are also allowed. The version should be changed whenever the service is updated.
- Version string `json:"version"`
-
- // DEPRECATED - In 2.0 this will move to under the drs section of service info and not at the root level. The max length the bulk request endpoints can handle (>= 1) before generating a 413 error e.g. how long can the arrays bulk_object_ids and bulk_object_access_ids be for this server.
- MaxBulkRequestLength int32 `json:"maxBulkRequestLength"`
-
- Drs DrsServiceDrs `json:"drs,omitempty"`
-}
diff --git a/internal/apigen/go/model_options_bulk_object_200_response.go b/internal/apigen/go/model_options_bulk_object_200_response.go
deleted file mode 100644
index 987300b..0000000
--- a/internal/apigen/go/model_options_bulk_object_200_response.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type OptionsBulkObject200Response struct {
-
- Summary Summary `json:"summary,omitempty"`
-
- // Error codes for each unresolved drs objects.
- UnresolvedDrsObjects []UnresolvedInner `json:"unresolved_drs_objects,omitempty"`
-
- ResolvedDrsObject []Authorizations `json:"resolved_drs_object,omitempty"`
-}
diff --git a/internal/apigen/go/model_post_access_url_request.go b/internal/apigen/go/model_post_access_url_request.go
deleted file mode 100644
index 2ae55d6..0000000
--- a/internal/apigen/go/model_post_access_url_request.go
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type PostAccessUrlRequest struct {
-
- // the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
- Passports []string `json:"passports,omitempty"`
-}
diff --git a/internal/apigen/go/model_post_object_request.go b/internal/apigen/go/model_post_object_request.go
deleted file mode 100644
index 0d9e396..0000000
--- a/internal/apigen/go/model_post_object_request.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type PostObjectRequest struct {
-
- // If false and the object_id refers to a bundle, then the ContentsObject array contains only those objects directly contained in the bundle. That is, if the bundle contains other bundles, those other bundles are not recursively included in the result. If true and the object_id refers to a bundle, then the entire set of objects in the bundle is expanded. That is, if the bundle contains other bundles, then those other bundles are recursively expanded and included in the result. Recursion continues through the entire sub-tree of the bundle. If the object_id refers to a blob, then the query parameter is ignored.
- Expand bool `json:"expand,omitempty"`
-
- // the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
- Passports []string `json:"passports,omitempty"`
-}
diff --git a/internal/apigen/go/model_register_objects_201_response.go b/internal/apigen/go/model_register_objects_201_response.go
deleted file mode 100644
index bb8b2a4..0000000
--- a/internal/apigen/go/model_register_objects_201_response.go
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type RegisterObjects201Response struct {
-
- // Array of registered DRS objects in the same order as the candidates in the request
- Objects []DrsObject `json:"objects"`
-}
diff --git a/internal/apigen/go/model_register_objects_request.go b/internal/apigen/go/model_register_objects_request.go
deleted file mode 100644
index 40da461..0000000
--- a/internal/apigen/go/model_register_objects_request.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type RegisterObjectsRequest struct {
-
- // Array of DRS object candidates to register (server will mint IDs and timestamps)
- Candidates []DrsObjectCandidate `json:"candidates"`
-
- // Optional array of GA4GH Passport JWTs for authorization
- Passports []string `json:"passports,omitempty"`
-}
diff --git a/internal/apigen/go/model_service.go b/internal/apigen/go/model_service.go
deleted file mode 100644
index 688a169..0000000
--- a/internal/apigen/go/model_service.go
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-import (
- "time"
-)
-
-// Service - GA4GH service
-type Service struct {
-
- // Unique ID of this service. Reverse domain name notation is recommended, though not required. The identifier should attempt to be globally unique so it can be used in downstream aggregator services e.g. Service Registry.
- Id string `json:"id"`
-
- // Name of this service. Should be human readable.
- Name string `json:"name"`
-
- Type ServiceType `json:"type"`
-
- // Description of the service. Should be human readable and provide information about the service.
- Description string `json:"description,omitempty"`
-
- Organization ServiceOrganization `json:"organization"`
-
- // URL of the contact for the provider of this service, e.g. a link to a contact form (RFC 3986 format), or an email (RFC 2368 format).
- ContactUrl string `json:"contactUrl,omitempty"`
-
- // URL of the documentation of this service (RFC 3986 format). This should help someone learn how to use your service, including any specifics required to access data, e.g. authentication.
- DocumentationUrl string `json:"documentationUrl,omitempty"`
-
- // Timestamp describing when the service was first deployed and available (RFC 3339 format)
- CreatedAt time.Time `json:"createdAt,omitempty"`
-
- // Timestamp describing when the service was last updated (RFC 3339 format)
- UpdatedAt time.Time `json:"updatedAt,omitempty"`
-
- // Environment the service is running in. Use this to distinguish between production, development and testing/staging deployments. Suggested values are prod, test, dev, staging. However this is advised and not enforced.
- Environment string `json:"environment,omitempty"`
-
- // Version of the service being described. Semantic versioning is recommended, but other identifiers, such as dates or commit hashes, are also allowed. The version should be changed whenever the service is updated.
- Version string `json:"version"`
-}
diff --git a/internal/apigen/go/model_service_organization.go b/internal/apigen/go/model_service_organization.go
deleted file mode 100644
index 5fa529c..0000000
--- a/internal/apigen/go/model_service_organization.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-// ServiceOrganization - Organization providing the service
-type ServiceOrganization struct {
-
- // Name of the organization responsible for the service
- Name string `json:"name"`
-
- // URL of the website of the organization (RFC 3986 format)
- Url string `json:"url"`
-}
diff --git a/internal/apigen/go/model_service_type.go b/internal/apigen/go/model_service_type.go
deleted file mode 100644
index ebd8929..0000000
--- a/internal/apigen/go/model_service_type.go
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-// ServiceType - Type of a GA4GH service
-type ServiceType struct {
-
- // Namespace in reverse domain name format. Use `org.ga4gh` for implementations compliant with official GA4GH specifications. For services with custom APIs not standardized by GA4GH, or implementations diverging from official GA4GH specifications, use a different namespace (e.g. your organization's reverse domain name).
- Group string `json:"group"`
-
- // Name of the API or GA4GH specification implemented. Official GA4GH types should be assigned as part of standards approval process. Custom artifacts are supported.
- Artifact string `json:"artifact"`
-
- // Version of the API or specification. GA4GH specifications use semantic versioning.
- Version string `json:"version"`
-}
diff --git a/internal/apigen/go/model_summary.go b/internal/apigen/go/model_summary.go
deleted file mode 100644
index 65ea495..0000000
--- a/internal/apigen/go/model_summary.go
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-// Summary - A summary of what was resolved.
-type Summary struct {
-
- // Number of items requested.
- Requested int32 `json:"requested,omitempty"`
-
- // Number of objects resolved.
- Resolved int32 `json:"resolved,omitempty"`
-
- // Number of objects not resolved.
- Unresolved int32 `json:"unresolved,omitempty"`
-}
diff --git a/internal/apigen/go/model_unresolved_inner.go b/internal/apigen/go/model_unresolved_inner.go
deleted file mode 100644
index 42ff768..0000000
--- a/internal/apigen/go/model_unresolved_inner.go
+++ /dev/null
@@ -1,18 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type UnresolvedInner struct {
-
- ErrorCode int32 `json:"error_code,omitempty"`
-
- ObjectIds []string `json:"object_ids,omitempty"`
-}
diff --git a/internal/apigen/go/model_upload_method.go b/internal/apigen/go/model_upload_method.go
deleted file mode 100644
index 1cc8d3f..0000000
--- a/internal/apigen/go/model_upload_method.go
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type UploadMethod struct {
-
- // Type of upload method. Implementations MAY support any subset of these types. The 'https' type can be used to return a presigned POST URL and is expected to be the most common implementation for typical file uploads. This method provides a simple HTTP POST interface that works with standard web clients. The 's3' type is primarily intended to support uploads of large files that want to take advantage of multipart uploads and automatic retries implemented in AWS libraries. This method provides direct access to S3-specific upload capabilities. Other common implementations include 'gs' for Google Cloud Storage and 'sftp' for secure FTP uploads.
- Type string `json:"type"`
-
- AccessUrl UploadMethodAccessUrl `json:"access_url"`
-
- // Cloud region for the upload location. Optional for non-cloud storage types.
- Region string `json:"region,omitempty"`
-
- // A dictionary of upload-specific configuration details that vary by upload method type. The contents and structure depend on the specific upload method being used.
- UploadDetails map[string]interface{} `json:"upload_details,omitempty"`
-}
diff --git a/internal/apigen/go/model_upload_method_access_url.go b/internal/apigen/go/model_upload_method_access_url.go
deleted file mode 100644
index a1516ee..0000000
--- a/internal/apigen/go/model_upload_method_access_url.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type UploadMethodAccessUrl struct {
-
- // A fully resolvable URL that can be used to fetch the actual object bytes.
- Url string `json:"url"`
-
- // An optional list of headers to include in the HTTP request to `url`. These headers can be used to provide auth tokens required to fetch the object bytes.
- Headers []string `json:"headers,omitempty"`
-}
diff --git a/internal/apigen/go/model_upload_request.go b/internal/apigen/go/model_upload_request.go
deleted file mode 100644
index cc1570d..0000000
--- a/internal/apigen/go/model_upload_request.go
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type UploadRequest struct {
-
- // Array of upload requests for files
- Requests []UploadRequestObject `json:"requests"`
-
- // Optional array of GA4GH Passport JWTs for authorization
- Passports []string `json:"passports,omitempty"`
-}
diff --git a/internal/apigen/go/model_upload_request_object.go b/internal/apigen/go/model_upload_request_object.go
deleted file mode 100644
index 695822b..0000000
--- a/internal/apigen/go/model_upload_request_object.go
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type UploadRequestObject struct {
-
- // The name of the file to upload
- Name string `json:"name"`
-
- // Size of the file in bytes
- Size int64 `json:"size"`
-
- // MIME type of the file
- MimeType string `json:"mime_type"`
-
- // Array of checksums for file integrity verification
- Checksums []Checksum `json:"checksums"`
-
- // Optional description of the file
- Description string `json:"description,omitempty"`
-
- // Optional array of alternative names for the file
- Aliases []string `json:"aliases,omitempty"`
-}
diff --git a/internal/apigen/go/model_upload_response.go b/internal/apigen/go/model_upload_response.go
deleted file mode 100644
index 91f174c..0000000
--- a/internal/apigen/go/model_upload_response.go
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type UploadResponse struct {
-
- // List of upload responses for the requested files
- Responses []UploadResponseObject `json:"responses"`
-}
diff --git a/internal/apigen/go/model_upload_response_object.go b/internal/apigen/go/model_upload_response_object.go
deleted file mode 100644
index 0d0f554..0000000
--- a/internal/apigen/go/model_upload_response_object.go
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-type UploadResponseObject struct {
-
- // The name of the file
- Name string `json:"name"`
-
- // Size of the file in bytes
- Size int64 `json:"size"`
-
- // MIME type of the file
- MimeType string `json:"mime_type"`
-
- // Array of checksums for file integrity verification
- Checksums []Checksum `json:"checksums"`
-
- // Optional description of the file
- Description string `json:"description,omitempty"`
-
- // Optional array of alternative names
- Aliases []string `json:"aliases,omitempty"`
-
- // Available methods for uploading this file
- UploadMethods []UploadMethod `json:"upload_methods,omitempty"`
-}
diff --git a/internal/apigen/go/routers.go b/internal/apigen/go/routers.go
deleted file mode 100644
index 76f857b..0000000
--- a/internal/apigen/go/routers.go
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package openapi
-
-import (
- "net/http"
-
- "github.com/gin-gonic/gin"
-)
-
-// Route is the information for every URI.
-type Route struct {
- // Name is the name of this Route.
- Name string
- // Method is the string for the HTTP method. ex) GET, POST etc..
- Method string
- // Pattern is the pattern of the URI.
- Pattern string
- // HandlerFunc is the handler function of this route.
- HandlerFunc gin.HandlerFunc
-}
-
-// NewRouter returns a new router.
-func NewRouter(handleFunctions ApiHandleFunctions) *gin.Engine {
- return NewRouterWithGinEngine(gin.Default(), handleFunctions)
-}
-
-// NewRouter add routes to existing gin engine.
-func NewRouterWithGinEngine(router *gin.Engine, handleFunctions ApiHandleFunctions) *gin.Engine {
- for _, route := range getRoutes(handleFunctions) {
- if route.HandlerFunc == nil {
- route.HandlerFunc = DefaultHandleFunc
- }
- switch route.Method {
- case http.MethodGet:
- router.GET(route.Pattern, route.HandlerFunc)
- case http.MethodPost:
- router.POST(route.Pattern, route.HandlerFunc)
- case http.MethodPut:
- router.PUT(route.Pattern, route.HandlerFunc)
- case http.MethodPatch:
- router.PATCH(route.Pattern, route.HandlerFunc)
- case http.MethodDelete:
- router.DELETE(route.Pattern, route.HandlerFunc)
- }
- }
-
- return router
-}
-
-// Default handler for not yet implemented routes
-func DefaultHandleFunc(c *gin.Context) {
- c.String(http.StatusNotImplemented, "501 not implemented")
-}
-
-type ApiHandleFunctions struct {
-
- // Routes for the ObjectsAPI part of the API
- ObjectsAPI ObjectsAPI
- // Routes for the ServiceInfoAPI part of the API
- ServiceInfoAPI ServiceInfoAPI
- // Routes for the UploadRequestAPI part of the API
- UploadRequestAPI UploadRequestAPI
-}
-
-func getRoutes(handleFunctions ApiHandleFunctions) []Route {
- return []Route{
- {
- "BulkDeleteObjects",
- http.MethodPost,
- "/ga4gh/drs/v1/objects/delete",
- handleFunctions.ObjectsAPI.BulkDeleteObjects,
- },
- {
- "BulkUpdateAccessMethods",
- http.MethodPost,
- "/ga4gh/drs/v1/objects/access-methods",
- handleFunctions.ObjectsAPI.BulkUpdateAccessMethods,
- },
- {
- "DeleteObject",
- http.MethodPost,
- "/ga4gh/drs/v1/objects/:object_id/delete",
- handleFunctions.ObjectsAPI.DeleteObject,
- },
- {
- "GetAccessURL",
- http.MethodGet,
- "/ga4gh/drs/v1/objects/:object_id/access/:access_id",
- handleFunctions.ObjectsAPI.GetAccessURL,
- },
- {
- "GetBulkAccessURL",
- http.MethodPost,
- "/ga4gh/drs/v1/objects/access",
- handleFunctions.ObjectsAPI.GetBulkAccessURL,
- },
- {
- "GetBulkObjects",
- http.MethodPost,
- "/ga4gh/drs/v1/objects",
- handleFunctions.ObjectsAPI.GetBulkObjects,
- },
- {
- "GetObject",
- http.MethodGet,
- "/ga4gh/drs/v1/objects/:object_id",
- handleFunctions.ObjectsAPI.GetObject,
- },
- {
- "GetObjectsByChecksum",
- http.MethodGet,
- "/ga4gh/drs/v1/objects/checksum/:checksum",
- handleFunctions.ObjectsAPI.GetObjectsByChecksum,
- },
- {
- "OptionsBulkObject",
- http.MethodOptions,
- "/ga4gh/drs/v1/objects",
- handleFunctions.ObjectsAPI.OptionsBulkObject,
- },
- {
- "OptionsObject",
- http.MethodOptions,
- "/ga4gh/drs/v1/objects/:object_id",
- handleFunctions.ObjectsAPI.OptionsObject,
- },
- {
- "PostAccessURL",
- http.MethodPost,
- "/ga4gh/drs/v1/objects/:object_id/access/:access_id",
- handleFunctions.ObjectsAPI.PostAccessURL,
- },
- {
- "PostObject",
- http.MethodPost,
- "/ga4gh/drs/v1/objects/:object_id",
- handleFunctions.ObjectsAPI.PostObject,
- },
- {
- "RegisterObjects",
- http.MethodPost,
- "/ga4gh/drs/v1/objects/register",
- handleFunctions.ObjectsAPI.RegisterObjects,
- },
- {
- "UpdateObjectAccessMethods",
- http.MethodPost,
- "/ga4gh/drs/v1/objects/:object_id/access-methods",
- handleFunctions.ObjectsAPI.UpdateObjectAccessMethods,
- },
- {
- "GetServiceInfo",
- http.MethodGet,
- "/ga4gh/drs/v1/service-info",
- handleFunctions.ServiceInfoAPI.GetServiceInfo,
- },
- {
- "PostUploadRequest",
- http.MethodPost,
- "/ga4gh/drs/v1/upload-request",
- handleFunctions.UploadRequestAPI.PostUploadRequest,
- },
- }
-}
diff --git a/internal/apigen/main.go b/internal/apigen/main.go
deleted file mode 100644
index 3588f2e..0000000
--- a/internal/apigen/main.go
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Data Repository Service
- *
- * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
- *
- * API version: 1.5.0
- * Contact: ga4gh-cloud@ga4gh.org
- * Generated by: OpenAPI Generator (https://openapi-generator.tech)
- */
-
-package main
-
-import (
- "log"
-
- // WARNING!
- // Pass --git-repo-id and --git-user-id properties when generating the code
- //
- sw "github.com/calypr/drs-server/go"
-)
-
-func main() {
- routes := sw.ApiHandleFunctions{}
-
- log.Printf("Server started")
-
- router := sw.NewRouter(routes)
-
- log.Fatal(router.Run(":8080"))
-}
From 8cba6c9722366026edb50b1724469ca6f8f14aaa Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 23 Dec 2025 17:48:21 +0000
Subject: [PATCH 5/6] Make error message more descriptive: "response body too
large"
Co-authored-by: bwalsh <47808+bwalsh@users.noreply.github.com>
---
cmd/server/middleware/openapi_response_validator.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/cmd/server/middleware/openapi_response_validator.go b/cmd/server/middleware/openapi_response_validator.go
index 3e02496..e588baa 100644
--- a/cmd/server/middleware/openapi_response_validator.go
+++ b/cmd/server/middleware/openapi_response_validator.go
@@ -95,7 +95,7 @@ func NewOpenAPIResponseValidator(cfg ResponseValidatorConfig) gin.HandlerFunc {
c.Writer = bw.underlying // restore
c.Status(http.StatusRequestEntityTooLarge) // 413
c.Header("Content-Type", "application/json")
- c.Writer.Write([]byte(fmt.Sprintf(`{"error":"content too large","detail":%q}`, msg)))
+ c.Writer.Write([]byte(fmt.Sprintf(`{"error":"response body too large","detail":%q}`, msg)))
return
}
From a8cc9205fbc96c35694c90aa7c98d1cba2fa701a Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Tue, 23 Dec 2025 17:49:42 +0000
Subject: [PATCH 6/6] Restore internal/apigen files that were accidentally
deleted
Co-authored-by: bwalsh <47808+bwalsh@users.noreply.github.com>
---
internal/apigen/.openapi-generator-ignore | 23 +
internal/apigen/.openapi-generator/FILES | 53 +
internal/apigen/.openapi-generator/VERSION | 1 +
internal/apigen/Dockerfile | 16 +
internal/apigen/api/openapi.yaml | 3014 +++++++++++++++++
internal/apigen/go.mod | 32 +
internal/apigen/go.sum | 49 +
internal/apigen/go/README.md | 41 +
internal/apigen/go/api_objects.go | 117 +
internal/apigen/go/api_service_info.go | 26 +
internal/apigen/go/api_upload_request.go | 26 +
internal/apigen/go/model_access_method.go | 33 +
.../go/model_access_method_access_url.go | 20 +
.../go/model_access_method_authorizations.go | 25 +
.../go/model_access_method_update_request.go | 20 +
internal/apigen/go/model_access_url.go | 20 +
internal/apigen/go/model_authorizations.go | 25 +
...model_bulk_access_method_update_request.go | 20 +
...ess_method_update_request_updates_inner.go | 20 +
internal/apigen/go/model_bulk_access_url.go | 24 +
.../apigen/go/model_bulk_delete_request.go | 24 +
.../apigen/go/model_bulk_object_access_id.go | 19 +
..._access_id_bulk_object_access_ids_inner.go | 20 +
.../go/model_bulk_object_id_no_passport.go | 18 +
...bulk_update_access_methods_200_response.go | 17 +
internal/apigen/go/model_checksum.go | 20 +
internal/apigen/go/model_contents_object.go | 26 +
internal/apigen/go/model_delete_request.go | 21 +
internal/apigen/go/model_drs_object.go | 57 +
.../apigen/go/model_drs_object_candidate.go | 41 +
internal/apigen/go/model_drs_service.go | 21 +
internal/apigen/go/model_drs_service_drs.go | 68 +
internal/apigen/go/model_drs_service_type.go | 16 +
internal/apigen/go/model_error.go | 21 +
.../model_get_bulk_access_url_200_response.go | 21 +
.../go/model_get_bulk_objects_200_response.go | 21 +
.../go/model_get_bulk_objects_request.go | 20 +
.../go/model_get_service_info_200_response.go | 54 +
.../model_options_bulk_object_200_response.go | 21 +
.../go/model_post_access_url_request.go | 17 +
.../apigen/go/model_post_object_request.go | 20 +
.../go/model_register_objects_201_response.go | 17 +
.../go/model_register_objects_request.go | 20 +
internal/apigen/go/model_service.go | 50 +
.../apigen/go/model_service_organization.go | 21 +
internal/apigen/go/model_service_type.go | 24 +
internal/apigen/go/model_summary.go | 24 +
internal/apigen/go/model_unresolved_inner.go | 18 +
internal/apigen/go/model_upload_method.go | 25 +
.../go/model_upload_method_access_url.go | 20 +
internal/apigen/go/model_upload_request.go | 20 +
.../apigen/go/model_upload_request_object.go | 32 +
internal/apigen/go/model_upload_response.go | 17 +
.../apigen/go/model_upload_response_object.go | 35 +
internal/apigen/go/routers.go | 173 +
internal/apigen/main.go | 30 +
56 files changed, 4694 insertions(+)
create mode 100644 internal/apigen/.openapi-generator-ignore
create mode 100644 internal/apigen/.openapi-generator/FILES
create mode 100644 internal/apigen/.openapi-generator/VERSION
create mode 100644 internal/apigen/Dockerfile
create mode 100644 internal/apigen/api/openapi.yaml
create mode 100644 internal/apigen/go.mod
create mode 100644 internal/apigen/go.sum
create mode 100644 internal/apigen/go/README.md
create mode 100644 internal/apigen/go/api_objects.go
create mode 100644 internal/apigen/go/api_service_info.go
create mode 100644 internal/apigen/go/api_upload_request.go
create mode 100644 internal/apigen/go/model_access_method.go
create mode 100644 internal/apigen/go/model_access_method_access_url.go
create mode 100644 internal/apigen/go/model_access_method_authorizations.go
create mode 100644 internal/apigen/go/model_access_method_update_request.go
create mode 100644 internal/apigen/go/model_access_url.go
create mode 100644 internal/apigen/go/model_authorizations.go
create mode 100644 internal/apigen/go/model_bulk_access_method_update_request.go
create mode 100644 internal/apigen/go/model_bulk_access_method_update_request_updates_inner.go
create mode 100644 internal/apigen/go/model_bulk_access_url.go
create mode 100644 internal/apigen/go/model_bulk_delete_request.go
create mode 100644 internal/apigen/go/model_bulk_object_access_id.go
create mode 100644 internal/apigen/go/model_bulk_object_access_id_bulk_object_access_ids_inner.go
create mode 100644 internal/apigen/go/model_bulk_object_id_no_passport.go
create mode 100644 internal/apigen/go/model_bulk_update_access_methods_200_response.go
create mode 100644 internal/apigen/go/model_checksum.go
create mode 100644 internal/apigen/go/model_contents_object.go
create mode 100644 internal/apigen/go/model_delete_request.go
create mode 100644 internal/apigen/go/model_drs_object.go
create mode 100644 internal/apigen/go/model_drs_object_candidate.go
create mode 100644 internal/apigen/go/model_drs_service.go
create mode 100644 internal/apigen/go/model_drs_service_drs.go
create mode 100644 internal/apigen/go/model_drs_service_type.go
create mode 100644 internal/apigen/go/model_error.go
create mode 100644 internal/apigen/go/model_get_bulk_access_url_200_response.go
create mode 100644 internal/apigen/go/model_get_bulk_objects_200_response.go
create mode 100644 internal/apigen/go/model_get_bulk_objects_request.go
create mode 100644 internal/apigen/go/model_get_service_info_200_response.go
create mode 100644 internal/apigen/go/model_options_bulk_object_200_response.go
create mode 100644 internal/apigen/go/model_post_access_url_request.go
create mode 100644 internal/apigen/go/model_post_object_request.go
create mode 100644 internal/apigen/go/model_register_objects_201_response.go
create mode 100644 internal/apigen/go/model_register_objects_request.go
create mode 100644 internal/apigen/go/model_service.go
create mode 100644 internal/apigen/go/model_service_organization.go
create mode 100644 internal/apigen/go/model_service_type.go
create mode 100644 internal/apigen/go/model_summary.go
create mode 100644 internal/apigen/go/model_unresolved_inner.go
create mode 100644 internal/apigen/go/model_upload_method.go
create mode 100644 internal/apigen/go/model_upload_method_access_url.go
create mode 100644 internal/apigen/go/model_upload_request.go
create mode 100644 internal/apigen/go/model_upload_request_object.go
create mode 100644 internal/apigen/go/model_upload_response.go
create mode 100644 internal/apigen/go/model_upload_response_object.go
create mode 100644 internal/apigen/go/routers.go
create mode 100644 internal/apigen/main.go
diff --git a/internal/apigen/.openapi-generator-ignore b/internal/apigen/.openapi-generator-ignore
new file mode 100644
index 0000000..7484ee5
--- /dev/null
+++ b/internal/apigen/.openapi-generator-ignore
@@ -0,0 +1,23 @@
+# OpenAPI Generator Ignore
+# Generated by openapi-generator https://github.com/openapitools/openapi-generator
+
+# Use this file to prevent files from being overwritten by the generator.
+# The patterns follow closely to .gitignore or .dockerignore.
+
+# As an example, the C# client generator defines ApiClient.cs.
+# You can make changes and tell OpenAPI Generator to ignore just this file by uncommenting the following line:
+#ApiClient.cs
+
+# You can match any string of characters against a directory, file or extension with a single asterisk (*):
+#foo/*/qux
+# The above matches foo/bar/qux and foo/baz/qux, but not foo/bar/baz/qux
+
+# You can recursively match patterns against a directory, file or extension with a double asterisk (**):
+#foo/**/qux
+# This matches foo/bar/qux, foo/baz/qux, and foo/bar/baz/qux
+
+# You can also negate patterns with an exclamation (!).
+# For example, you can ignore all files in a docs folder with the file extension .md:
+#docs/*.md
+# Then explicitly reverse the ignore rule for a single file:
+#!docs/README.md
diff --git a/internal/apigen/.openapi-generator/FILES b/internal/apigen/.openapi-generator/FILES
new file mode 100644
index 0000000..75dd5fd
--- /dev/null
+++ b/internal/apigen/.openapi-generator/FILES
@@ -0,0 +1,53 @@
+.openapi-generator-ignore
+Dockerfile
+api/openapi.yaml
+go.mod
+go/README.md
+go/api_objects.go
+go/api_service_info.go
+go/api_upload_request.go
+go/model_access_method.go
+go/model_access_method_access_url.go
+go/model_access_method_authorizations.go
+go/model_access_method_update_request.go
+go/model_access_url.go
+go/model_authorizations.go
+go/model_bulk_access_method_update_request.go
+go/model_bulk_access_method_update_request_updates_inner.go
+go/model_bulk_access_url.go
+go/model_bulk_delete_request.go
+go/model_bulk_object_access_id.go
+go/model_bulk_object_access_id_bulk_object_access_ids_inner.go
+go/model_bulk_object_id_no_passport.go
+go/model_bulk_update_access_methods_200_response.go
+go/model_checksum.go
+go/model_contents_object.go
+go/model_delete_request.go
+go/model_drs_object.go
+go/model_drs_object_candidate.go
+go/model_drs_service.go
+go/model_drs_service_drs.go
+go/model_drs_service_type.go
+go/model_error.go
+go/model_get_bulk_access_url_200_response.go
+go/model_get_bulk_objects_200_response.go
+go/model_get_bulk_objects_request.go
+go/model_get_service_info_200_response.go
+go/model_options_bulk_object_200_response.go
+go/model_post_access_url_request.go
+go/model_post_object_request.go
+go/model_register_objects_201_response.go
+go/model_register_objects_request.go
+go/model_service.go
+go/model_service_organization.go
+go/model_service_type.go
+go/model_summary.go
+go/model_unresolved_inner.go
+go/model_upload_method.go
+go/model_upload_method_access_url.go
+go/model_upload_request.go
+go/model_upload_request_object.go
+go/model_upload_response.go
+go/model_upload_response_object.go
+go/routers.go
+main.go
diff --git a/internal/apigen/.openapi-generator/VERSION b/internal/apigen/.openapi-generator/VERSION
new file mode 100644
index 0000000..2fb556b
--- /dev/null
+++ b/internal/apigen/.openapi-generator/VERSION
@@ -0,0 +1 @@
+7.18.0-SNAPSHOT
diff --git a/internal/apigen/Dockerfile b/internal/apigen/Dockerfile
new file mode 100644
index 0000000..bde270e
--- /dev/null
+++ b/internal/apigen/Dockerfile
@@ -0,0 +1,16 @@
+FROM golang:1.19 AS build
+WORKDIR /go/src
+COPY go ./go
+COPY main.go .
+COPY go.sum .
+COPY go.mod .
+
+ENV CGO_ENABLED=0
+
+RUN go build -o openapi .
+
+FROM scratch AS runtime
+ENV GIN_MODE=release
+COPY --from=build /go/src/openapi ./
+EXPOSE 8080/tcp
+ENTRYPOINT ["./openapi"]
diff --git a/internal/apigen/api/openapi.yaml b/internal/apigen/api/openapi.yaml
new file mode 100644
index 0000000..3ddbcd4
--- /dev/null
+++ b/internal/apigen/api/openapi.yaml
@@ -0,0 +1,3014 @@
+components:
+ parameters:
+ AccessId:
+ description: An `access_id` from the `access_methods` list of a `DrsObject`
+ in: path
+ name: access_id
+ required: true
+ schema:
+ type: string
+ Checksum:
+ description: A `checksum` value from the `checksums` list of a `DrsObject`
+ in: path
+ name: checksum
+ required: true
+ schema:
+ type: string
+ Expand:
+ description: |-
+ If false and the object_id refers to a bundle, then the ContentsObject array contains only those objects directly contained in the bundle. That is, if the bundle contains other bundles, those other bundles are not recursively included in the result.
+ If true and the object_id refers to a bundle, then the entire set of objects in the bundle is expanded. That is, if the bundle contains other bundles, then those other bundles are recursively expanded and included in the result. Recursion continues through the entire sub-tree of the bundle.
+ If the object_id refers to a blob, then the query parameter is ignored.
+ in: query
+ name: expand
+ schema:
+ type: boolean
+ ObjectId:
+ description: '`DrsObject` identifier'
+ in: path
+ name: object_id
+ required: true
+ schema:
+ type: string
+ requestBodies:
+ AccessMethodUpdateBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AccessMethodUpdateRequest'
+ description: Request body for updating access methods of a DRS object
+ required: true
+ BulkAccessMethodUpdateBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/BulkAccessMethodUpdateRequest'
+ description: Request body for bulk updating access methods of multiple DRS objects
+ required: true
+ BulkDeleteBody:
+ content:
+ application/json:
+ examples:
+ bulk_full_delete:
+ description: Delete both metadata and storage data for multiple objects (requires server support via deleteStorageDataSupported)
+ summary: Bulk delete metadata and storage data
+ value:
+ bulk_object_ids:
+ - drs_object_123456
+ - drs_object_789012
+ delete_storage_data: true
+ passports:
+ - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
+ bulk_metadata_delete:
+ description: Delete multiple DRS objects metadata while preserving underlying storage data (default and safest option)
+ summary: Bulk delete metadata only
+ value:
+ bulk_object_ids:
+ - drs_object_123456
+ - drs_object_789012
+ - drs_object_345678
+ delete_storage_data: false
+ passports:
+ - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
+ bulk_no_auth_delete:
+ description: Bulk delete operation without GA4GH Passport authentication (for public objects or when using Bearer token in headers)
+ summary: Bulk delete without authentication
+ value:
+ bulk_object_ids:
+ - drs_object_123456
+ - drs_object_789012
+ delete_storage_data: false
+ large_bulk_delete:
+ description: Delete many objects in a single request (check maxBulkDeleteLength in service-info for limits)
+ summary: Large bulk delete operation
+ value:
+ bulk_object_ids:
+ - drs_object_001
+ - drs_object_002
+ - drs_object_003
+ - drs_object_004
+ - drs_object_005
+ - drs_object_006
+ - drs_object_007
+ - drs_object_008
+ - drs_object_009
+ - drs_object_010
+ delete_storage_data: false
+ passports:
+ - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
+ minimal_bulk_request:
+ description: Simplest bulk delete request with required fields only
+ summary: Minimal bulk delete request
+ value:
+ bulk_object_ids:
+ - drs_object_123456
+ - drs_object_789012
+ mixed_object_types:
+ description: Delete objects with different ID formats and types in a single request
+ summary: Mixed object types deletion
+ value:
+ bulk_object_ids:
+ - drs://example.org/123456
+ - local_object_789
+ - uuid:550e8400-e29b-41d4-a716-446655440000
+ - compact:prefix:identifier
+ delete_storage_data: false
+ passports:
+ - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
+ schema:
+ $ref: '#/components/schemas/BulkDeleteRequest'
+ required: true
+ BulkObjectBody:
+ content:
+ application/json:
+ examples:
+ bulk_retrieve:
+ description: Retrieve metadata for multiple existing DRS objects using their IDs
+ summary: Bulk retrieve objects
+ value:
+ bulk_object_ids:
+ - drs_object_123456
+ - drs_object_789012
+ - drs_object_345678
+ passports:
+ - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
+ bulk_retrieve_no_auth:
+ description: Retrieve metadata for public DRS objects
+ summary: Bulk retrieve without authentication
+ value:
+ bulk_object_ids:
+ - drs_object_public_123
+ - drs_object_public_456
+ schema:
+ $ref: '#/components/schemas/GetBulkObjects_request'
+ required: true
+ DeleteBody:
+ content:
+ application/json:
+ examples:
+ full_delete:
+ description: Delete both DRS object metadata and underlying storage data (requires server support via deleteStorageDataSupported)
+ summary: Delete metadata and storage data
+ value:
+ delete_storage_data: true
+ passports:
+ - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
+ metadata_only_delete:
+ description: Delete DRS object metadata while preserving underlying storage data. This is the default and safest option.
+ summary: Delete metadata only (default)
+ value:
+ delete_storage_data: false
+ passports:
+ - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
+ minimal_request:
+ description: Simplest delete request with no authentication and default behavior (metadata only)
+ summary: Minimal delete request
+ value: {}
+ multiple_passports:
+ description: Delete request with multiple GA4GH Passports for complex authorization scenarios
+ summary: Multiple GA4GH Passports
+ value:
+ delete_storage_data: false
+ passports:
+ - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
+ - eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.AbCdEfGhIjKlMnOpQrStUvWxYz
+ no_auth_delete:
+ description: Delete operation without GA4GH Passport authentication (for public objects or when using Bearer token in headers)
+ summary: Delete without authentication
+ value:
+ delete_storage_data: false
+ update_workflow:
+ description: Delete metadata only to enable safe update pattern (delete metadata, then re-register with new metadata)
+ summary: Safe update workflow
+ value:
+ delete_storage_data: false
+ passports:
+ - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
+ schema:
+ $ref: '#/components/schemas/DeleteRequest'
+ required: false
+ Passports:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/PostAccessURL_request'
+ required: true
+ PostObjectBody:
+ content:
+ application/json:
+ examples:
+ retrieve_expanded_bundle:
+ description: Request expanded bundle contents with passport authentication
+ summary: Retrieve expanded bundle with authentication
+ value:
+ expand: true
+ passports:
+ - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
+ - eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.additional_passport_signature
+ retrieve_with_auth:
+ description: Request object metadata with passport authentication
+ summary: Retrieve object with authentication
+ value:
+ expand: false
+ passports:
+ - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
+ schema:
+ $ref: '#/components/schemas/PostObject_request'
+ required: true
+ RegisterObjectsBody:
+ content:
+ application/json:
+ examples:
+ bulk_object_registration:
+ description: Register multiple DRS objects in a single request
+ summary: Register multiple objects
+ value:
+ candidates:
+ - access_methods:
+ - access_url:
+ url: s3://genomics-bucket/assemblies/hg38.fasta
+ type: s3
+ checksums:
+ - checksum: a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
+ type: sha-256
+ description: Human genome reference assembly
+ mime_type: text/plain
+ name: genome_assembly.fasta
+ size: 3221225472
+ - access_methods:
+ - access_url:
+ url: https://data.example.org/files/annotations.gff3
+ type: https
+ checksums:
+ - checksum: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
+ type: sha-256
+ description: Gene annotations in GFF3 format
+ mime_type: text/plain
+ name: annotations.gff3
+ size: 524288000
+ single_object_registration:
+ description: Register one DRS object after upload
+ summary: Register a single object
+ value:
+ candidates:
+ - access_methods:
+ - access_url:
+ url: s3://my-bucket/uploads/sample_data.vcf
+ type: s3
+ checksums:
+ - checksum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ type: sha-256
+ description: Variant call format file for sample analysis
+ mime_type: text/plain
+ name: sample_data.vcf
+ size: 1048576
+ passports:
+ - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
+ schema:
+ $ref: '#/components/schemas/RegisterObjects_request'
+ description: Request body for registering DRS objects after upload
+ required: true
+ UploadRequestBody:
+ content:
+ application/json:
+ examples:
+ multiple_files:
+ description: Request upload methods for multiple files with different types
+ summary: Multiple files upload request
+ value:
+ requests:
+ - aliases:
+ - hg38_reference
+ checksums:
+ - checksum: a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
+ type: sha-256
+ - checksum: 098f6bcd4621d373cade4e832627b4f6
+ type: md5
+ description: Human genome reference assembly
+ mime_type: text/plain
+ name: genome_assembly.fasta
+ size: 3221225472
+ - checksums:
+ - checksum: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
+ type: sha-256
+ description: Gene annotations in GFF3 format
+ mime_type: text/plain
+ name: annotations.gff3
+ size: 524288000
+ - checksums:
+ - checksum: c89e4c5c7f2c8c8e8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c8c
+ type: sha-256
+ description: Sample metadata and experimental conditions
+ mime_type: application/json
+ name: metadata.json
+ size: 2048
+ no_passports:
+ description: Request for public upload endpoints that don't require authentication
+ summary: Upload request without authentication
+ value:
+ requests:
+ - checksums:
+ - checksum: d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35
+ type: sha-256
+ description: Public research dataset
+ mime_type: text/csv
+ name: public_dataset.csv
+ size: 10240
+ single_file:
+ description: Request upload methods for a single file
+ summary: Single file upload request
+ value:
+ passports:
+ - eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJnYTRnaF9wYXNzcG9ydF92MSI6W119.JJ5rN0ktP0qwyZmIPpxmF_p7JsxAZH6L6brUxtad3CM
+ requests:
+ - aliases:
+ - sample_001_variants
+ - vcf_batch_2024
+ checksums:
+ - checksum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ type: sha-256
+ description: Variant call format file for sample analysis
+ mime_type: text/plain
+ name: sample_data.vcf
+ size: 1048576
+ schema:
+ $ref: '#/components/schemas/UploadRequest'
+ required: true
+ responses:
+ 200AccessMethodUpdate:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DrsObject'
+ description: Access methods successfully updated. Returns the updated DRS object with new access methods and updated timestamp.
+ 200BulkAccessMethodUpdate:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/bulkUpdateAccessMethods_200_response'
+ description: Access methods successfully updated for all objects. Returns updated DRS objects with new access methods and updated timestamps.
+ 200OkAccess:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AccessURL'
+ description: The `AccessURL` was found successfully
+ 200OkAccesses:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GetBulkAccessURL_200_response'
+ description: The `AccessURL` was found successfully
+ 200OkAuthorizations:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Authorizations'
+ description: '`Authorizations` were found successfully'
+ 200OkBulkAuthorizations:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/OptionsBulkObject_200_response'
+ description: '`Authorizations` were found successfully'
+ 200OkDrsObject:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DrsObject'
+ description: The `DrsObject` was found successfully
+ 200OkDrsObjects:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GetBulkObjects_200_response'
+ description: The `DrsObjects` were found successfully
+ 200ServiceInfo:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GetServiceInfo_200_response'
+ description: Retrieve info about the DRS service
+ 200UploadRequest:
+ content:
+ application/json:
+ examples:
+ https_upload:
+ description: Response with HTTPS presigned POST URL for direct upload
+ summary: HTTPS upload method response
+ value:
+ responses:
+ - aliases:
+ - hg38_reference
+ checksums:
+ - checksum: a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
+ type: sha-256
+ - checksum: 098f6bcd4621d373cade4e832627b4f6
+ type: md5
+ description: Human genome reference assembly
+ mime_type: text/plain
+ name: genome_assembly.fasta
+ size: 3221225472
+ upload_methods:
+ - access_url:
+ url: https://upload.example.org/v1/files/drs_object_789012
+ type: https
+ upload_details:
+ post_url: https://upload.example.org/v1/files/drs_object_789012?signature=abc123
+ multiple_methods:
+ description: Response offering multiple upload method options for flexibility
+ summary: Multiple upload methods response
+ value:
+ responses:
+ - checksums:
+ - checksum: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
+ type: sha-256
+ description: Gene annotations in GFF3 format
+ mime_type: text/plain
+ name: annotations.gff3
+ size: 524288000
+ upload_methods:
+ - access_url:
+ url: https://genomics-bucket.s3.us-west-2.amazonaws.com/uploads/drs_object_345678
+ region: us-west-2
+ type: s3
+ upload_details:
+ access_key_id: AKIAI44QH8DHBEXAMPLE
+ bucket: genomics-bucket
+ expires_at: 2024-01-01T12:00:00Z
+ key: uploads/drs_object_345678
+ secret_access_key: je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
+ session_token: temporary_session_token_here
+ - access_url:
+ url: https://upload-api.example.org/files/drs_object_345678
+ type: https
+ upload_details:
+ post_url: https://upload-api.example.org/files/drs_object_345678?token=upload_token_12345
+ - access_url:
+ url: https://storage.googleapis.com/genomics-uploads/drs_object_345678
+ region: us-central1
+ type: gs
+ upload_details:
+ access_token: ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg
+ bucket: genomics-uploads
+ expires_at: 2024-01-01T12:00:00Z
+ key: drs_object_345678
+ s3_upload:
+ description: Response with S3 upload method and temporary credentials
+ summary: S3 upload method response
+ value:
+ responses:
+ - aliases:
+ - sample_001_variants
+ - vcf_batch_2024
+ checksums:
+ - checksum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ type: sha-256
+ description: Variant call format file for sample analysis
+ mime_type: text/plain
+ name: sample_data.vcf
+ size: 1048576
+ upload_methods:
+ - access_url:
+ url: https://my-bucket.s3.amazonaws.com/uploads/drs_object_123456
+ region: us-east-1
+ type: s3
+ upload_details:
+ access_key_id: AKIAIOSFODNN7EXAMPLE
+ bucket: my-bucket
+ expires_at: 2024-01-01T12:00:00Z
+ key: uploads/drs_object_123456
+ secret_access_key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
+ session_token: AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE
+ schema:
+ $ref: '#/components/schemas/UploadResponse'
+ description: Upload request processed successfully. Returns upload methods and temporary credentials for the requested files.
+ 201ObjectsCreated:
+ content:
+ application/json:
+ examples:
+ multiple_objects_created:
+ description: Response after registering multiple DRS objects
+ summary: Multiple objects registered
+ value:
+ objects:
+ - access_methods:
+ - access_url:
+ url: s3://genomics-bucket/assemblies/hg38.fasta
+ type: s3
+ checksums:
+ - checksum: a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
+ type: sha-256
+ created_time: 2024-01-15T09:00:00Z
+ description: Human genome reference assembly
+ id: drs_obj_a1b2c3d4e5f6
+ mime_type: text/plain
+ name: genome_assembly.fasta
+ self_uri: drs://drs.example.org/drs_obj_a1b2c3d4e5f6
+ size: 3221225472
+ updated_time: 2024-01-15T09:00:00Z
+ version: "1.0"
+ - access_methods:
+ - access_url:
+ url: https://data.example.org/files/annotations.gff3
+ type: https
+ checksums:
+ - checksum: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
+ type: sha-256
+ created_time: 2024-01-15T09:15:00Z
+ description: Gene annotations in GFF3 format
+ id: drs_obj_f6e5d4c3b2a1
+ mime_type: text/plain
+ name: annotations.gff3
+ self_uri: drs://drs.example.org/drs_obj_f6e5d4c3b2a1
+ size: 524288000
+ updated_time: 2024-01-15T09:15:00Z
+ version: "1.0"
+ single_object_created:
+ description: Response after registering one DRS object
+ summary: Single object registered
+ value:
+ objects:
+ - access_methods:
+ - access_url:
+ url: s3://my-bucket/uploads/sample_data.vcf
+ type: s3
+ checksums:
+ - checksum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ type: sha-256
+ created_time: 2024-01-15T10:30:00Z
+ description: Variant call format file for sample analysis
+ id: drs_obj_a1b2c3d4e5f6
+ mime_type: text/plain
+ name: sample_data.vcf
+ self_uri: drs://drs.example.org/drs_obj_a1b2c3d4e5f6
+ size: 1048576
+ updated_time: 2024-01-15T10:30:00Z
+ version: "1.0"
+ schema:
+ $ref: '#/components/schemas/RegisterObjects_201_response'
+ description: DRS objects were successfully registered as an atomic transaction. Returns the complete DRS objects with server-minted IDs and timestamps. All candidate objects were validated and registered together - if any had failed, none would have been registered.
+ 202Accepted:
+ description: |
+ The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
+ headers:
+ Retry-After:
+ description: |
+ Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
+ schema:
+ format: int64
+ type: integer
+ 204DeleteSuccess:
+ description: All DRS objects were successfully deleted. For bulk operations, this indicates that the entire atomic transaction completed successfully - all requested objects have been deleted. Storage data deletion (if requested) was attempted but success is not guaranteed.
+ 400BadRequest:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is malformed.
+ 400BadRequestDelete:
+ content:
+ application/json:
+ examples:
+ empty_object_list:
+ description: Bulk delete request with empty object ID array
+ summary: Empty object ID list
+ value:
+ msg: bulk_object_ids cannot be empty
+ status_code: 400
+ invalid_request_format:
+ description: Request body contains invalid JSON or missing required fields
+ summary: Malformed request body
+ value:
+ msg: 'Invalid request body: bulk_object_ids is required for bulk delete operations'
+ status_code: 400
+ unsupported_storage_deletion:
+ description: Client requested storage data deletion but server doesn't support it
+ summary: Storage data deletion not supported
+ value:
+ msg: Server does not support storage data deletion. Set delete_storage_data to false or omit the parameter.
+ status_code: 400
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: 'The delete request is malformed or contains unsupported parameters (e.g., delete_storage_data: true when server doesn''t support storage data deletion).'
+ 401Unauthorized:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is unauthorized.
+ 403Forbidden:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requester is not authorized to perform this action.
+ 403ForbiddenDelete:
+ content:
+ application/json:
+ examples:
+ insufficient_permissions:
+ description: Client lacks permission to delete the specified object
+ summary: Insufficient delete permissions
+ value:
+ msg: Client lacks delete permission for object drs_object_123456
+ status_code: 403
+ invalid_passport:
+ description: Provided GA4GH Passport is invalid or expired
+ summary: Invalid GA4GH Passport
+ value:
+ msg: Invalid or expired GA4GH Passport provided
+ status_code: 403
+ missing_visa:
+ description: GA4GH Passport lacks required visa for delete operation
+ summary: Missing required visa
+ value:
+ msg: GA4GH Passport does not contain required visa for delete operation on this object
+ status_code: 403
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The client is not authorized to delete the requested DRS object.
+ 404NotFoundAccess:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested `AccessURL` wasn't found.
+ 404NotFoundDelete:
+ content:
+ application/json:
+ examples:
+ delete_not_supported:
+ description: This server does not support delete operations
+ summary: Delete operations not supported
+ value:
+ msg: Delete operations are not supported by this server
+ status_code: 404
+ endpoint_not_found:
+ description: Delete endpoints are not implemented on this server
+ summary: Delete endpoint not available
+ value:
+ msg: The requested endpoint /objects/delete is not available on this server
+ status_code: 404
+ object_not_found:
+ description: The specified DRS object does not exist
+ summary: DRS object not found
+ value:
+ msg: DRS object drs_object_123456 does not exist
+ status_code: 404
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested DRS object for deletion wasn't found, or delete endpoints are not supported by this server.
+ 404NotFoundDrsObject:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested `DrsObject` wasn't found.
+ 413RequestTooLarge:
+ content:
+ application/json:
+ examples:
+ bulk_limit_exceeded:
+ description: Request contains more objects than server's maximum bulk delete limit
+ summary: Bulk delete limit exceeded
+ value:
+ msg: Bulk delete request contains 150 objects but server maximum is 100. Check maxBulkDeleteLength in service-info.
+ status_code: 413
+ request_size_too_large:
+ description: The overall request payload exceeds server limits
+ summary: Request payload too large
+ value:
+ msg: Request payload size exceeds server limit of 1MB
+ status_code: 413
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The bulk request is too large.
+ 500InternalServerError:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ AuthorizationsNotSupported:
+ description: '`Authorizations` are not supported for this object. Default to `None`.'
+ schemas:
+ AccessMethod:
+ properties:
+ access_id:
+ description: An arbitrary string to be passed to the `/access` method to get an `AccessURL`. This string must be unique within the scope of a single object. Note that at least one of `access_url` and `access_id` must be provided.
+ type: string
+ access_url:
+ $ref: '#/components/schemas/AccessMethod_access_url'
+ authorizations:
+ $ref: '#/components/schemas/AccessMethod_authorizations'
+ available:
+ description: Availablity of file in the cloud. This label defines if this file is immediately accessible via DRS. Any delay or requirement of thawing mechanism if the file is in offline/archival storage is classified as false, meaning it is unavailable.
+ type: boolean
+ cloud:
+ description: Name of the cloud service provider that the object belongs to. If the cloud service is Amazon Web Services, Google Cloud Platform or Azure the values should be `aws`, `gcp`, or `azure` respectively.
+ type: string
+ region:
+ description: Name of the region in the cloud service provider that the object belongs to.
+ type: string
+ type:
+ description: Type of the access method.
+ enum:
+ - s3
+ - gs
+ - ftp
+ - gsiftp
+ - globus
+ - htsget
+ - https
+ - file
+ type: string
+ required:
+ - type
+ type: object
+ AccessMethod_access_url:
+ allOf:
+ - $ref: '#/components/schemas/AccessURL'
+ - description: An `AccessURL` that can be used to fetch the actual object bytes. Note that at least one of `access_url` and `access_id` must be provided.
+ type: object
+ AccessMethod_authorizations:
+ allOf:
+ - $ref: '#/components/schemas/Authorizations'
+ - description: When `access_id` is provided, `authorizations` provides information about how to authorize the `/access` method.
+ type: object
+ AccessMethodUpdateRequest:
+ properties:
+ access_methods:
+ description: New access methods for the DRS object
+ items:
+ $ref: '#/components/schemas/AccessMethod'
+ minItems: 1
+ type: array
+ passports:
+ description: Optional GA4GH Passport JWTs for authorization
+ items:
+ type: string
+ type: array
+ required:
+ - access_methods
+ type: object
+ AccessURL:
+ properties:
+ headers:
+ description: An optional list of headers to include in the HTTP request to `url`. These headers can be used to provide auth tokens required to fetch the object bytes.
+ items:
+ type: string
+ type: array
+ url:
+ description: A fully resolvable URL that can be used to fetch the actual object bytes.
+ type: string
+ required:
+ - url
+ type: object
+ Authorizations:
+ properties:
+ bearer_auth_issuers:
+ description: If authorizations contain `BearerAuth` this is an optional list of issuers that may authorize access to this object. The caller must provide a token from one of these issuers. If this is empty or missing it assumed the caller knows which token to send via other means. It is strongly recommended that the caller validate that it is appropriate to send the requested token to the DRS server to mitigate attacks by malicious DRS servers requesting credentials they should not have.
+ items:
+ type: string
+ type: array
+ drs_object_id:
+ type: string
+ passport_auth_issuers:
+ description: If authorizations contain `PassportAuth` this is a required list of visa issuers (as found in a visa's `iss` claim) that may authorize access to this object. The caller must only provide passports that contain visas from this list. It is strongly recommended that the caller validate that it is appropriate to send the requested passport/visa to the DRS server to mitigate attacks by malicious DRS servers requesting credentials they should not have.
+ items:
+ type: string
+ type: array
+ supported_types:
+ description: An Optional list of support authorization types. More than one can be supported and tried in sequence. Defaults to `None` if empty or missing.
+ items:
+ enum:
+ - None
+ - BasicAuth
+ - BearerAuth
+ - PassportAuth
+ type: string
+ type: array
+ type: object
+ BulkAccessMethodUpdateRequest:
+ properties:
+ passports:
+ description: Optional GA4GH Passport JWTs for authorization
+ items:
+ type: string
+ type: array
+ updates:
+ description: Array of access method updates to perform
+ items:
+ $ref: '#/components/schemas/BulkAccessMethodUpdateRequest_updates_inner'
+ minItems: 1
+ type: array
+ required:
+ - updates
+ type: object
+ BulkAccessMethodUpdateRequest_updates_inner:
+ properties:
+ access_methods:
+ description: New access methods for this object
+ items:
+ $ref: '#/components/schemas/AccessMethod'
+ minItems: 1
+ type: array
+ object_id:
+ description: DRS object ID to update
+ type: string
+ required:
+ - access_methods
+ - object_id
+ type: object
+ BulkAccessURL:
+ properties:
+ drs_access_id:
+ type: string
+ drs_object_id:
+ type: string
+ headers:
+ description: An optional list of headers to include in the HTTP request to `url`. These headers can be used to provide auth tokens required to fetch the object bytes.
+ items:
+ type: string
+ type: array
+ url:
+ description: A fully resolvable URL that can be used to fetch the actual object bytes.
+ type: string
+ required:
+ - url
+ type: object
+ BulkDeleteRequest:
+ description: Request body for bulk delete operations
+ properties:
+ bulk_object_ids:
+ description: Array of DRS object IDs to delete
+ items:
+ type: string
+ type: array
+ delete_storage_data:
+ default: false
+ description: If true, delete both DRS object metadata and underlying storage data (follows server's deleteStorageDataSupported capability). If false (default), only delete DRS object metadata while preserving underlying storage data. Clients must explicitly set this to true to enable storage data deletion, ensuring intentional choice for this potentially destructive operation.
+ type: boolean
+ passports:
+ description: the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
+ items:
+ type: string
+ type: array
+ required:
+ - bulk_object_ids
+ type: object
+ BulkObjectAccessId:
+ description: The object that contains object_id/access_id tuples
+ properties:
+ bulk_object_access_ids:
+ items:
+ $ref: '#/components/schemas/BulkObjectAccessId_bulk_object_access_ids_inner'
+ type: array
+ passports:
+ items:
+ type: string
+ type: array
+ type: object
+ BulkObjectAccessId_bulk_object_access_ids_inner:
+ properties:
+ bulk_access_ids:
+ description: DRS object access ID
+ items:
+ type: string
+ type: array
+ bulk_object_id:
+ description: DRS object ID
+ type: string
+ type: object
+ BulkObjectIdNoPassport:
+ description: The object that contains the DRS object IDs array
+ properties:
+ bulk_object_ids:
+ description: An array of ObjectIDs.
+ items:
+ type: string
+ type: array
+ type: object
+ Checksum:
+ properties:
+ checksum:
+ description: The hex-string encoded checksum for the data
+ type: string
+ type:
+ description: |-
+ The digest method used to create the checksum.
+ The value (e.g. `sha-256`) SHOULD be listed as `Hash Name String` in the https://www.iana.org/assignments/named-information/named-information.xhtml#hash-alg[IANA Named Information Hash Algorithm Registry]. Other values MAY be used, as long as implementors are aware of the issues discussed in https://tools.ietf.org/html/rfc6920#section-9.4[RFC6920].
+ GA4GH may provide more explicit guidance for use of non-IANA-registered algorithms in the future. Until then, if implementers do choose such an algorithm (e.g. because it's implemented by their storage provider), they SHOULD use an existing standard `type` value such as `md5`, `etag`, `crc32c`, `trunc512`, or `sha1`.
+ type: string
+ required:
+ - checksum
+ - type
+ type: object
+ ContentsObject:
+ properties:
+ contents:
+ description: If this ContentsObject describes a nested bundle and the caller specified "?expand=true" on the request, then this contents array must be present and describe the objects within the nested bundle.
+ items:
+ $ref: '#/components/schemas/ContentsObject'
+ type: array
+ drs_uri:
+ description: A list of full DRS identifier URI paths that may be used to obtain the object. These URIs may be external to this DRS instance.
+ items:
+ type: string
+ type: array
+ id:
+ description: A DRS identifier of a `DrsObject` (either a single blob or a nested bundle). If this ContentsObject is an object within a nested bundle, then the id is optional. Otherwise, the id is required.
+ type: string
+ name:
+ description: A name declared by the bundle author that must be used when materialising this object, overriding any name directly associated with the object itself. The name must be unique within the containing bundle. This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].
+ type: string
+ required:
+ - name
+ type: object
+ DeleteRequest:
+ description: Request body for single object delete operations
+ properties:
+ delete_storage_data:
+ default: false
+ description: If true, delete both DRS object metadata and underlying storage data (follows server's deleteStorageDataSupported capability). If false (default), only delete DRS object metadata while preserving underlying storage data. Clients must explicitly set this to true to enable storage data deletion, ensuring intentional choice for this potentially destructive operation.
+ type: boolean
+ passports:
+ description: the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
+ items:
+ type: string
+ type: array
+ type: object
+ DrsObject:
+ properties:
+ access_methods:
+ description: |-
+ The list of access methods that can be used to fetch the `DrsObject`.
+ Required for single blobs; optional for bundles.
+ items:
+ $ref: '#/components/schemas/AccessMethod'
+ minItems: 1
+ type: array
+ aliases:
+ description: A list of strings that can be used to find other metadata about this `DrsObject` from external metadata sources. These aliases can be used to represent secondary accession numbers or external GUIDs.
+ items:
+ type: string
+ type: array
+ checksums:
+ description: |-
+ The checksum of the `DrsObject`. At least one checksum must be provided.
+ For blobs, the checksum is computed over the bytes in the blob.
+ For bundles, the checksum is computed over a sorted concatenation of the checksums of its top-level contained objects (not recursive, names not included). The list of checksums is sorted alphabetically (hex-code) before concatenation and a further checksum is performed on the concatenated checksum value.
+ For example, if a bundle contains blobs with the following checksums:
+ md5(blob1) = 72794b6d
+ md5(blob2) = 5e089d29
+ Then the checksum of the bundle is:
+ md5( concat( sort( md5(blob1), md5(blob2) ) ) )
+ = md5( concat( sort( 72794b6d, 5e089d29 ) ) )
+ = md5( concat( 5e089d29, 72794b6d ) )
+ = md5( 5e089d2972794b6d )
+ = f7a29a04
+ items:
+ $ref: '#/components/schemas/Checksum'
+ minItems: 1
+ type: array
+ contents:
+ description: |-
+ If not set, this `DrsObject` is a single blob.
+ If set, this `DrsObject` is a bundle containing the listed `ContentsObject` s (some of which may be further nested).
+ items:
+ $ref: '#/components/schemas/ContentsObject'
+ type: array
+ created_time:
+ description: |-
+ Timestamp of content creation in RFC3339.
+ (This is the creation time of the underlying content, not of the JSON object.)
+ format: date-time
+ type: string
+ description:
+ description: A human readable description of the `DrsObject`.
+ type: string
+ id:
+ description: An identifier unique to this `DrsObject`
+ type: string
+ mime_type:
+ description: A string providing the mime-type of the `DrsObject`.
+ type: string
+ name:
+ description: |-
+ A string that can be used to name a `DrsObject`.
+ This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].
+ type: string
+ self_uri:
+ description: |-
+ A drs:// hostname-based URI, as defined in the DRS documentation, that tells clients how to access this object.
+ The intent of this field is to make DRS objects self-contained, and therefore easier for clients to store and pass around. For example, if you arrive at this DRS JSON by resolving a compact identifier-based DRS URI, the `self_uri` presents you with a hostname and properly encoded DRS ID for use in subsequent `access` endpoint calls.
+ type: string
+ size:
+ description: |-
+ For blobs, the blob size in bytes.
+ For bundles, the cumulative size, in bytes, of items in the `contents` field.
+ format: int64
+ type: integer
+ updated_time:
+ description: Timestamp of content update in RFC3339, identical to `created_time` in systems that do not support updates. (This is the update time of the underlying content, not of the JSON object.)
+ format: date-time
+ type: string
+ version:
+ description: |-
+ A string representing a version.
+ (Some systems may use checksum, a RFC3339 timestamp, or an incrementing version number.)
+ type: string
+ required:
+ - checksums
+ - created_time
+ - id
+ - self_uri
+ - size
+ type: object
+ DrsObjectCandidate:
+ properties:
+ access_methods:
+ description: |-
+ The list of access methods that can be used to fetch the `DrsObject`.
+ Required for single blobs; optional for bundles.
+ items:
+ $ref: '#/components/schemas/AccessMethod'
+ minItems: 1
+ type: array
+ aliases:
+ description: A list of strings that can be used to find other metadata about this `DrsObject` from external metadata sources. These aliases can be used to represent secondary accession numbers or external GUIDs.
+ items:
+ type: string
+ type: array
+ checksums:
+ description: |-
+ The checksum of the `DrsObject`. At least one checksum must be provided.
+ For blobs, the checksum is computed over the bytes in the blob.
+ For bundles, the checksum is computed over a sorted concatenation of the checksums of its top-level contained objects (not recursive, names not included). The list of checksums is sorted alphabetically (hex-code) before concatenation and a further checksum is performed on the concatenated checksum value.
+ For example, if a bundle contains blobs with the following checksums:
+ md5(blob1) = 72794b6d
+ md5(blob2) = 5e089d29
+ Then the checksum of the bundle is:
+ md5( concat( sort( md5(blob1), md5(blob2) ) ) )
+ = md5( concat( sort( 72794b6d, 5e089d29 ) ) )
+ = md5( concat( 5e089d29, 72794b6d ) )
+ = md5( 5e089d2972794b6d )
+ = f7a29a04
+ items:
+ $ref: '#/components/schemas/Checksum'
+ minItems: 1
+ type: array
+ contents:
+ description: |-
+ If not set, this `DrsObject` is a single blob.
+ If set, this `DrsObject` is a bundle containing the listed `ContentsObject` s (some of which may be further nested).
+ items:
+ $ref: '#/components/schemas/ContentsObject'
+ type: array
+ description:
+ description: A human readable description of the `DrsObject`.
+ type: string
+ mime_type:
+ description: A string providing the mime-type of the `DrsObject`.
+ type: string
+ name:
+ description: |-
+ A string that can be used to name a `DrsObject`.
+ This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].
+ type: string
+ size:
+ description: |-
+ For blobs, the blob size in bytes.
+ For bundles, the cumulative size, in bytes, of items in the `contents` field.
+ format: int64
+ type: integer
+ version:
+ description: |-
+ A string representing a version.
+ (Some systems may use checksum, a RFC3339 timestamp, or an incrementing version number.)
+ type: string
+ required:
+ - checksums
+ - size
+ type: object
+ DrsService:
+ properties:
+ drs:
+ $ref: '#/components/schemas/DrsService_drs'
+ maxBulkRequestLength:
+ description: DEPRECATED - In 2.0 this will move to under the drs section of service info and not at the root level. The max length the bulk request endpoints can handle (>= 1) before generating a 413 error e.g. how long can the arrays bulk_object_ids and bulk_object_access_ids be for this server.
+ type: integer
+ type:
+ $ref: '#/components/schemas/DrsService_type'
+ required:
+ - maxBulkRequestLength
+ - type
+ type: object
+ DrsService_drs:
+ properties:
+ accessMethodUpdateSupported:
+ default: false
+ description: Indicates whether this DRS server supports updating access methods for existing objects. If true, clients can update access methods using `/objects/{object_id}/access-methods` and `/objects/access-methods` endpoints. If false or missing, the server does not support access method updates.
+ type: boolean
+ deleteStorageDataSupported:
+ default: false
+ description: 'Indicates whether this DRS server supports attempting to delete underlying storage data when clients request it. If true, the server will attempt to delete both metadata and storage files when `delete_storage_data: true` is specified in delete requests. If false or missing, the server only supports metadata deletion regardless of client request, preserving underlying storage data. Only present when deleteSupported is true. This is a capability flag indicating what the server can attempt, not a default behavior setting. Note: Storage deletion attempts may fail due to permissions, network issues, or storage service errors.'
+ type: boolean
+ deleteSupported:
+ default: false
+ description: Indicates whether this DRS server supports delete operations via the delete endpoints. If true, clients can delete DRS objects using POST requests to `/objects/{object_id}/delete` and `/objects/delete`. If false or missing, the server does not support delete operations and will return 404 for delete endpoint requests. Like upload functionality, delete support is entirely optional and servers remain DRS compliant without it.
+ type: boolean
+ maxBulkAccessMethodUpdateLength:
+ description: Maximum number of objects that can be updated in a single bulk access method update request. Only present when accessMethodUpdateSupported is true. If not specified, defaults to maxBulkRequestLength.
+ type: integer
+ maxBulkDeleteLength:
+ description: Maximum number of objects that can be deleted in a single bulk delete request via `/objects/delete`. Only present when deleteSupported is true. If not specified when delete is supported, defaults to the same value as maxBulkRequestLength. Servers may enforce lower limits for delete operations compared to other bulk operations for safety reasons.
+ type: integer
+ maxBulkRequestLength:
+ description: The max length the bulk request endpoints can handle (>= 1) before generating a 413 error e.g. how long can the arrays bulk_object_ids and bulk_object_access_ids be for this server.
+ type: integer
+ maxRegisterRequestLength:
+ description: Maximum number of candidate objects that can be included in a single registration request. Only present when objectRegistrationSupported is true. If not specified, defaults to the same value as maxBulkRequestLength.
+ type: integer
+ maxUploadRequestLength:
+ description: Maximum number of files that can be included in a single upload request. Only present when uploadRequestSupported is true. If not specified, defaults to the same value as maxBulkRequestLength.
+ type: integer
+ maxUploadSize:
+ description: Maximum file size in bytes that can be uploaded via the upload endpoints. Only present when uploadRequestSupported is true. If not specified, there is no explicit size limit.
+ format: int64
+ type: integer
+ objectCount:
+ description: The total number of objects in this DRS service.
+ type: integer
+ objectRegistrationSupported:
+ default: false
+ description: Indicates whether this DRS server supports object registration operations via the `/objects/register` endpoint. If true, clients can register uploaded files or existing data as DRS objects. If false or missing, the server does not support object registration.
+ type: boolean
+ relatedFileStorageSupported:
+ default: false
+ description: Indicates whether this DRS server supports storing files from the same upload request under a common prefix or folder structure. If true, the server will organize related files together in storage, enabling bioinformatics workflows that expect co-located files (e.g., CRAM + CRAI, VCF + TBI). If false or missing, the server may distribute files across different storage locations or prefixes. Only present when uploadRequestSupported is true. This feature is particularly valuable for genomics tools like samtools that expect index files to be co-located with data files.
+ type: boolean
+ supportedUploadMethods:
+ description: |-
+ List of upload methods supported by this DRS server. Only present when uploadRequestSupported is true. Clients can use this information to determine which upload methods are available before making upload requests.
+ - **s3**: Direct S3 upload with temporary AWS credentials - **gs**: Google Cloud Storage upload with access tokens - **https**: Presigned POST URL for HTTP uploads - **ftp**: File Transfer Protocol uploads - **sftp**: Secure File Transfer Protocol uploads - **gsiftp**: GridFTP secure file transfer - **globus**: Globus transfer service for high-performance data movement
+ items:
+ enum:
+ - s3
+ - gs
+ - https
+ - ftp
+ - sftp
+ type: string
+ type: array
+ totalObjectSize:
+ description: The total size of all objects in this DRS service in bytes. As a general best practice, file bytes are counted for each unique file and not cloud mirrors or other redundant copies.
+ type: integer
+ uploadRequestSupported:
+ default: false
+ description: Indicates whether this DRS server supports upload request operations via the `/upload-request` endpoint. If true, clients can request upload methods and credentials for uploading files. If false or missing, the server does not support upload request coordination.
+ type: boolean
+ validateAccessMethodUpdates:
+ default: false
+ description: Indicates whether this DRS server validates new access methods by verifying they point to the same data. If true, the server will attempt to verify checksums/content before updating access methods. If false or missing, the server trusts client-provided access methods without validation. Only present when accessMethodUpdateSupported is true.
+ type: boolean
+ validateUploadChecksums:
+ default: false
+ description: Indicates whether this DRS server validates uploaded file checksums against the provided metadata. If true, the server will verify that uploaded files match their declared checksums and may reject uploads with mismatches. If false or missing, the server does not perform checksum validation and relies on client-provided metadata. Only present when uploadRequestSupported or objectRegistrationSupported is true.
+ type: boolean
+ validateUploadFileSizes:
+ default: false
+ description: Indicates whether this DRS server validates uploaded file sizes against the provided metadata. If true, the server will verify that uploaded files match their declared sizes and may reject uploads with mismatches. If false or missing, the server does not perform file size validation and relies on client-provided metadata. Only present when uploadRequestSupported or objectRegistrationSupported is true.
+ type: boolean
+ required:
+ - maxBulkRequestLength
+ type: object
+ DrsService_type:
+ properties:
+ artifact:
+ enum:
+ - drs
+ type: string
+ required:
+ - artifact
+ type: object
+ Error:
+ description: An object that can optionally include information about the error.
+ properties:
+ msg:
+ description: A detailed error message.
+ type: string
+ status_code:
+ description: The integer representing the HTTP status code (e.g. 200, 404).
+ type: integer
+ type: object
+ GetBulkAccessURL_200_response:
+ properties:
+ resolved_drs_object_access_urls:
+ items:
+ $ref: '#/components/schemas/BulkAccessURL'
+ type: array
+ summary:
+ $ref: '#/components/schemas/summary'
+ unresolved_drs_objects:
+ description: Error codes for each unresolved drs objects.
+ items:
+ $ref: '#/components/schemas/unresolved_inner'
+ type: array
+ type: object
+ GetBulkObjects_200_response:
+ properties:
+ resolved_drs_object:
+ items:
+ $ref: '#/components/schemas/DrsObject'
+ type: array
+ summary:
+ $ref: '#/components/schemas/summary'
+ unresolved_drs_objects:
+ description: Error codes for each unresolved drs objects.
+ items:
+ $ref: '#/components/schemas/unresolved_inner'
+ type: array
+ type: object
+ GetBulkObjects_request:
+ properties:
+ bulk_object_ids:
+ description: An array of ObjectIDs to retrieve metadata for
+ items:
+ type: string
+ minItems: 1
+ type: array
+ passports:
+ description: the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
+ items:
+ type: string
+ type: array
+ required:
+ - bulk_object_ids
+ type: object
+ GetServiceInfo_200_response:
+ allOf:
+ - $ref: '#/components/schemas/Service'
+ - $ref: '#/components/schemas/DrsService'
+ OptionsBulkObject_200_response:
+ properties:
+ resolved_drs_object:
+ items:
+ $ref: '#/components/schemas/Authorizations'
+ type: array
+ summary:
+ $ref: '#/components/schemas/summary'
+ unresolved_drs_objects:
+ description: Error codes for each unresolved drs objects.
+ items:
+ $ref: '#/components/schemas/unresolved_inner'
+ type: array
+ type: object
+ PostAccessURL_request:
+ properties:
+ passports:
+ description: the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
+ items:
+ type: string
+ type: array
+ type: object
+ PostObject_request:
+ properties:
+ expand:
+ description: |-
+ If false and the object_id refers to a bundle, then the ContentsObject array contains only those objects directly contained in the bundle. That is, if the bundle contains other bundles, those other bundles are not recursively included in the result.
+ If true and the object_id refers to a bundle, then the entire set of objects in the bundle is expanded. That is, if the bundle contains other bundles, then those other bundles are recursively expanded and included in the result. Recursion continues through the entire sub-tree of the bundle.
+ If the object_id refers to a blob, then the query parameter is ignored.
+ type: boolean
+ passports:
+ description: the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
+ items:
+ type: string
+ type: array
+ type: object
+ RegisterObjects_201_response:
+ properties:
+ objects:
+ description: Array of registered DRS objects in the same order as the candidates in the request
+ items:
+ $ref: '#/components/schemas/DrsObject'
+ type: array
+ required:
+ - objects
+ type: object
+ RegisterObjects_request:
+ properties:
+ candidates:
+ description: Array of DRS object candidates to register (server will mint IDs and timestamps)
+ items:
+ $ref: '#/components/schemas/DrsObjectCandidate'
+ minItems: 1
+ type: array
+ passports:
+ description: Optional array of GA4GH Passport JWTs for authorization
+ items:
+ type: string
+ type: array
+ required:
+ - candidates
+ type: object
+ Service:
+ description: GA4GH service
+ properties:
+ contactUrl:
+ description: URL of the contact for the provider of this service, e.g. a link to a contact form (RFC 3986 format), or an email (RFC 2368 format).
+ format: uri
+ type: string
+ createdAt:
+ description: Timestamp describing when the service was first deployed and available (RFC 3339 format)
+ format: date-time
+ type: string
+ description:
+ description: Description of the service. Should be human readable and provide information about the service.
+ type: string
+ documentationUrl:
+ description: URL of the documentation of this service (RFC 3986 format). This should help someone learn how to use your service, including any specifics required to access data, e.g. authentication.
+ format: uri
+ type: string
+ environment:
+ description: Environment the service is running in. Use this to distinguish between production, development and testing/staging deployments. Suggested values are prod, test, dev, staging. However this is advised and not enforced.
+ type: string
+ id:
+ description: Unique ID of this service. Reverse domain name notation is recommended, though not required. The identifier should attempt to be globally unique so it can be used in downstream aggregator services e.g. Service Registry.
+ type: string
+ name:
+ description: Name of this service. Should be human readable.
+ type: string
+ organization:
+ $ref: '#/components/schemas/Service_organization'
+ type:
+ $ref: '#/components/schemas/ServiceType'
+ updatedAt:
+ description: Timestamp describing when the service was last updated (RFC 3339 format)
+ format: date-time
+ type: string
+ version:
+ description: Version of the service being described. Semantic versioning is recommended, but other identifiers, such as dates or commit hashes, are also allowed. The version should be changed whenever the service is updated.
+ type: string
+ required:
+ - id
+ - name
+ - organization
+ - type
+ - version
+ type: object
+ Service_organization:
+ description: Organization providing the service
+ properties:
+ name:
+ description: Name of the organization responsible for the service
+ type: string
+ url:
+ description: URL of the website of the organization (RFC 3986 format)
+ format: uri
+ type: string
+ required:
+ - name
+ - url
+ type: object
+ ServiceType:
+ description: Type of a GA4GH service
+ properties:
+ artifact:
+ description: Name of the API or GA4GH specification implemented. Official GA4GH types should be assigned as part of standards approval process. Custom artifacts are supported.
+ type: string
+ group:
+ description: Namespace in reverse domain name format. Use `org.ga4gh` for implementations compliant with official GA4GH specifications. For services with custom APIs not standardized by GA4GH, or implementations diverging from official GA4GH specifications, use a different namespace (e.g. your organization's reverse domain name).
+ type: string
+ version:
+ description: Version of the API or specification. GA4GH specifications use semantic versioning.
+ type: string
+ required:
+ - artifact
+ - group
+ - version
+ type: object
+ UploadMethod:
+ properties:
+ access_url:
+ $ref: '#/components/schemas/UploadMethod_access_url'
+ region:
+ description: Cloud region for the upload location. Optional for non-cloud storage types.
+ type: string
+ type:
+ description: |-
+ Type of upload method. Implementations MAY support any subset of these types.
+ The 'https' type can be used to return a presigned POST URL and is expected to be the most common implementation for typical file uploads. This method provides a simple HTTP POST interface that works with standard web clients.
+ The 's3' type is primarily intended to support uploads of large files that want to take advantage of multipart uploads and automatic retries implemented in AWS libraries. This method provides direct access to S3-specific upload capabilities.
+ Other common implementations include 'gs' for Google Cloud Storage and 'sftp' for secure FTP uploads.
+ enum:
+ - s3
+ - gs
+ - https
+ - ftp
+ - sftp
+ - gsiftp
+ - globus
+ type: string
+ upload_details:
+ additionalProperties: true
+ description: A dictionary of upload-specific configuration details that vary by upload method type. The contents and structure depend on the specific upload method being used.
+ type: object
+ required:
+ - access_url
+ - type
+ type: object
+ UploadMethod_access_url:
+ allOf:
+ - $ref: '#/components/schemas/AccessURL'
+ - description: An `AccessURL` that specifies where the file will be accessible after upload. This URL will be used as the access_url in the eventual DRS object, ensuring consistency between upload and retrieval operations.
+ type: object
+ UploadRequest:
+ properties:
+ passports:
+ description: Optional array of GA4GH Passport JWTs for authorization
+ items:
+ type: string
+ type: array
+ requests:
+ description: Array of upload requests for files
+ items:
+ $ref: '#/components/schemas/UploadRequestObject'
+ minItems: 1
+ type: array
+ required:
+ - requests
+ type: object
+ UploadRequestObject:
+ properties:
+ aliases:
+ description: Optional array of alternative names for the file
+ items:
+ type: string
+ type: array
+ checksums:
+ description: Array of checksums for file integrity verification
+ items:
+ $ref: '#/components/schemas/Checksum'
+ minItems: 1
+ type: array
+ description:
+ description: Optional description of the file
+ type: string
+ mime_type:
+ description: MIME type of the file
+ type: string
+ name:
+ description: The name of the file to upload
+ type: string
+ size:
+ description: Size of the file in bytes
+ format: int64
+ type: integer
+ required:
+ - checksums
+ - mime_type
+ - name
+ - size
+ type: object
+ UploadResponse:
+ properties:
+ responses:
+ description: List of upload responses for the requested files
+ items:
+ $ref: '#/components/schemas/UploadResponseObject'
+ type: array
+ required:
+ - responses
+ type: object
+ UploadResponseObject:
+ properties:
+ aliases:
+ description: Optional array of alternative names
+ items:
+ type: string
+ type: array
+ checksums:
+ description: Array of checksums for file integrity verification
+ items:
+ $ref: '#/components/schemas/Checksum'
+ minItems: 1
+ type: array
+ description:
+ description: Optional description of the file
+ type: string
+ mime_type:
+ description: MIME type of the file
+ type: string
+ name:
+ description: The name of the file
+ type: string
+ size:
+ description: Size of the file in bytes
+ format: int64
+ type: integer
+ upload_methods:
+ description: Available methods for uploading this file
+ items:
+ $ref: '#/components/schemas/UploadMethod'
+ type: array
+ required:
+ - checksums
+ - mime_type
+ - name
+ - size
+ type: object
+ bulkUpdateAccessMethods_200_response:
+ properties:
+ objects:
+ description: Array of updated DRS objects
+ items:
+ $ref: '#/components/schemas/DrsObject'
+ type: array
+ required:
+ - objects
+ type: object
+ summary:
+ description: A summary of what was resolved.
+ properties:
+ requested:
+ description: Number of items requested.
+ type: integer
+ resolved:
+ description: Number of objects resolved.
+ type: integer
+ unresolved:
+ description: Number of objects not resolved.
+ type: integer
+ type: object
+ unresolved:
+ description: Error codes for each unresolved drs objects.
+ items:
+ $ref: '#/components/schemas/unresolved_inner'
+ type: array
+ unresolved_inner:
+ properties:
+ error_code:
+ type: integer
+ object_ids:
+ items:
+ type: string
+ type: array
+ type: object
+ securitySchemes:
+ BasicAuth:
+ description: |
+ A valid authorization token must be passed in the 'Authorization' header,
+ e.g. "Basic ${token_string}"
+ scheme: basic
+ type: http
+ BearerAuth:
+ description: A valid authorization token must be passed in the 'Authorization' header, e.g. "Bearer ${token_string}"
+ scheme: bearer
+ type: http
+ PassportAuth:
+ bearerFormat: JWT
+ description: A valid GA4GH Passport must be passed in the body of an HTTP POST request as a tokens[] array.
+ scheme: bearer
+ type: http
+ x-in: body
+info:
+ contact:
+ email: ga4gh-cloud@ga4gh.org
+ name: GA4GH Cloud Work Stream
+ license:
+ name: Apache 2.0
+ url: https://raw.githubusercontent.com/ga4gh/data-repository-service-schemas/master/LICENSE
+ termsOfService: https://www.ga4gh.org/terms-and-conditions/
+ title: Data Repository Service
+ version: 1.5.0
+ x-logo:
+ url: https://www.ga4gh.org/wp-content/themes/ga4gh/dist/assets/svg/logos/logo-full-color.svg
+openapi: 3.0.3
+paths:
+ /objects:
+ options:
+ description: Returns a structure that contains for each DrsObjects a list of `Authorizations` that can be used to determine how to authorize requests to `GetObject` or `PostObject` (or bulk equivalents).
+ operationId: OptionsBulkObject
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/BulkObjectIdNoPassport'
+ required: true
+ responses:
+ "200":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/OptionsBulkObject_200_response'
+ description: '`Authorizations` were found successfully'
+ "204":
+ description: '`Authorizations` are not supported for this object. Default to `None`.'
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is malformed.
+ "404":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested `DrsObject` wasn't found.
+ "405":
+ description: '`Authorizations` are not supported for this object. Default to `None`.'
+ "413":
+ content:
+ application/json:
+ examples:
+ bulk_limit_exceeded:
+ description: Request contains more objects than server's maximum bulk delete limit
+ summary: Bulk delete limit exceeded
+ value:
+ msg: Bulk delete request contains 150 objects but server maximum is 100. Check maxBulkDeleteLength in service-info.
+ status_code: 413
+ request_size_too_large:
+ description: The overall request payload exceeds server limits
+ summary: Request payload too large
+ value:
+ msg: Request payload size exceeds server limit of 1MB
+ status_code: 413
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The bulk request is too large.
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ security:
+ - {}
+ summary: Get Authorization info about multiple DrsObjects.
+ tags:
+ - Objects
+ x-swagger-router-controller: ga4gh.drs.server
+ post:
+ description: |-
+ Returns an array of object metadata and access methods for the specified object IDs.
+ The request is limited to use passports (one or more) or a single bearer token, so make sure your bulk request is for objects that all use the same passports/token.
+ **Note**: To register new DRS objects, use the dedicated `/objects/register` endpoint.
+ operationId: GetBulkObjects
+ parameters:
+ - description: |-
+ If false and the object_id refers to a bundle, then the ContentsObject array contains only those objects directly contained in the bundle. That is, if the bundle contains other bundles, those other bundles are not recursively included in the result.
+ If true and the object_id refers to a bundle, then the entire set of objects in the bundle is expanded. That is, if the bundle contains other bundles, then those other bundles are recursively expanded and included in the result. Recursion continues through the entire sub-tree of the bundle.
+ If the object_id refers to a blob, then the query parameter is ignored.
+ in: query
+ name: expand
+ schema:
+ type: boolean
+ requestBody:
+ $ref: '#/components/requestBodies/BulkObjectBody'
+ responses:
+ "200":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GetBulkObjects_200_response'
+ description: The `DrsObjects` were found successfully
+ "202":
+ description: |
+ The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
+ headers:
+ Retry-After:
+ description: |
+ Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
+ schema:
+ format: int64
+ type: integer
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is malformed.
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is unauthorized.
+ "403":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requester is not authorized to perform this action.
+ "404":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested `DrsObject` wasn't found.
+ "413":
+ content:
+ application/json:
+ examples:
+ bulk_limit_exceeded:
+ description: Request contains more objects than server's maximum bulk delete limit
+ summary: Bulk delete limit exceeded
+ value:
+ msg: Bulk delete request contains 150 objects but server maximum is 100. Check maxBulkDeleteLength in service-info.
+ status_code: 413
+ request_size_too_large:
+ description: The overall request payload exceeds server limits
+ summary: Request payload too large
+ value:
+ msg: Request payload size exceeds server limit of 1MB
+ status_code: 413
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The bulk request is too large.
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ security:
+ - PassportAuth: []
+ summary: Get info about multiple DrsObjects with an optional Passport(s).
+ tags:
+ - Objects
+ x-swagger-router-controller: ga4gh.drs.server
+ /objects/{object_id}:
+ get:
+ description: Returns object metadata, and a list of access methods that can be used to fetch object bytes.
+ operationId: GetObject
+ parameters:
+ - description: '`DrsObject` identifier'
+ in: path
+ name: object_id
+ required: true
+ schema:
+ type: string
+ - description: |-
+ If false and the object_id refers to a bundle, then the ContentsObject array contains only those objects directly contained in the bundle. That is, if the bundle contains other bundles, those other bundles are not recursively included in the result.
+ If true and the object_id refers to a bundle, then the entire set of objects in the bundle is expanded. That is, if the bundle contains other bundles, then those other bundles are recursively expanded and included in the result. Recursion continues through the entire sub-tree of the bundle.
+ If the object_id refers to a blob, then the query parameter is ignored.
+ in: query
+ name: expand
+ schema:
+ type: boolean
+ responses:
+ "200":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DrsObject'
+ description: The `DrsObject` was found successfully
+ "202":
+ description: |
+ The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
+ headers:
+ Retry-After:
+ description: |
+ Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
+ schema:
+ format: int64
+ type: integer
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is malformed.
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is unauthorized.
+ "403":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requester is not authorized to perform this action.
+ "404":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested `DrsObject` wasn't found.
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ summary: Get info about a DrsObject.
+ tags:
+ - Objects
+ x-swagger-router-controller: ga4gh.drs.server
+ options:
+ description: Returns a list of `Authorizations` that can be used to determine how to authorize requests to `GetObject` or `PostObject`.
+ operationId: OptionsObject
+ parameters:
+ - description: '`DrsObject` identifier'
+ in: path
+ name: object_id
+ required: true
+ schema:
+ type: string
+ responses:
+ "200":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Authorizations'
+ description: '`Authorizations` were found successfully'
+ "204":
+ description: '`Authorizations` are not supported for this object. Default to `None`.'
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is malformed.
+ "404":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested `DrsObject` wasn't found.
+ "405":
+ description: '`Authorizations` are not supported for this object. Default to `None`.'
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ security:
+ - {}
+ summary: Get Authorization info about a DrsObject.
+ tags:
+ - Objects
+ x-swagger-router-controller: ga4gh.drs.server
+ post:
+ description: |-
+ Returns object metadata and a list of access methods that can be used to fetch object bytes. Method is a POST to accommodate a JWT GA4GH Passport sent in the request body in order to authorize access.
+ **Note**: To upload new files and register them as DRS objects, use the `/upload-request` endpoint to obtain upload methods and temporary credentials, then use POST `/objects/register` endpoint to register multiple objects at once. Note that upload functionality is optional and not all DRS servers implement the upload endpoints.
+ operationId: PostObject
+ parameters:
+ - description: '`DrsObject` identifier'
+ in: path
+ name: object_id
+ required: true
+ schema:
+ type: string
+ requestBody:
+ $ref: '#/components/requestBodies/PostObjectBody'
+ responses:
+ "200":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DrsObject'
+ description: The `DrsObject` was found successfully
+ "202":
+ description: |
+ The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
+ headers:
+ Retry-After:
+ description: |
+ Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
+ schema:
+ format: int64
+ type: integer
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is malformed.
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is unauthorized.
+ "403":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requester is not authorized to perform this action.
+ "404":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested `AccessURL` wasn't found.
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ security:
+ - PassportAuth: []
+ summary: Get info about a DrsObject through POST'ing a Passport.
+ tags:
+ - Objects
+ x-swagger-router-controller: ga4gh.drs.server
+ /objects/{object_id}/access-methods:
+ post:
+ description: |-
+ **Optional Endpoint**: Not all DRS servers support access method updates.
+ Update the access methods for an existing DRS object. Only access methods are modified - core object metadata (size, checksums, name) remains unchanged. Servers MAY validate that new access methods point to the same data.
+ Note that existing access methods are overwritten, if clients want to add additional access methods they should first retrieve the current methods and include them along with the new methods in this request.
+ **Authentication**: GA4GH Passports can be provided in the request body.
+ operationId: updateObjectAccessMethods
+ parameters:
+ - description: DRS object identifier
+ in: path
+ name: object_id
+ required: true
+ schema:
+ type: string
+ requestBody:
+ $ref: '#/components/requestBodies/AccessMethodUpdateBody'
+ responses:
+ "200":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DrsObject'
+ description: Access methods successfully updated. Returns the updated DRS object with new access methods and updated timestamp.
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is malformed.
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is unauthorized.
+ "403":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requester is not authorized to perform this action.
+ "404":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested `DrsObject` wasn't found.
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ security:
+ - {}
+ - BasicAuth: []
+ - BearerAuth: []
+ - PassportAuth: []
+ summary: Update access methods for a DRS object
+ tags:
+ - Objects
+ /objects/{object_id}/access/{access_id}:
+ get:
+ description: |-
+ Returns a URL that can be used to fetch the bytes of a `DrsObject`.
+ This method only needs to be called when using an `AccessMethod` that contains an `access_id` (e.g., for servers that use signed URLs for fetching object bytes).
+ operationId: GetAccessURL
+ parameters:
+ - description: '`DrsObject` identifier'
+ in: path
+ name: object_id
+ required: true
+ schema:
+ type: string
+ - description: An `access_id` from the `access_methods` list of a `DrsObject`
+ in: path
+ name: access_id
+ required: true
+ schema:
+ type: string
+ responses:
+ "200":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AccessURL'
+ description: The `AccessURL` was found successfully
+ "202":
+ description: |
+ The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
+ headers:
+ Retry-After:
+ description: |
+ Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
+ schema:
+ format: int64
+ type: integer
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is malformed.
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is unauthorized.
+ "403":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requester is not authorized to perform this action.
+ "404":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested `AccessURL` wasn't found.
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ summary: Get a URL for fetching bytes
+ tags:
+ - Objects
+ x-swagger-router-controller: ga4gh.drs.server
+ post:
+ description: |-
+ Returns a URL that can be used to fetch the bytes of a `DrsObject`.
+ This method only needs to be called when using an `AccessMethod` that contains an `access_id` (e.g., for servers that use signed URLs for fetching object bytes).
+ Method is a POST to accommodate a JWT GA4GH Passport sent in the formData in order to authorize access.
+ operationId: PostAccessURL
+ parameters:
+ - description: '`DrsObject` identifier'
+ in: path
+ name: object_id
+ required: true
+ schema:
+ type: string
+ - description: An `access_id` from the `access_methods` list of a `DrsObject`
+ in: path
+ name: access_id
+ required: true
+ schema:
+ type: string
+ requestBody:
+ $ref: '#/components/requestBodies/Passports'
+ responses:
+ "200":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/AccessURL'
+ description: The `AccessURL` was found successfully
+ "202":
+ description: |
+ The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
+ headers:
+ Retry-After:
+ description: |
+ Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
+ schema:
+ format: int64
+ type: integer
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is malformed.
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is unauthorized.
+ "403":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requester is not authorized to perform this action.
+ "404":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested `AccessURL` wasn't found.
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ security:
+ - PassportAuth: []
+ summary: Get a URL for fetching bytes through POST'ing a Passport
+ tags:
+ - Objects
+ x-swagger-router-controller: ga4gh.drs.server
+ /objects/{object_id}/delete:
+ post:
+ description: |-
+ **Optional Endpoint**: This endpoint is not required for DRS server implementations. Not all DRS servers support delete functionality.
+ Deletes a DRS object by ID. This operation removes the DRS object metadata and optionally attempts to delete the underlying storage data based on the delete_storage_data parameter and server capabilities.
+ By default, only DRS object metadata is deleted while preserving underlying storage data. To attempt storage data deletion, clients must explicitly set delete_storage_data to true and the server must support storage data deletion (advertised via `deleteStorageDataSupported` in service-info). Servers will make a best effort attempt to delete storage data, but success is not guaranteed.
+ This endpoint uses POST method to accommodate GA4GH Passport authentication in the request body, ensuring compatibility across all HTTP clients and proxies.
+ **Important**: HTTP responses (204 No Content) indicate metadata deletion success only, not storage deletion success (which are not guaranteed to complete synchronously if they occur at all)
+ operationId: DeleteObject
+ parameters:
+ - description: '`DrsObject` identifier'
+ in: path
+ name: object_id
+ required: true
+ schema:
+ type: string
+ requestBody:
+ $ref: '#/components/requestBodies/DeleteBody'
+ responses:
+ "204":
+ description: All DRS objects were successfully deleted. For bulk operations, this indicates that the entire atomic transaction completed successfully - all requested objects have been deleted. Storage data deletion (if requested) was attempted but success is not guaranteed.
+ "400":
+ content:
+ application/json:
+ examples:
+ empty_object_list:
+ description: Bulk delete request with empty object ID array
+ summary: Empty object ID list
+ value:
+ msg: bulk_object_ids cannot be empty
+ status_code: 400
+ invalid_request_format:
+ description: Request body contains invalid JSON or missing required fields
+ summary: Malformed request body
+ value:
+ msg: 'Invalid request body: bulk_object_ids is required for bulk delete operations'
+ status_code: 400
+ unsupported_storage_deletion:
+ description: Client requested storage data deletion but server doesn't support it
+ summary: Storage data deletion not supported
+ value:
+ msg: Server does not support storage data deletion. Set delete_storage_data to false or omit the parameter.
+ status_code: 400
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: 'The delete request is malformed or contains unsupported parameters (e.g., delete_storage_data: true when server doesn''t support storage data deletion).'
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is unauthorized.
+ "403":
+ content:
+ application/json:
+ examples:
+ insufficient_permissions:
+ description: Client lacks permission to delete the specified object
+ summary: Insufficient delete permissions
+ value:
+ msg: Client lacks delete permission for object drs_object_123456
+ status_code: 403
+ invalid_passport:
+ description: Provided GA4GH Passport is invalid or expired
+ summary: Invalid GA4GH Passport
+ value:
+ msg: Invalid or expired GA4GH Passport provided
+ status_code: 403
+ missing_visa:
+ description: GA4GH Passport lacks required visa for delete operation
+ summary: Missing required visa
+ value:
+ msg: GA4GH Passport does not contain required visa for delete operation on this object
+ status_code: 403
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The client is not authorized to delete the requested DRS object.
+ "404":
+ content:
+ application/json:
+ examples:
+ delete_not_supported:
+ description: This server does not support delete operations
+ summary: Delete operations not supported
+ value:
+ msg: Delete operations are not supported by this server
+ status_code: 404
+ endpoint_not_found:
+ description: Delete endpoints are not implemented on this server
+ summary: Delete endpoint not available
+ value:
+ msg: The requested endpoint /objects/delete is not available on this server
+ status_code: 404
+ object_not_found:
+ description: The specified DRS object does not exist
+ summary: DRS object not found
+ value:
+ msg: DRS object drs_object_123456 does not exist
+ status_code: 404
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested DRS object for deletion wasn't found, or delete endpoints are not supported by this server.
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ security:
+ - {}
+ - BasicAuth: []
+ - BearerAuth: []
+ - PassportAuth: []
+ summary: Delete a DRS object (optional endpoint)
+ tags:
+ - Objects
+ x-codegen-request-body-name: body
+ x-swagger-router-controller: ga4gh.drs.server
+ /objects/access:
+ post:
+ description: |-
+ Returns an array of URL objects that can be used to fetch the bytes of multiple `DrsObject`s.
+ This method only needs to be called when using an `AccessMethod` that contains an `access_id` (e.g., for servers that use signed URLs for fetching object bytes).
+ Currently this is limited to use passports (one or more) or a single bearer token, so make sure your bulk request is for objects that all use the same passports/token.
+ operationId: GetBulkAccessURL
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/BulkObjectAccessId'
+ required: true
+ responses:
+ "200":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GetBulkAccessURL_200_response'
+ description: The `AccessURL` was found successfully
+ "202":
+ description: |
+ The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
+ headers:
+ Retry-After:
+ description: |
+ Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
+ schema:
+ format: int64
+ type: integer
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is malformed.
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is unauthorized.
+ "403":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requester is not authorized to perform this action.
+ "404":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested `AccessURL` wasn't found.
+ "413":
+ content:
+ application/json:
+ examples:
+ bulk_limit_exceeded:
+ description: Request contains more objects than server's maximum bulk delete limit
+ summary: Bulk delete limit exceeded
+ value:
+ msg: Bulk delete request contains 150 objects but server maximum is 100. Check maxBulkDeleteLength in service-info.
+ status_code: 413
+ request_size_too_large:
+ description: The overall request payload exceeds server limits
+ summary: Request payload too large
+ value:
+ msg: Request payload size exceeds server limit of 1MB
+ status_code: 413
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The bulk request is too large.
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ security:
+ - PassportAuth: []
+ summary: Get URLs for fetching bytes from multiple objects with an optional Passport(s).
+ tags:
+ - Objects
+ x-swagger-router-controller: ga4gh.drs.server
+ /objects/access-methods:
+ post:
+ description: |-
+ **Optional Endpoint**: Not all DRS servers support access method updates.
+ Update access methods for multiple DRS objects in a single atomic transaction. If ANY object fails to update, the ENTIRE request fails and NO objects are updated. Only access methods are modified - core object metadata remains unchanged.
+ Note that existing access methods are overwritten, if clients want to add additional access methods they should first retrieve the current methods and include them along with the new methods in this request.
+ **Authentication**: GA4GH Passports can be provided in the request body.
+ operationId: bulkUpdateAccessMethods
+ requestBody:
+ $ref: '#/components/requestBodies/BulkAccessMethodUpdateBody'
+ responses:
+ "200":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/bulkUpdateAccessMethods_200_response'
+ description: Access methods successfully updated for all objects. Returns updated DRS objects with new access methods and updated timestamps.
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is malformed.
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is unauthorized.
+ "403":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requester is not authorized to perform this action.
+ "404":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested `DrsObject` wasn't found.
+ "413":
+ content:
+ application/json:
+ examples:
+ bulk_limit_exceeded:
+ description: Request contains more objects than server's maximum bulk delete limit
+ summary: Bulk delete limit exceeded
+ value:
+ msg: Bulk delete request contains 150 objects but server maximum is 100. Check maxBulkDeleteLength in service-info.
+ status_code: 413
+ request_size_too_large:
+ description: The overall request payload exceeds server limits
+ summary: Request payload too large
+ value:
+ msg: Request payload size exceeds server limit of 1MB
+ status_code: 413
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The bulk request is too large.
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ security:
+ - {}
+ - BasicAuth: []
+ - BearerAuth: []
+ - PassportAuth: []
+ summary: Bulk update access methods for multiple DRS objects
+ tags:
+ - Objects
+ /objects/checksum/{checksum}:
+ get:
+ description: |-
+ Returns an array of `DRSObjects` that match a given checksum.
+ The checksum type is not provide, the checksum check is done against all checksum types.
+ operationId: GetObjectsByChecksum
+ parameters:
+ - description: A `checksum` value from the `checksums` list of a `DrsObject`
+ in: path
+ name: checksum
+ required: true
+ schema:
+ type: string
+ responses:
+ "200":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GetBulkObjects_200_response'
+ description: The `DrsObjects` were found successfully
+ "202":
+ description: |
+ The operation is delayed and will continue asynchronously. The client should retry this same request after the delay specified by Retry-After header.
+ headers:
+ Retry-After:
+ description: |
+ Delay in seconds. The client should retry this same request after waiting for this duration. To simplify client response processing, this must be an integral relative time in seconds. This value SHOULD represent the minimum duration the client should wait before attempting the operation again with a reasonable expectation of success. When it is not feasible for the server to determine the actual expected delay, the server may return a brief, fixed value instead.
+ schema:
+ format: int64
+ type: integer
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is malformed.
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is unauthorized.
+ "403":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requester is not authorized to perform this action.
+ "404":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested `DrsObject` wasn't found.
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ security:
+ - PassportAuth: []
+ summary: Get DRS objects that are a match for the checksum.
+ tags:
+ - Objects
+ x-swagger-router-controller: ga4gh.drs.server
+ /objects/delete:
+ post:
+ description: |-
+ **Optional Endpoint**: This endpoint is not required for DRS server implementations. Not all DRS servers support delete functionality.
+ Delete multiple DRS objects in a single atomic transaction. If ANY object fails to be deleted, the ENTIRE request fails and NO objects are deleted. This ensures data consistency and prevents partial deletion scenarios.
+ **RECOMMENDED - Transactional Behavior**: Deletion operations SHOULD be atomic transactions. If ANY object fails validation or deletion, the ENTIRE request SHOULD fail and NO objects SHOULD be deleted. Servers SHOULD implement this as an all-or-nothing operation to ensure data consistency, but MAY implement partial deletion with appropriate error reporting if transactional behavior is not feasible.
+ **Authentication**: GA4GH Passports can be provided in the request body for authorization.
+ **Storage Data Deletion**: The `delete_storage_data` parameter controls whether the server will attempt to delete underlying storage files along with DRS metadata. This defaults to false for safety. Servers will make a best effort attempt to delete storage data, but success is not guaranteed.
+ **Server Responsibilities**: - SHOULD treat deletion as an atomic transaction (all succeed or all fail) - SHOULD validate ALL object IDs exist and are accessible before deleting ANY - SHOULD roll back any partial changes if any object fails deletion - SHOULD return 400 if any object ID is invalid or inaccessible when using transactional behavior
+ **Client Responsibilities**: - Provide valid object IDs for all objects to be deleted - Handle potential failure of entire batch if any single object cannot be deleted - Check service-info for `maxBulkDeleteLength` limits before making requests
+ operationId: bulkDeleteObjects
+ requestBody:
+ $ref: '#/components/requestBodies/BulkDeleteBody'
+ responses:
+ "204":
+ description: All DRS objects were successfully deleted. For bulk operations, this indicates that the entire atomic transaction completed successfully - all requested objects have been deleted. Storage data deletion (if requested) was attempted but success is not guaranteed.
+ "400":
+ content:
+ application/json:
+ examples:
+ empty_object_list:
+ description: Bulk delete request with empty object ID array
+ summary: Empty object ID list
+ value:
+ msg: bulk_object_ids cannot be empty
+ status_code: 400
+ invalid_request_format:
+ description: Request body contains invalid JSON or missing required fields
+ summary: Malformed request body
+ value:
+ msg: 'Invalid request body: bulk_object_ids is required for bulk delete operations'
+ status_code: 400
+ unsupported_storage_deletion:
+ description: Client requested storage data deletion but server doesn't support it
+ summary: Storage data deletion not supported
+ value:
+ msg: Server does not support storage data deletion. Set delete_storage_data to false or omit the parameter.
+ status_code: 400
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: 'The delete request is malformed or contains unsupported parameters (e.g., delete_storage_data: true when server doesn''t support storage data deletion).'
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is unauthorized.
+ "403":
+ content:
+ application/json:
+ examples:
+ insufficient_permissions:
+ description: Client lacks permission to delete the specified object
+ summary: Insufficient delete permissions
+ value:
+ msg: Client lacks delete permission for object drs_object_123456
+ status_code: 403
+ invalid_passport:
+ description: Provided GA4GH Passport is invalid or expired
+ summary: Invalid GA4GH Passport
+ value:
+ msg: Invalid or expired GA4GH Passport provided
+ status_code: 403
+ missing_visa:
+ description: GA4GH Passport lacks required visa for delete operation
+ summary: Missing required visa
+ value:
+ msg: GA4GH Passport does not contain required visa for delete operation on this object
+ status_code: 403
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The client is not authorized to delete the requested DRS object.
+ "404":
+ content:
+ application/json:
+ examples:
+ delete_not_supported:
+ description: This server does not support delete operations
+ summary: Delete operations not supported
+ value:
+ msg: Delete operations are not supported by this server
+ status_code: 404
+ endpoint_not_found:
+ description: Delete endpoints are not implemented on this server
+ summary: Delete endpoint not available
+ value:
+ msg: The requested endpoint /objects/delete is not available on this server
+ status_code: 404
+ object_not_found:
+ description: The specified DRS object does not exist
+ summary: DRS object not found
+ value:
+ msg: DRS object drs_object_123456 does not exist
+ status_code: 404
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requested DRS object for deletion wasn't found, or delete endpoints are not supported by this server.
+ "413":
+ content:
+ application/json:
+ examples:
+ bulk_limit_exceeded:
+ description: Request contains more objects than server's maximum bulk delete limit
+ summary: Bulk delete limit exceeded
+ value:
+ msg: Bulk delete request contains 150 objects but server maximum is 100. Check maxBulkDeleteLength in service-info.
+ status_code: 413
+ request_size_too_large:
+ description: The overall request payload exceeds server limits
+ summary: Request payload too large
+ value:
+ msg: Request payload size exceeds server limit of 1MB
+ status_code: 413
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The bulk request is too large.
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ security:
+ - {}
+ - BasicAuth: []
+ - BearerAuth: []
+ - PassportAuth: []
+ summary: Delete multiple DRS objects
+ tags:
+ - Objects
+ x-codegen-request-body-name: body
+ /objects/register:
+ post:
+ description: "**Optional Endpoint**: This endpoint is not required for DRS server implementations. Not all DRS servers support object registration. \nRegisters one or more \"candidate\" DRS objects with the server. If it accepts the request, the server will create unique object IDs for each registered object and return them in fully-formed DRS objects in response.\nThis endpoint can be used after uploading files using methods negotiated with the `/upload-request` endpoint to register the uploaded files as DRS objects, or to register existinf data. The request body should contain candidate DRS objects with all required metadata including access methods that correspond to the upload methods used during file upload.\n**RECOMMENDED - Transactional Behavior**: Registration operations SHOULD be atomic transactions. If ANY candidate object fails validation or registration, the ENTIRE request SHOULD fail and NO objects SHOULD be registered. Servers SHOULD implement this as an all-or-nothing operation to ensure data consistency, but MAY implement partial registration with appropriate error reporting if transactional behavior is not feasible.\n**Authentication**: GA4GH Passports can be provided in the request body for authorization. Bearer tokens can be supplied in headers.\n**Server Responsibilities**: - SHOULD treat registration as an atomic transaction (all succeed or all fail) - SHOULD validate ALL candidate objects before registering ANY - Create unique object IDs for each registered object - Add timestamps (created_time, updated_time) - SHOULD roll back any partial changes if any candidate fails validation\n**Client Responsibilities**: - Provide required DRS object metadata for all candidates - Include access methods corresponding to uploaded file locations - Ensure checksums match uploaded file content - Handle potential failure of entire batch if any single object is invalid"
+ operationId: RegisterObjects
+ requestBody:
+ $ref: '#/components/requestBodies/RegisterObjectsBody'
+ responses:
+ "201":
+ content:
+ application/json:
+ examples:
+ multiple_objects_created:
+ description: Response after registering multiple DRS objects
+ summary: Multiple objects registered
+ value:
+ objects:
+ - access_methods:
+ - access_url:
+ url: s3://genomics-bucket/assemblies/hg38.fasta
+ type: s3
+ checksums:
+ - checksum: a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
+ type: sha-256
+ created_time: 2024-01-15T09:00:00Z
+ description: Human genome reference assembly
+ id: drs_obj_a1b2c3d4e5f6
+ mime_type: text/plain
+ name: genome_assembly.fasta
+ self_uri: drs://drs.example.org/drs_obj_a1b2c3d4e5f6
+ size: 3221225472
+ updated_time: 2024-01-15T09:00:00Z
+ version: "1.0"
+ - access_methods:
+ - access_url:
+ url: https://data.example.org/files/annotations.gff3
+ type: https
+ checksums:
+ - checksum: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
+ type: sha-256
+ created_time: 2024-01-15T09:15:00Z
+ description: Gene annotations in GFF3 format
+ id: drs_obj_f6e5d4c3b2a1
+ mime_type: text/plain
+ name: annotations.gff3
+ self_uri: drs://drs.example.org/drs_obj_f6e5d4c3b2a1
+ size: 524288000
+ updated_time: 2024-01-15T09:15:00Z
+ version: "1.0"
+ single_object_created:
+ description: Response after registering one DRS object
+ summary: Single object registered
+ value:
+ objects:
+ - access_methods:
+ - access_url:
+ url: s3://my-bucket/uploads/sample_data.vcf
+ type: s3
+ checksums:
+ - checksum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ type: sha-256
+ created_time: 2024-01-15T10:30:00Z
+ description: Variant call format file for sample analysis
+ id: drs_obj_a1b2c3d4e5f6
+ mime_type: text/plain
+ name: sample_data.vcf
+ self_uri: drs://drs.example.org/drs_obj_a1b2c3d4e5f6
+ size: 1048576
+ updated_time: 2024-01-15T10:30:00Z
+ version: "1.0"
+ schema:
+ $ref: '#/components/schemas/RegisterObjects_201_response'
+ description: DRS objects were successfully registered as an atomic transaction. Returns the complete DRS objects with server-minted IDs and timestamps. All candidate objects were validated and registered together - if any had failed, none would have been registered.
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is malformed.
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is unauthorized.
+ "403":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requester is not authorized to perform this action.
+ "413":
+ content:
+ application/json:
+ examples:
+ bulk_limit_exceeded:
+ description: Request contains more objects than server's maximum bulk delete limit
+ summary: Bulk delete limit exceeded
+ value:
+ msg: Bulk delete request contains 150 objects but server maximum is 100. Check maxBulkDeleteLength in service-info.
+ status_code: 413
+ request_size_too_large:
+ description: The overall request payload exceeds server limits
+ summary: Request payload too large
+ value:
+ msg: Request payload size exceeds server limit of 1MB
+ status_code: 413
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The bulk request is too large.
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ security:
+ - {}
+ - BasicAuth: []
+ - BearerAuth: []
+ - PassportAuth: []
+ summary: Register DRS objects
+ tags:
+ - Objects
+ x-codegen-request-body-name: body
+ x-swagger-router-controller: ga4gh.drs.server
+ /service-info:
+ get:
+ description: "Returns information about the DRS service along with stats pertaning to total object count and cumulative size in bytes.\nAlso indicates whether the server supports optional upload and delete operations and which methods are available.\n\nExtends the\n[v1.0.0 GA4GH Service Info specification](https://github.com/ga4gh-discovery/ga4gh-service-info)\nas the standardized format for GA4GH web services to self-describe.\n\nAccording to the \n[service-info type registry](https://github.com/ga4gh/TASC/blob/master/service-info/ga4gh-service-info.json)\nmaintained by the [Technical Alignment Sub Committee (TASC)](https://github.com/ga4gh/TASC),\na DRS service MUST have:\n * a `type.group` value of `org.ga4gh`\n * a `type.artifact` value of `drs`\n\n**Example 1: Server with upload and delete capabilities**\n```\n{\n \"id\": \"com.example.drs\",\n \"description\": \"Serves data according to DRS specification\",\n ...\n \"type\": {\n \"group\": \"org.ga4gh\",\n \"artifact\": \"drs\",\n \"version\": \"1.5\"\n }\n ...\n \"drs\":{\n \"maxBulkRequestLength\": 200,\n \"objectCount\": 774560,\n \"totalObjectSize\": 4018437188907752,\n \"uploadRequestSupported\": true,\n \"objectRegistrationSupported\": true,\n \"supportedUploadMethods\": [\"s3\", \"https\", \"gs\"],\n \"maxUploadSize\": 5368709120,\n \"maxUploadRequestLength\": 50,\n \"validateUploadChecksums\": true,\n \"validateUploadFileSizes\": false,\n \"relatedFileStorageSupported\": true,\n \"deleteSupported\": true,\n \"maxBulkDeleteLength\": 100,\n \"deleteStorageDataSupported\": true\n }\n}\n```\n\n**Example 2: Read-only server (no upload or delete)**\n```\n{\n \"id\": \"com.example.readonly-drs\",\n \"description\": \"Read-only DRS service\",\n ...\n \"type\": {\n \"group\": \"org.ga4gh\",\n \"artifact\": \"drs\",\n \"version\": \"1.5\"\n }\n ...\n \"drs\":{\n \"maxBulkRequestLength\": 500,\n \"objectCount\": 1250000,\n \"totalObjectSize\": 8500000000000000\n }\n}\n```\n\n**Example 3: Server with metadata-only delete capability**\n```\n{\n \"id\": \"com.example.metadata-drs\",\n \"description\": \"DRS service with metadata-only delete\",\n ...\n \"type\": {\n \"group\": \"org.ga4gh\",\n \"artifact\": \"drs\",\n \"version\": \"1.5\"\n }\n ...\n \"drs\":{\n \"maxBulkRequestLength\": 200,\n \"objectCount\": 500000,\n \"totalObjectSize\": 2500000000000000,\n \"deleteSupported\": true,\n \"maxBulkDeleteLength\": 50,\n \"deleteStorageDataSupported\": false\n }\n}\n```\n\nSee the [Service Registry Appendix](#tag/GA4GH-Service-Registry) for more information on how to register a DRS service with a service registry."
+ operationId: GetServiceInfo
+ responses:
+ "200":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GetServiceInfo_200_response'
+ description: Retrieve info about the DRS service
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ summary: Retrieve information about this service
+ tags:
+ - Service Info
+ /upload-request:
+ post:
+ description: "**Optional Endpoint**: This endpoint is not required for DRS server implementations. Not all DRS servers support upload functionality. \nRequest upload method details and temporary credentials for uploading one or more files to an underlying storage service. This endpoint allows clients to obtain the necessary information to upload files before they are registered as DRS objects.\n**Discovery**: Before using this endpoint, clients should check the `/service-info` endpoint to determine if upload operations are supported. Look for `drs.uploadRequestSupported: true` and `drs.supportedUploadMethods` to understand which upload methods are available. Also check `drs.maxUploadSize` and `drs.maxUploadRequestLength` for server limits.\n**Usage Flow:**\n1. **Discovery**: Client checks `/service-info` endpoint to confirm upload support (`drs.uploadRequestSupported: true`) and available methods (`drs.supportedUploadMethods`)\n2. Client sends an upload request with file metadata (name, size, checksums, MIME type)\n3. Server responds with available upload methods (S3, HTTPS, Google Cloud Storage, etc.) and temporary credentials\n4. Client selects one or more upload methods from the response and uses the corresponding credentials to upload the file to the storage service\n5. Once uploaded, the client registers the files as DRS objects including access methods that correspond to the upload methods used with a POST request to `/objects/register`, the server will return fully formed DRS objects with server minted unique IDs.\n6. The registered DRS object becomes accessible through standard DRS API endpoints\n\n**Authentication:**\nThe endpoint supports multiple authentication methods including GA4GH Passport tokens sent in the request body. Passport tokens enable fine-grained authorization based on data access policies.\n**Upload Methods**: Response may include multiple options (s3, https, gs, ftp/sftp) for flexibility. Note that servers may return a subset of their advertised `supportedUploadMethods` based on file-specific factors such as file type, size, or server policies.\n**File Integrity**: All requests must include at least one checksum per file (SHA-256, MD5, or other IANA-registered algorithms).\n**Server Validation**: Servers MAY validate checksums/sizes but are not required to. Check service-info for validation behavior. Servers do not validate MIME types against actual file content - clients are responsible for providing accurate MIME type information."
+ operationId: PostUploadRequest
+ requestBody:
+ $ref: '#/components/requestBodies/UploadRequestBody'
+ responses:
+ "200":
+ content:
+ application/json:
+ examples:
+ https_upload:
+ description: Response with HTTPS presigned POST URL for direct upload
+ summary: HTTPS upload method response
+ value:
+ responses:
+ - aliases:
+ - hg38_reference
+ checksums:
+ - checksum: a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3
+ type: sha-256
+ - checksum: 098f6bcd4621d373cade4e832627b4f6
+ type: md5
+ description: Human genome reference assembly
+ mime_type: text/plain
+ name: genome_assembly.fasta
+ size: 3221225472
+ upload_methods:
+ - access_url:
+ url: https://upload.example.org/v1/files/drs_object_789012
+ type: https
+ upload_details:
+ post_url: https://upload.example.org/v1/files/drs_object_789012?signature=abc123
+ multiple_methods:
+ description: Response offering multiple upload method options for flexibility
+ summary: Multiple upload methods response
+ value:
+ responses:
+ - checksums:
+ - checksum: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
+ type: sha-256
+ description: Gene annotations in GFF3 format
+ mime_type: text/plain
+ name: annotations.gff3
+ size: 524288000
+ upload_methods:
+ - access_url:
+ url: https://genomics-bucket.s3.us-west-2.amazonaws.com/uploads/drs_object_345678
+ region: us-west-2
+ type: s3
+ upload_details:
+ access_key_id: AKIAI44QH8DHBEXAMPLE
+ bucket: genomics-bucket
+ expires_at: 2024-01-01T12:00:00Z
+ key: uploads/drs_object_345678
+ secret_access_key: je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
+ session_token: temporary_session_token_here
+ - access_url:
+ url: https://upload-api.example.org/files/drs_object_345678
+ type: https
+ upload_details:
+ post_url: https://upload-api.example.org/files/drs_object_345678?token=upload_token_12345
+ - access_url:
+ url: https://storage.googleapis.com/genomics-uploads/drs_object_345678
+ region: us-central1
+ type: gs
+ upload_details:
+ access_token: ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg
+ bucket: genomics-uploads
+ expires_at: 2024-01-01T12:00:00Z
+ key: drs_object_345678
+ s3_upload:
+ description: Response with S3 upload method and temporary credentials
+ summary: S3 upload method response
+ value:
+ responses:
+ - aliases:
+ - sample_001_variants
+ - vcf_batch_2024
+ checksums:
+ - checksum: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+ type: sha-256
+ description: Variant call format file for sample analysis
+ mime_type: text/plain
+ name: sample_data.vcf
+ size: 1048576
+ upload_methods:
+ - access_url:
+ url: https://my-bucket.s3.amazonaws.com/uploads/drs_object_123456
+ region: us-east-1
+ type: s3
+ upload_details:
+ access_key_id: AKIAIOSFODNN7EXAMPLE
+ bucket: my-bucket
+ expires_at: 2024-01-01T12:00:00Z
+ key: uploads/drs_object_123456
+ secret_access_key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
+ session_token: AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE
+ schema:
+ $ref: '#/components/schemas/UploadResponse'
+ description: Upload request processed successfully. Returns upload methods and temporary credentials for the requested files.
+ "400":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is malformed.
+ "401":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The request is unauthorized.
+ "403":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: The requester is not authorized to perform this action.
+ "500":
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/Error'
+ description: An unexpected error occurred.
+ security:
+ - {}
+ - BasicAuth: []
+ - BearerAuth: []
+ - PassportAuth: []
+ summary: Request upload methods for files
+ tags:
+ - Upload Request
+security:
+ - {}
+ - BasicAuth: []
+ - BearerAuth: []
+servers:
+ - url: https://{serverURL}/ga4gh/drs/v1
+ variables:
+ serverURL:
+ default: drs.example.org
+ description: |
+ DRS server endpoints MUST be prefixed by the '/ga4gh/drs/v1' endpoint path
+tags:
+ - name: Introduction
+ - name: DRS API Principles
+ - name: Authorization & Authentication
+ - name: Objects
+ - name: Upload Request
+ - name: Access Method Updates
+ - name: Service Info
+ - description: |
+
+ name: AccessMethodModel
+ x-displayName: AccessMethod
+ - description: |
+
+ name: AccessURLModel
+ x-displayName: AccessURL
+ - description: |
+
+ name: ChecksumModel
+ x-displayName: Checksum
+ - description: |
+
+ name: ContentsObjectModel
+ x-displayName: ContentsObject
+ - description: |
+
+ name: DrsObjectModel
+ x-displayName: DrsObject
+ - description: |
+
+ name: DrsObjectCandidateModel
+ x-displayName: DrsObjectCandidate
+ - description: |
+
+ name: ErrorModel
+ x-displayName: Error
+ - description: |
+
+ name: UploadRequestModel
+ x-displayName: UploadRequest
+ - description: |
+
+ name: UploadResponseModel
+ x-displayName: UploadResponse
+ - description: |
+
+ name: UploadRequestObjectModel
+ x-displayName: UploadRequestObject
+ - description: |
+
+ name: UploadResponseObjectModel
+ x-displayName: UploadResponseObject
+ - description: |
+
+ name: UploadMethodModel
+ x-displayName: UploadMethod
+ - description: |
+
+ name: DeleteRequestModel
+ x-displayName: DeleteRequest
+ - description: |
+
+ name: BulkDeleteRequestModel
+ x-displayName: BulkDeleteRequest
+ - description: |
+
+ name: DeleteResultModel
+ x-displayName: DeleteResult
+ - description: |
+
+ name: BulkDeleteResponseModel
+ x-displayName: BulkDeleteResponse
+ - name: Motivation
+ - name: Working With Compound Objects
+ - name: Background Notes on DRS URIs
+ - name: Compact Identifier-Based URIs
+ - name: Hostname-Based URIs
+ - name: GA4GH Service Registry
+ - name: Upload Requests and Object Registration
+ - name: Object Deletion
+ - name: Access Method Update
+x-tagGroups:
+ - name: Overview
+ tags:
+ - Introduction
+ - DRS API Principles
+ - Authorization & Authentication
+ - name: Operations
+ tags:
+ - Objects
+ - Upload Request
+ - Service Info
+ - name: Models
+ tags:
+ - AccessMethodModel
+ - AccessURLModel
+ - ChecksumModel
+ - ContentsObjectModel
+ - DrsObjectModel
+ - DrsObjectCandidateModel
+ - ErrorModel
+ - UploadRequestModel
+ - UploadResponseModel
+ - UploadRequestObjectModel
+ - UploadResponseObjectModel
+ - UploadMethodModel
+ - DeleteRequestModel
+ - BulkDeleteRequestModel
+ - DeleteResultModel
+ - BulkDeleteResponseModel
+ - name: Appendices
+ tags:
+ - Motivation
+ - Working With Compound Objects
+ - Background Notes on DRS URIs
+ - Compact Identifier-Based URIs
+ - Hostname-Based URIs
+ - GA4GH Service Registry
+ - Upload Requests and Object Registration
+ - Object Deletion
+ - Access Method Update
diff --git a/internal/apigen/go.mod b/internal/apigen/go.mod
new file mode 100644
index 0000000..0270e51
--- /dev/null
+++ b/internal/apigen/go.mod
@@ -0,0 +1,32 @@
+module github.com/calypr/drs-server
+
+go 1.24.0
+
+require github.com/gin-gonic/gin v1.9.1
+
+require (
+ github.com/bytedance/sonic v1.9.1 // indirect
+ github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect
+ github.com/gabriel-vasile/mimetype v1.4.2 // indirect
+ github.com/gin-contrib/sse v0.1.0 // indirect
+ github.com/go-playground/locales v0.14.1 // indirect
+ github.com/go-playground/universal-translator v0.18.1 // indirect
+ github.com/go-playground/validator/v10 v10.14.0 // indirect
+ github.com/goccy/go-json v0.10.2 // indirect
+ github.com/json-iterator/go v1.1.12 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.4 // indirect
+ github.com/leodido/go-urn v1.2.4 // indirect
+ github.com/mattn/go-isatty v0.0.19 // indirect
+ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+ github.com/modern-go/reflect2 v1.0.2 // indirect
+ github.com/pelletier/go-toml/v2 v2.0.8 // indirect
+ github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
+ github.com/ugorji/go/codec v1.2.11 // indirect
+ golang.org/x/arch v0.3.0 // indirect
+ golang.org/x/crypto v0.45.0 // indirect
+ golang.org/x/net v0.47.0 // indirect
+ golang.org/x/sys v0.38.0 // indirect
+ golang.org/x/text v0.31.0 // indirect
+ google.golang.org/protobuf v1.33.0 // indirect
+ gopkg.in/yaml.v3 v3.0.1 // indirect
+)
diff --git a/internal/apigen/go.sum b/internal/apigen/go.sum
new file mode 100644
index 0000000..1bbfa6f
--- /dev/null
+++ b/internal/apigen/go.sum
@@ -0,0 +1,49 @@
+github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
+github.com/bytedance/sonic v1.9.1/go.mod h1:i736AoUSYt75HyZLoJW9ERYxcy6eaN6h4BZXU064P/U=
+github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.14.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
+github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
+github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
+github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4=
+golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
+golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
+golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM=
+google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
diff --git a/internal/apigen/go/README.md b/internal/apigen/go/README.md
new file mode 100644
index 0000000..1c63a9d
--- /dev/null
+++ b/internal/apigen/go/README.md
@@ -0,0 +1,41 @@
+# Go API Server for openapi
+
+No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+
+## Overview
+This server was generated by the [openapi-generator]
+(https://openapi-generator.tech) project.
+By using the [OpenAPI-Spec](https://github.com/OAI/OpenAPI-Specification) from a remote server, you can easily generate a server stub.
+-
+
+To see how to make this your own, look here:
+
+[README](https://openapi-generator.tech)
+
+- API version: 1.5.0
+- Build date: 2025-12-22T21:29:17.216805507Z[Etc/UTC]
+- Generator version: 7.18.0-SNAPSHOT
+
+### Running the server
+
+To run the server, follow these simple steps:
+
+```
+go run main.go
+```
+
+To run the server in a docker container
+```
+docker build --network=host -t openapi .
+```
+
+Once the image is built, just run
+```
+docker run --rm -it openapi
+```
+
+### Known Issue
+
+Endpoints sharing a common path may result in issues. For example, `/v2/pet/findByTags` and `/v2/pet/:petId` will result in an issue with the Gin framework. For more information about this known limitation, please refer to [gin-gonic/gin#388](https://github.com/gin-gonic/gin/issues/388) for more information.
+
+A workaround is to manually update the path and handler. Please refer to [gin-gonic/gin/issues/205#issuecomment-296155497](https://github.com/gin-gonic/gin/issues/205#issuecomment-296155497) for more information.
diff --git a/internal/apigen/go/api_objects.go b/internal/apigen/go/api_objects.go
new file mode 100644
index 0000000..3d82e2c
--- /dev/null
+++ b/internal/apigen/go/api_objects.go
@@ -0,0 +1,117 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+import (
+ "github.com/gin-gonic/gin"
+)
+
+type ObjectsAPI struct {
+}
+
+// Post /ga4gh/drs/v1/objects/delete
+// Delete multiple DRS objects
+func (api *ObjectsAPI) BulkDeleteObjects(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
+// Post /ga4gh/drs/v1/objects/access-methods
+// Bulk update access methods for multiple DRS objects
+func (api *ObjectsAPI) BulkUpdateAccessMethods(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
+// Post /ga4gh/drs/v1/objects/:object_id/delete
+// Delete a DRS object (optional endpoint)
+func (api *ObjectsAPI) DeleteObject(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
+// Get /ga4gh/drs/v1/objects/:object_id/access/:access_id
+// Get a URL for fetching bytes
+func (api *ObjectsAPI) GetAccessURL(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
+// Post /ga4gh/drs/v1/objects/access
+// Get URLs for fetching bytes from multiple objects with an optional Passport(s).
+func (api *ObjectsAPI) GetBulkAccessURL(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
+// Post /ga4gh/drs/v1/objects
+// Get info about multiple DrsObjects with an optional Passport(s).
+func (api *ObjectsAPI) GetBulkObjects(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
+// Get /ga4gh/drs/v1/objects/:object_id
+// Get info about a DrsObject.
+func (api *ObjectsAPI) GetObject(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
+// Get /ga4gh/drs/v1/objects/checksum/:checksum
+// Get DRS objects that are a match for the checksum.
+func (api *ObjectsAPI) GetObjectsByChecksum(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
+// Options /ga4gh/drs/v1/objects
+// Get Authorization info about multiple DrsObjects.
+func (api *ObjectsAPI) OptionsBulkObject(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
+// Options /ga4gh/drs/v1/objects/:object_id
+// Get Authorization info about a DrsObject.
+func (api *ObjectsAPI) OptionsObject(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
+// Post /ga4gh/drs/v1/objects/:object_id/access/:access_id
+// Get a URL for fetching bytes through POST'ing a Passport
+func (api *ObjectsAPI) PostAccessURL(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
+// Post /ga4gh/drs/v1/objects/:object_id
+// Get info about a DrsObject through POST'ing a Passport.
+func (api *ObjectsAPI) PostObject(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
+// Post /ga4gh/drs/v1/objects/register
+// Register DRS objects
+func (api *ObjectsAPI) RegisterObjects(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
+// Post /ga4gh/drs/v1/objects/:object_id/access-methods
+// Update access methods for a DRS object
+func (api *ObjectsAPI) UpdateObjectAccessMethods(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
diff --git a/internal/apigen/go/api_service_info.go b/internal/apigen/go/api_service_info.go
new file mode 100644
index 0000000..e7ba843
--- /dev/null
+++ b/internal/apigen/go/api_service_info.go
@@ -0,0 +1,26 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+import (
+ "github.com/gin-gonic/gin"
+)
+
+type ServiceInfoAPI struct {
+}
+
+// Get /ga4gh/drs/v1/service-info
+// Retrieve information about this service
+func (api *ServiceInfoAPI) GetServiceInfo(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
diff --git a/internal/apigen/go/api_upload_request.go b/internal/apigen/go/api_upload_request.go
new file mode 100644
index 0000000..0a7bafb
--- /dev/null
+++ b/internal/apigen/go/api_upload_request.go
@@ -0,0 +1,26 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+import (
+ "github.com/gin-gonic/gin"
+)
+
+type UploadRequestAPI struct {
+}
+
+// Post /ga4gh/drs/v1/upload-request
+// Request upload methods for files
+func (api *UploadRequestAPI) PostUploadRequest(c *gin.Context) {
+ // Your handler implementation
+ c.JSON(200, gin.H{"status": "OK"})
+}
+
diff --git a/internal/apigen/go/model_access_method.go b/internal/apigen/go/model_access_method.go
new file mode 100644
index 0000000..df9297b
--- /dev/null
+++ b/internal/apigen/go/model_access_method.go
@@ -0,0 +1,33 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type AccessMethod struct {
+
+ // Type of the access method.
+ Type string `json:"type"`
+
+ AccessUrl AccessMethodAccessUrl `json:"access_url,omitempty"`
+
+ // An arbitrary string to be passed to the `/access` method to get an `AccessURL`. This string must be unique within the scope of a single object. Note that at least one of `access_url` and `access_id` must be provided.
+ AccessId string `json:"access_id,omitempty"`
+
+ // Name of the cloud service provider that the object belongs to. If the cloud service is Amazon Web Services, Google Cloud Platform or Azure the values should be `aws`, `gcp`, or `azure` respectively.
+ Cloud string `json:"cloud,omitempty"`
+
+ // Name of the region in the cloud service provider that the object belongs to.
+ Region string `json:"region,omitempty"`
+
+ // Availablity of file in the cloud. This label defines if this file is immediately accessible via DRS. Any delay or requirement of thawing mechanism if the file is in offline/archival storage is classified as false, meaning it is unavailable.
+ Available bool `json:"available,omitempty"`
+
+ Authorizations AccessMethodAuthorizations `json:"authorizations,omitempty"`
+}
diff --git a/internal/apigen/go/model_access_method_access_url.go b/internal/apigen/go/model_access_method_access_url.go
new file mode 100644
index 0000000..26da91d
--- /dev/null
+++ b/internal/apigen/go/model_access_method_access_url.go
@@ -0,0 +1,20 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type AccessMethodAccessUrl struct {
+
+ // A fully resolvable URL that can be used to fetch the actual object bytes.
+ Url string `json:"url"`
+
+ // An optional list of headers to include in the HTTP request to `url`. These headers can be used to provide auth tokens required to fetch the object bytes.
+ Headers []string `json:"headers,omitempty"`
+}
diff --git a/internal/apigen/go/model_access_method_authorizations.go b/internal/apigen/go/model_access_method_authorizations.go
new file mode 100644
index 0000000..b8528fc
--- /dev/null
+++ b/internal/apigen/go/model_access_method_authorizations.go
@@ -0,0 +1,25 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type AccessMethodAuthorizations struct {
+
+ DrsObjectId string `json:"drs_object_id,omitempty"`
+
+ // An Optional list of support authorization types. More than one can be supported and tried in sequence. Defaults to `None` if empty or missing.
+ SupportedTypes []string `json:"supported_types,omitempty"`
+
+ // If authorizations contain `PassportAuth` this is a required list of visa issuers (as found in a visa's `iss` claim) that may authorize access to this object. The caller must only provide passports that contain visas from this list. It is strongly recommended that the caller validate that it is appropriate to send the requested passport/visa to the DRS server to mitigate attacks by malicious DRS servers requesting credentials they should not have.
+ PassportAuthIssuers []string `json:"passport_auth_issuers,omitempty"`
+
+ // If authorizations contain `BearerAuth` this is an optional list of issuers that may authorize access to this object. The caller must provide a token from one of these issuers. If this is empty or missing it assumed the caller knows which token to send via other means. It is strongly recommended that the caller validate that it is appropriate to send the requested token to the DRS server to mitigate attacks by malicious DRS servers requesting credentials they should not have.
+ BearerAuthIssuers []string `json:"bearer_auth_issuers,omitempty"`
+}
diff --git a/internal/apigen/go/model_access_method_update_request.go b/internal/apigen/go/model_access_method_update_request.go
new file mode 100644
index 0000000..da7faf8
--- /dev/null
+++ b/internal/apigen/go/model_access_method_update_request.go
@@ -0,0 +1,20 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type AccessMethodUpdateRequest struct {
+
+ // New access methods for the DRS object
+ AccessMethods []AccessMethod `json:"access_methods"`
+
+ // Optional GA4GH Passport JWTs for authorization
+ Passports []string `json:"passports,omitempty"`
+}
diff --git a/internal/apigen/go/model_access_url.go b/internal/apigen/go/model_access_url.go
new file mode 100644
index 0000000..255b83f
--- /dev/null
+++ b/internal/apigen/go/model_access_url.go
@@ -0,0 +1,20 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type AccessUrl struct {
+
+ // A fully resolvable URL that can be used to fetch the actual object bytes.
+ Url string `json:"url"`
+
+ // An optional list of headers to include in the HTTP request to `url`. These headers can be used to provide auth tokens required to fetch the object bytes.
+ Headers []string `json:"headers,omitempty"`
+}
diff --git a/internal/apigen/go/model_authorizations.go b/internal/apigen/go/model_authorizations.go
new file mode 100644
index 0000000..089d305
--- /dev/null
+++ b/internal/apigen/go/model_authorizations.go
@@ -0,0 +1,25 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type Authorizations struct {
+
+ DrsObjectId string `json:"drs_object_id,omitempty"`
+
+ // An Optional list of support authorization types. More than one can be supported and tried in sequence. Defaults to `None` if empty or missing.
+ SupportedTypes []string `json:"supported_types,omitempty"`
+
+ // If authorizations contain `PassportAuth` this is a required list of visa issuers (as found in a visa's `iss` claim) that may authorize access to this object. The caller must only provide passports that contain visas from this list. It is strongly recommended that the caller validate that it is appropriate to send the requested passport/visa to the DRS server to mitigate attacks by malicious DRS servers requesting credentials they should not have.
+ PassportAuthIssuers []string `json:"passport_auth_issuers,omitempty"`
+
+ // If authorizations contain `BearerAuth` this is an optional list of issuers that may authorize access to this object. The caller must provide a token from one of these issuers. If this is empty or missing it assumed the caller knows which token to send via other means. It is strongly recommended that the caller validate that it is appropriate to send the requested token to the DRS server to mitigate attacks by malicious DRS servers requesting credentials they should not have.
+ BearerAuthIssuers []string `json:"bearer_auth_issuers,omitempty"`
+}
diff --git a/internal/apigen/go/model_bulk_access_method_update_request.go b/internal/apigen/go/model_bulk_access_method_update_request.go
new file mode 100644
index 0000000..b5acbce
--- /dev/null
+++ b/internal/apigen/go/model_bulk_access_method_update_request.go
@@ -0,0 +1,20 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type BulkAccessMethodUpdateRequest struct {
+
+ // Array of access method updates to perform
+ Updates []BulkAccessMethodUpdateRequestUpdatesInner `json:"updates"`
+
+ // Optional GA4GH Passport JWTs for authorization
+ Passports []string `json:"passports,omitempty"`
+}
diff --git a/internal/apigen/go/model_bulk_access_method_update_request_updates_inner.go b/internal/apigen/go/model_bulk_access_method_update_request_updates_inner.go
new file mode 100644
index 0000000..b0f2450
--- /dev/null
+++ b/internal/apigen/go/model_bulk_access_method_update_request_updates_inner.go
@@ -0,0 +1,20 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type BulkAccessMethodUpdateRequestUpdatesInner struct {
+
+ // DRS object ID to update
+ ObjectId string `json:"object_id"`
+
+ // New access methods for this object
+ AccessMethods []AccessMethod `json:"access_methods"`
+}
diff --git a/internal/apigen/go/model_bulk_access_url.go b/internal/apigen/go/model_bulk_access_url.go
new file mode 100644
index 0000000..a3ff812
--- /dev/null
+++ b/internal/apigen/go/model_bulk_access_url.go
@@ -0,0 +1,24 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type BulkAccessUrl struct {
+
+ DrsObjectId string `json:"drs_object_id,omitempty"`
+
+ DrsAccessId string `json:"drs_access_id,omitempty"`
+
+ // A fully resolvable URL that can be used to fetch the actual object bytes.
+ Url string `json:"url"`
+
+ // An optional list of headers to include in the HTTP request to `url`. These headers can be used to provide auth tokens required to fetch the object bytes.
+ Headers []string `json:"headers,omitempty"`
+}
diff --git a/internal/apigen/go/model_bulk_delete_request.go b/internal/apigen/go/model_bulk_delete_request.go
new file mode 100644
index 0000000..31a041a
--- /dev/null
+++ b/internal/apigen/go/model_bulk_delete_request.go
@@ -0,0 +1,24 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+// BulkDeleteRequest - Request body for bulk delete operations
+type BulkDeleteRequest struct {
+
+ // Array of DRS object IDs to delete
+ BulkObjectIds []string `json:"bulk_object_ids"`
+
+ // the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
+ Passports []string `json:"passports,omitempty"`
+
+ // If true, delete both DRS object metadata and underlying storage data (follows server's deleteStorageDataSupported capability). If false (default), only delete DRS object metadata while preserving underlying storage data. Clients must explicitly set this to true to enable storage data deletion, ensuring intentional choice for this potentially destructive operation.
+ DeleteStorageData bool `json:"delete_storage_data,omitempty"`
+}
diff --git a/internal/apigen/go/model_bulk_object_access_id.go b/internal/apigen/go/model_bulk_object_access_id.go
new file mode 100644
index 0000000..fca4451
--- /dev/null
+++ b/internal/apigen/go/model_bulk_object_access_id.go
@@ -0,0 +1,19 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+// BulkObjectAccessId - The object that contains object_id/access_id tuples
+type BulkObjectAccessId struct {
+
+ Passports []string `json:"passports,omitempty"`
+
+ BulkObjectAccessIds []BulkObjectAccessIdBulkObjectAccessIdsInner `json:"bulk_object_access_ids,omitempty"`
+}
diff --git a/internal/apigen/go/model_bulk_object_access_id_bulk_object_access_ids_inner.go b/internal/apigen/go/model_bulk_object_access_id_bulk_object_access_ids_inner.go
new file mode 100644
index 0000000..c29d191
--- /dev/null
+++ b/internal/apigen/go/model_bulk_object_access_id_bulk_object_access_ids_inner.go
@@ -0,0 +1,20 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type BulkObjectAccessIdBulkObjectAccessIdsInner struct {
+
+ // DRS object ID
+ BulkObjectId string `json:"bulk_object_id,omitempty"`
+
+ // DRS object access ID
+ BulkAccessIds []string `json:"bulk_access_ids,omitempty"`
+}
diff --git a/internal/apigen/go/model_bulk_object_id_no_passport.go b/internal/apigen/go/model_bulk_object_id_no_passport.go
new file mode 100644
index 0000000..82d9e5a
--- /dev/null
+++ b/internal/apigen/go/model_bulk_object_id_no_passport.go
@@ -0,0 +1,18 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+// BulkObjectIdNoPassport - The object that contains the DRS object IDs array
+type BulkObjectIdNoPassport struct {
+
+ // An array of ObjectIDs.
+ BulkObjectIds []string `json:"bulk_object_ids,omitempty"`
+}
diff --git a/internal/apigen/go/model_bulk_update_access_methods_200_response.go b/internal/apigen/go/model_bulk_update_access_methods_200_response.go
new file mode 100644
index 0000000..def98f7
--- /dev/null
+++ b/internal/apigen/go/model_bulk_update_access_methods_200_response.go
@@ -0,0 +1,17 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type BulkUpdateAccessMethods200Response struct {
+
+ // Array of updated DRS objects
+ Objects []DrsObject `json:"objects"`
+}
diff --git a/internal/apigen/go/model_checksum.go b/internal/apigen/go/model_checksum.go
new file mode 100644
index 0000000..955cf5b
--- /dev/null
+++ b/internal/apigen/go/model_checksum.go
@@ -0,0 +1,20 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type Checksum struct {
+
+ // The hex-string encoded checksum for the data
+ Checksum string `json:"checksum"`
+
+ // The digest method used to create the checksum. The value (e.g. `sha-256`) SHOULD be listed as `Hash Name String` in the https://www.iana.org/assignments/named-information/named-information.xhtml#hash-alg[IANA Named Information Hash Algorithm Registry]. Other values MAY be used, as long as implementors are aware of the issues discussed in https://tools.ietf.org/html/rfc6920#section-9.4[RFC6920]. GA4GH may provide more explicit guidance for use of non-IANA-registered algorithms in the future. Until then, if implementers do choose such an algorithm (e.g. because it's implemented by their storage provider), they SHOULD use an existing standard `type` value such as `md5`, `etag`, `crc32c`, `trunc512`, or `sha1`.
+ Type string `json:"type"`
+}
diff --git a/internal/apigen/go/model_contents_object.go b/internal/apigen/go/model_contents_object.go
new file mode 100644
index 0000000..05e4787
--- /dev/null
+++ b/internal/apigen/go/model_contents_object.go
@@ -0,0 +1,26 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type ContentsObject struct {
+
+ // A name declared by the bundle author that must be used when materialising this object, overriding any name directly associated with the object itself. The name must be unique within the containing bundle. This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].
+ Name string `json:"name"`
+
+ // A DRS identifier of a `DrsObject` (either a single blob or a nested bundle). If this ContentsObject is an object within a nested bundle, then the id is optional. Otherwise, the id is required.
+ Id string `json:"id,omitempty"`
+
+ // A list of full DRS identifier URI paths that may be used to obtain the object. These URIs may be external to this DRS instance.
+ DrsUri []string `json:"drs_uri,omitempty"`
+
+ // If this ContentsObject describes a nested bundle and the caller specified \"?expand=true\" on the request, then this contents array must be present and describe the objects within the nested bundle.
+ Contents []ContentsObject `json:"contents,omitempty"`
+}
diff --git a/internal/apigen/go/model_delete_request.go b/internal/apigen/go/model_delete_request.go
new file mode 100644
index 0000000..b767490
--- /dev/null
+++ b/internal/apigen/go/model_delete_request.go
@@ -0,0 +1,21 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+// DeleteRequest - Request body for single object delete operations
+type DeleteRequest struct {
+
+ // the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
+ Passports []string `json:"passports,omitempty"`
+
+ // If true, delete both DRS object metadata and underlying storage data (follows server's deleteStorageDataSupported capability). If false (default), only delete DRS object metadata while preserving underlying storage data. Clients must explicitly set this to true to enable storage data deletion, ensuring intentional choice for this potentially destructive operation.
+ DeleteStorageData bool `json:"delete_storage_data,omitempty"`
+}
diff --git a/internal/apigen/go/model_drs_object.go b/internal/apigen/go/model_drs_object.go
new file mode 100644
index 0000000..70bdd78
--- /dev/null
+++ b/internal/apigen/go/model_drs_object.go
@@ -0,0 +1,57 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+import (
+ "time"
+)
+
+type DrsObject struct {
+
+ // An identifier unique to this `DrsObject`
+ Id string `json:"id"`
+
+ // A string that can be used to name a `DrsObject`. This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].
+ Name string `json:"name,omitempty"`
+
+ // A drs:// hostname-based URI, as defined in the DRS documentation, that tells clients how to access this object. The intent of this field is to make DRS objects self-contained, and therefore easier for clients to store and pass around. For example, if you arrive at this DRS JSON by resolving a compact identifier-based DRS URI, the `self_uri` presents you with a hostname and properly encoded DRS ID for use in subsequent `access` endpoint calls.
+ SelfUri string `json:"self_uri"`
+
+ // For blobs, the blob size in bytes. For bundles, the cumulative size, in bytes, of items in the `contents` field.
+ Size int64 `json:"size"`
+
+ // Timestamp of content creation in RFC3339. (This is the creation time of the underlying content, not of the JSON object.)
+ CreatedTime time.Time `json:"created_time"`
+
+ // Timestamp of content update in RFC3339, identical to `created_time` in systems that do not support updates. (This is the update time of the underlying content, not of the JSON object.)
+ UpdatedTime time.Time `json:"updated_time,omitempty"`
+
+ // A string representing a version. (Some systems may use checksum, a RFC3339 timestamp, or an incrementing version number.)
+ Version string `json:"version,omitempty"`
+
+ // A string providing the mime-type of the `DrsObject`.
+ MimeType string `json:"mime_type,omitempty"`
+
+ // The checksum of the `DrsObject`. At least one checksum must be provided. For blobs, the checksum is computed over the bytes in the blob. For bundles, the checksum is computed over a sorted concatenation of the checksums of its top-level contained objects (not recursive, names not included). The list of checksums is sorted alphabetically (hex-code) before concatenation and a further checksum is performed on the concatenated checksum value. For example, if a bundle contains blobs with the following checksums: md5(blob1) = 72794b6d md5(blob2) = 5e089d29 Then the checksum of the bundle is: md5( concat( sort( md5(blob1), md5(blob2) ) ) ) = md5( concat( sort( 72794b6d, 5e089d29 ) ) ) = md5( concat( 5e089d29, 72794b6d ) ) = md5( 5e089d2972794b6d ) = f7a29a04
+ Checksums []Checksum `json:"checksums"`
+
+ // The list of access methods that can be used to fetch the `DrsObject`. Required for single blobs; optional for bundles.
+ AccessMethods []AccessMethod `json:"access_methods,omitempty"`
+
+ // If not set, this `DrsObject` is a single blob. If set, this `DrsObject` is a bundle containing the listed `ContentsObject` s (some of which may be further nested).
+ Contents []ContentsObject `json:"contents,omitempty"`
+
+ // A human readable description of the `DrsObject`.
+ Description string `json:"description,omitempty"`
+
+ // A list of strings that can be used to find other metadata about this `DrsObject` from external metadata sources. These aliases can be used to represent secondary accession numbers or external GUIDs.
+ Aliases []string `json:"aliases,omitempty"`
+}
diff --git a/internal/apigen/go/model_drs_object_candidate.go b/internal/apigen/go/model_drs_object_candidate.go
new file mode 100644
index 0000000..3920034
--- /dev/null
+++ b/internal/apigen/go/model_drs_object_candidate.go
@@ -0,0 +1,41 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type DrsObjectCandidate struct {
+
+ // A string that can be used to name a `DrsObject`. This string is made up of uppercase and lowercase letters, decimal digits, hyphen, period, and underscore [A-Za-z0-9.-_]. See http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_282[portable filenames].
+ Name string `json:"name,omitempty"`
+
+ // For blobs, the blob size in bytes. For bundles, the cumulative size, in bytes, of items in the `contents` field.
+ Size int64 `json:"size"`
+
+ // A string representing a version. (Some systems may use checksum, a RFC3339 timestamp, or an incrementing version number.)
+ Version string `json:"version,omitempty"`
+
+ // A string providing the mime-type of the `DrsObject`.
+ MimeType string `json:"mime_type,omitempty"`
+
+ // The checksum of the `DrsObject`. At least one checksum must be provided. For blobs, the checksum is computed over the bytes in the blob. For bundles, the checksum is computed over a sorted concatenation of the checksums of its top-level contained objects (not recursive, names not included). The list of checksums is sorted alphabetically (hex-code) before concatenation and a further checksum is performed on the concatenated checksum value. For example, if a bundle contains blobs with the following checksums: md5(blob1) = 72794b6d md5(blob2) = 5e089d29 Then the checksum of the bundle is: md5( concat( sort( md5(blob1), md5(blob2) ) ) ) = md5( concat( sort( 72794b6d, 5e089d29 ) ) ) = md5( concat( 5e089d29, 72794b6d ) ) = md5( 5e089d2972794b6d ) = f7a29a04
+ Checksums []Checksum `json:"checksums"`
+
+ // The list of access methods that can be used to fetch the `DrsObject`. Required for single blobs; optional for bundles.
+ AccessMethods []AccessMethod `json:"access_methods,omitempty"`
+
+ // If not set, this `DrsObject` is a single blob. If set, this `DrsObject` is a bundle containing the listed `ContentsObject` s (some of which may be further nested).
+ Contents []ContentsObject `json:"contents,omitempty"`
+
+ // A human readable description of the `DrsObject`.
+ Description string `json:"description,omitempty"`
+
+ // A list of strings that can be used to find other metadata about this `DrsObject` from external metadata sources. These aliases can be used to represent secondary accession numbers or external GUIDs.
+ Aliases []string `json:"aliases,omitempty"`
+}
diff --git a/internal/apigen/go/model_drs_service.go b/internal/apigen/go/model_drs_service.go
new file mode 100644
index 0000000..946533c
--- /dev/null
+++ b/internal/apigen/go/model_drs_service.go
@@ -0,0 +1,21 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type DrsService struct {
+
+ // DEPRECATED - In 2.0 this will move to under the drs section of service info and not at the root level. The max length the bulk request endpoints can handle (>= 1) before generating a 413 error e.g. how long can the arrays bulk_object_ids and bulk_object_access_ids be for this server.
+ MaxBulkRequestLength int32 `json:"maxBulkRequestLength"`
+
+ Type DrsServiceType `json:"type"`
+
+ Drs DrsServiceDrs `json:"drs,omitempty"`
+}
diff --git a/internal/apigen/go/model_drs_service_drs.go b/internal/apigen/go/model_drs_service_drs.go
new file mode 100644
index 0000000..7b933c9
--- /dev/null
+++ b/internal/apigen/go/model_drs_service_drs.go
@@ -0,0 +1,68 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type DrsServiceDrs struct {
+
+ // The max length the bulk request endpoints can handle (>= 1) before generating a 413 error e.g. how long can the arrays bulk_object_ids and bulk_object_access_ids be for this server.
+ MaxBulkRequestLength int32 `json:"maxBulkRequestLength"`
+
+ // The total number of objects in this DRS service.
+ ObjectCount int32 `json:"objectCount,omitempty"`
+
+ // The total size of all objects in this DRS service in bytes. As a general best practice, file bytes are counted for each unique file and not cloud mirrors or other redundant copies.
+ TotalObjectSize int32 `json:"totalObjectSize,omitempty"`
+
+ // Indicates whether this DRS server supports upload request operations via the `/upload-request` endpoint. If true, clients can request upload methods and credentials for uploading files. If false or missing, the server does not support upload request coordination.
+ UploadRequestSupported bool `json:"uploadRequestSupported,omitempty"`
+
+ // Indicates whether this DRS server supports object registration operations via the `/objects/register` endpoint. If true, clients can register uploaded files or existing data as DRS objects. If false or missing, the server does not support object registration.
+ ObjectRegistrationSupported bool `json:"objectRegistrationSupported,omitempty"`
+
+ // List of upload methods supported by this DRS server. Only present when uploadRequestSupported is true. Clients can use this information to determine which upload methods are available before making upload requests. - **s3**: Direct S3 upload with temporary AWS credentials - **gs**: Google Cloud Storage upload with access tokens - **https**: Presigned POST URL for HTTP uploads - **ftp**: File Transfer Protocol uploads - **sftp**: Secure File Transfer Protocol uploads - **gsiftp**: GridFTP secure file transfer - **globus**: Globus transfer service for high-performance data movement
+ SupportedUploadMethods []string `json:"supportedUploadMethods,omitempty"`
+
+ // Maximum file size in bytes that can be uploaded via the upload endpoints. Only present when uploadRequestSupported is true. If not specified, there is no explicit size limit.
+ MaxUploadSize int64 `json:"maxUploadSize,omitempty"`
+
+ // Maximum number of files that can be included in a single upload request. Only present when uploadRequestSupported is true. If not specified, defaults to the same value as maxBulkRequestLength.
+ MaxUploadRequestLength int32 `json:"maxUploadRequestLength,omitempty"`
+
+ // Maximum number of candidate objects that can be included in a single registration request. Only present when objectRegistrationSupported is true. If not specified, defaults to the same value as maxBulkRequestLength.
+ MaxRegisterRequestLength int32 `json:"maxRegisterRequestLength,omitempty"`
+
+ // Indicates whether this DRS server validates uploaded file checksums against the provided metadata. If true, the server will verify that uploaded files match their declared checksums and may reject uploads with mismatches. If false or missing, the server does not perform checksum validation and relies on client-provided metadata. Only present when uploadRequestSupported or objectRegistrationSupported is true.
+ ValidateUploadChecksums bool `json:"validateUploadChecksums,omitempty"`
+
+ // Indicates whether this DRS server validates uploaded file sizes against the provided metadata. If true, the server will verify that uploaded files match their declared sizes and may reject uploads with mismatches. If false or missing, the server does not perform file size validation and relies on client-provided metadata. Only present when uploadRequestSupported or objectRegistrationSupported is true.
+ ValidateUploadFileSizes bool `json:"validateUploadFileSizes,omitempty"`
+
+ // Indicates whether this DRS server supports storing files from the same upload request under a common prefix or folder structure. If true, the server will organize related files together in storage, enabling bioinformatics workflows that expect co-located files (e.g., CRAM + CRAI, VCF + TBI). If false or missing, the server may distribute files across different storage locations or prefixes. Only present when uploadRequestSupported is true. This feature is particularly valuable for genomics tools like samtools that expect index files to be co-located with data files.
+ RelatedFileStorageSupported bool `json:"relatedFileStorageSupported,omitempty"`
+
+ // Indicates whether this DRS server supports delete operations via the delete endpoints. If true, clients can delete DRS objects using POST requests to `/objects/{object_id}/delete` and `/objects/delete`. If false or missing, the server does not support delete operations and will return 404 for delete endpoint requests. Like upload functionality, delete support is entirely optional and servers remain DRS compliant without it.
+ DeleteSupported bool `json:"deleteSupported,omitempty"`
+
+ // Maximum number of objects that can be deleted in a single bulk delete request via `/objects/delete`. Only present when deleteSupported is true. If not specified when delete is supported, defaults to the same value as maxBulkRequestLength. Servers may enforce lower limits for delete operations compared to other bulk operations for safety reasons.
+ MaxBulkDeleteLength int32 `json:"maxBulkDeleteLength,omitempty"`
+
+ // Indicates whether this DRS server supports attempting to delete underlying storage data when clients request it. If true, the server will attempt to delete both metadata and storage files when `delete_storage_data: true` is specified in delete requests. If false or missing, the server only supports metadata deletion regardless of client request, preserving underlying storage data. Only present when deleteSupported is true. This is a capability flag indicating what the server can attempt, not a default behavior setting. Note: Storage deletion attempts may fail due to permissions, network issues, or storage service errors.
+ DeleteStorageDataSupported bool `json:"deleteStorageDataSupported,omitempty"`
+
+ // Indicates whether this DRS server supports updating access methods for existing objects. If true, clients can update access methods using `/objects/{object_id}/access-methods` and `/objects/access-methods` endpoints. If false or missing, the server does not support access method updates.
+ AccessMethodUpdateSupported bool `json:"accessMethodUpdateSupported,omitempty"`
+
+ // Maximum number of objects that can be updated in a single bulk access method update request. Only present when accessMethodUpdateSupported is true. If not specified, defaults to maxBulkRequestLength.
+ MaxBulkAccessMethodUpdateLength int32 `json:"maxBulkAccessMethodUpdateLength,omitempty"`
+
+ // Indicates whether this DRS server validates new access methods by verifying they point to the same data. If true, the server will attempt to verify checksums/content before updating access methods. If false or missing, the server trusts client-provided access methods without validation. Only present when accessMethodUpdateSupported is true.
+ ValidateAccessMethodUpdates bool `json:"validateAccessMethodUpdates,omitempty"`
+}
diff --git a/internal/apigen/go/model_drs_service_type.go b/internal/apigen/go/model_drs_service_type.go
new file mode 100644
index 0000000..0770489
--- /dev/null
+++ b/internal/apigen/go/model_drs_service_type.go
@@ -0,0 +1,16 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type DrsServiceType struct {
+
+ Artifact string `json:"artifact"`
+}
diff --git a/internal/apigen/go/model_error.go b/internal/apigen/go/model_error.go
new file mode 100644
index 0000000..377369e
--- /dev/null
+++ b/internal/apigen/go/model_error.go
@@ -0,0 +1,21 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+// Error - An object that can optionally include information about the error.
+type Error struct {
+
+ // A detailed error message.
+ Msg string `json:"msg,omitempty"`
+
+ // The integer representing the HTTP status code (e.g. 200, 404).
+ StatusCode int32 `json:"status_code,omitempty"`
+}
diff --git a/internal/apigen/go/model_get_bulk_access_url_200_response.go b/internal/apigen/go/model_get_bulk_access_url_200_response.go
new file mode 100644
index 0000000..2b51450
--- /dev/null
+++ b/internal/apigen/go/model_get_bulk_access_url_200_response.go
@@ -0,0 +1,21 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type GetBulkAccessUrl200Response struct {
+
+ Summary Summary `json:"summary,omitempty"`
+
+ // Error codes for each unresolved drs objects.
+ UnresolvedDrsObjects []UnresolvedInner `json:"unresolved_drs_objects,omitempty"`
+
+ ResolvedDrsObjectAccessUrls []BulkAccessUrl `json:"resolved_drs_object_access_urls,omitempty"`
+}
diff --git a/internal/apigen/go/model_get_bulk_objects_200_response.go b/internal/apigen/go/model_get_bulk_objects_200_response.go
new file mode 100644
index 0000000..f3b035c
--- /dev/null
+++ b/internal/apigen/go/model_get_bulk_objects_200_response.go
@@ -0,0 +1,21 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type GetBulkObjects200Response struct {
+
+ Summary Summary `json:"summary,omitempty"`
+
+ // Error codes for each unresolved drs objects.
+ UnresolvedDrsObjects []UnresolvedInner `json:"unresolved_drs_objects,omitempty"`
+
+ ResolvedDrsObject []DrsObject `json:"resolved_drs_object,omitempty"`
+}
diff --git a/internal/apigen/go/model_get_bulk_objects_request.go b/internal/apigen/go/model_get_bulk_objects_request.go
new file mode 100644
index 0000000..a51bdb8
--- /dev/null
+++ b/internal/apigen/go/model_get_bulk_objects_request.go
@@ -0,0 +1,20 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type GetBulkObjectsRequest struct {
+
+ // the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
+ Passports []string `json:"passports,omitempty"`
+
+ // An array of ObjectIDs to retrieve metadata for
+ BulkObjectIds []string `json:"bulk_object_ids"`
+}
diff --git a/internal/apigen/go/model_get_service_info_200_response.go b/internal/apigen/go/model_get_service_info_200_response.go
new file mode 100644
index 0000000..0b48b80
--- /dev/null
+++ b/internal/apigen/go/model_get_service_info_200_response.go
@@ -0,0 +1,54 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+import (
+ "time"
+)
+
+type GetServiceInfo200Response struct {
+
+ // Unique ID of this service. Reverse domain name notation is recommended, though not required. The identifier should attempt to be globally unique so it can be used in downstream aggregator services e.g. Service Registry.
+ Id string `json:"id"`
+
+ // Name of this service. Should be human readable.
+ Name string `json:"name"`
+
+ Type DrsServiceType `json:"type"`
+
+ // Description of the service. Should be human readable and provide information about the service.
+ Description string `json:"description,omitempty"`
+
+ Organization ServiceOrganization `json:"organization"`
+
+ // URL of the contact for the provider of this service, e.g. a link to a contact form (RFC 3986 format), or an email (RFC 2368 format).
+ ContactUrl string `json:"contactUrl,omitempty"`
+
+ // URL of the documentation of this service (RFC 3986 format). This should help someone learn how to use your service, including any specifics required to access data, e.g. authentication.
+ DocumentationUrl string `json:"documentationUrl,omitempty"`
+
+ // Timestamp describing when the service was first deployed and available (RFC 3339 format)
+ CreatedAt time.Time `json:"createdAt,omitempty"`
+
+ // Timestamp describing when the service was last updated (RFC 3339 format)
+ UpdatedAt time.Time `json:"updatedAt,omitempty"`
+
+ // Environment the service is running in. Use this to distinguish between production, development and testing/staging deployments. Suggested values are prod, test, dev, staging. However this is advised and not enforced.
+ Environment string `json:"environment,omitempty"`
+
+ // Version of the service being described. Semantic versioning is recommended, but other identifiers, such as dates or commit hashes, are also allowed. The version should be changed whenever the service is updated.
+ Version string `json:"version"`
+
+ // DEPRECATED - In 2.0 this will move to under the drs section of service info and not at the root level. The max length the bulk request endpoints can handle (>= 1) before generating a 413 error e.g. how long can the arrays bulk_object_ids and bulk_object_access_ids be for this server.
+ MaxBulkRequestLength int32 `json:"maxBulkRequestLength"`
+
+ Drs DrsServiceDrs `json:"drs,omitempty"`
+}
diff --git a/internal/apigen/go/model_options_bulk_object_200_response.go b/internal/apigen/go/model_options_bulk_object_200_response.go
new file mode 100644
index 0000000..987300b
--- /dev/null
+++ b/internal/apigen/go/model_options_bulk_object_200_response.go
@@ -0,0 +1,21 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type OptionsBulkObject200Response struct {
+
+ Summary Summary `json:"summary,omitempty"`
+
+ // Error codes for each unresolved drs objects.
+ UnresolvedDrsObjects []UnresolvedInner `json:"unresolved_drs_objects,omitempty"`
+
+ ResolvedDrsObject []Authorizations `json:"resolved_drs_object,omitempty"`
+}
diff --git a/internal/apigen/go/model_post_access_url_request.go b/internal/apigen/go/model_post_access_url_request.go
new file mode 100644
index 0000000..2ae55d6
--- /dev/null
+++ b/internal/apigen/go/model_post_access_url_request.go
@@ -0,0 +1,17 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type PostAccessUrlRequest struct {
+
+ // the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
+ Passports []string `json:"passports,omitempty"`
+}
diff --git a/internal/apigen/go/model_post_object_request.go b/internal/apigen/go/model_post_object_request.go
new file mode 100644
index 0000000..0d9e396
--- /dev/null
+++ b/internal/apigen/go/model_post_object_request.go
@@ -0,0 +1,20 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type PostObjectRequest struct {
+
+ // If false and the object_id refers to a bundle, then the ContentsObject array contains only those objects directly contained in the bundle. That is, if the bundle contains other bundles, those other bundles are not recursively included in the result. If true and the object_id refers to a bundle, then the entire set of objects in the bundle is expanded. That is, if the bundle contains other bundles, then those other bundles are recursively expanded and included in the result. Recursion continues through the entire sub-tree of the bundle. If the object_id refers to a blob, then the query parameter is ignored.
+ Expand bool `json:"expand,omitempty"`
+
+ // the encoded JWT GA4GH Passport that contains embedded Visas. The overall JWT is signed as are the individual Passport Visas.
+ Passports []string `json:"passports,omitempty"`
+}
diff --git a/internal/apigen/go/model_register_objects_201_response.go b/internal/apigen/go/model_register_objects_201_response.go
new file mode 100644
index 0000000..bb8b2a4
--- /dev/null
+++ b/internal/apigen/go/model_register_objects_201_response.go
@@ -0,0 +1,17 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type RegisterObjects201Response struct {
+
+ // Array of registered DRS objects in the same order as the candidates in the request
+ Objects []DrsObject `json:"objects"`
+}
diff --git a/internal/apigen/go/model_register_objects_request.go b/internal/apigen/go/model_register_objects_request.go
new file mode 100644
index 0000000..40da461
--- /dev/null
+++ b/internal/apigen/go/model_register_objects_request.go
@@ -0,0 +1,20 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type RegisterObjectsRequest struct {
+
+ // Array of DRS object candidates to register (server will mint IDs and timestamps)
+ Candidates []DrsObjectCandidate `json:"candidates"`
+
+ // Optional array of GA4GH Passport JWTs for authorization
+ Passports []string `json:"passports,omitempty"`
+}
diff --git a/internal/apigen/go/model_service.go b/internal/apigen/go/model_service.go
new file mode 100644
index 0000000..688a169
--- /dev/null
+++ b/internal/apigen/go/model_service.go
@@ -0,0 +1,50 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+import (
+ "time"
+)
+
+// Service - GA4GH service
+type Service struct {
+
+ // Unique ID of this service. Reverse domain name notation is recommended, though not required. The identifier should attempt to be globally unique so it can be used in downstream aggregator services e.g. Service Registry.
+ Id string `json:"id"`
+
+ // Name of this service. Should be human readable.
+ Name string `json:"name"`
+
+ Type ServiceType `json:"type"`
+
+ // Description of the service. Should be human readable and provide information about the service.
+ Description string `json:"description,omitempty"`
+
+ Organization ServiceOrganization `json:"organization"`
+
+ // URL of the contact for the provider of this service, e.g. a link to a contact form (RFC 3986 format), or an email (RFC 2368 format).
+ ContactUrl string `json:"contactUrl,omitempty"`
+
+ // URL of the documentation of this service (RFC 3986 format). This should help someone learn how to use your service, including any specifics required to access data, e.g. authentication.
+ DocumentationUrl string `json:"documentationUrl,omitempty"`
+
+ // Timestamp describing when the service was first deployed and available (RFC 3339 format)
+ CreatedAt time.Time `json:"createdAt,omitempty"`
+
+ // Timestamp describing when the service was last updated (RFC 3339 format)
+ UpdatedAt time.Time `json:"updatedAt,omitempty"`
+
+ // Environment the service is running in. Use this to distinguish between production, development and testing/staging deployments. Suggested values are prod, test, dev, staging. However this is advised and not enforced.
+ Environment string `json:"environment,omitempty"`
+
+ // Version of the service being described. Semantic versioning is recommended, but other identifiers, such as dates or commit hashes, are also allowed. The version should be changed whenever the service is updated.
+ Version string `json:"version"`
+}
diff --git a/internal/apigen/go/model_service_organization.go b/internal/apigen/go/model_service_organization.go
new file mode 100644
index 0000000..5fa529c
--- /dev/null
+++ b/internal/apigen/go/model_service_organization.go
@@ -0,0 +1,21 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+// ServiceOrganization - Organization providing the service
+type ServiceOrganization struct {
+
+ // Name of the organization responsible for the service
+ Name string `json:"name"`
+
+ // URL of the website of the organization (RFC 3986 format)
+ Url string `json:"url"`
+}
diff --git a/internal/apigen/go/model_service_type.go b/internal/apigen/go/model_service_type.go
new file mode 100644
index 0000000..ebd8929
--- /dev/null
+++ b/internal/apigen/go/model_service_type.go
@@ -0,0 +1,24 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+// ServiceType - Type of a GA4GH service
+type ServiceType struct {
+
+ // Namespace in reverse domain name format. Use `org.ga4gh` for implementations compliant with official GA4GH specifications. For services with custom APIs not standardized by GA4GH, or implementations diverging from official GA4GH specifications, use a different namespace (e.g. your organization's reverse domain name).
+ Group string `json:"group"`
+
+ // Name of the API or GA4GH specification implemented. Official GA4GH types should be assigned as part of standards approval process. Custom artifacts are supported.
+ Artifact string `json:"artifact"`
+
+ // Version of the API or specification. GA4GH specifications use semantic versioning.
+ Version string `json:"version"`
+}
diff --git a/internal/apigen/go/model_summary.go b/internal/apigen/go/model_summary.go
new file mode 100644
index 0000000..65ea495
--- /dev/null
+++ b/internal/apigen/go/model_summary.go
@@ -0,0 +1,24 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+// Summary - A summary of what was resolved.
+type Summary struct {
+
+ // Number of items requested.
+ Requested int32 `json:"requested,omitempty"`
+
+ // Number of objects resolved.
+ Resolved int32 `json:"resolved,omitempty"`
+
+ // Number of objects not resolved.
+ Unresolved int32 `json:"unresolved,omitempty"`
+}
diff --git a/internal/apigen/go/model_unresolved_inner.go b/internal/apigen/go/model_unresolved_inner.go
new file mode 100644
index 0000000..42ff768
--- /dev/null
+++ b/internal/apigen/go/model_unresolved_inner.go
@@ -0,0 +1,18 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type UnresolvedInner struct {
+
+ ErrorCode int32 `json:"error_code,omitempty"`
+
+ ObjectIds []string `json:"object_ids,omitempty"`
+}
diff --git a/internal/apigen/go/model_upload_method.go b/internal/apigen/go/model_upload_method.go
new file mode 100644
index 0000000..1cc8d3f
--- /dev/null
+++ b/internal/apigen/go/model_upload_method.go
@@ -0,0 +1,25 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type UploadMethod struct {
+
+ // Type of upload method. Implementations MAY support any subset of these types. The 'https' type can be used to return a presigned POST URL and is expected to be the most common implementation for typical file uploads. This method provides a simple HTTP POST interface that works with standard web clients. The 's3' type is primarily intended to support uploads of large files that want to take advantage of multipart uploads and automatic retries implemented in AWS libraries. This method provides direct access to S3-specific upload capabilities. Other common implementations include 'gs' for Google Cloud Storage and 'sftp' for secure FTP uploads.
+ Type string `json:"type"`
+
+ AccessUrl UploadMethodAccessUrl `json:"access_url"`
+
+ // Cloud region for the upload location. Optional for non-cloud storage types.
+ Region string `json:"region,omitempty"`
+
+ // A dictionary of upload-specific configuration details that vary by upload method type. The contents and structure depend on the specific upload method being used.
+ UploadDetails map[string]interface{} `json:"upload_details,omitempty"`
+}
diff --git a/internal/apigen/go/model_upload_method_access_url.go b/internal/apigen/go/model_upload_method_access_url.go
new file mode 100644
index 0000000..a1516ee
--- /dev/null
+++ b/internal/apigen/go/model_upload_method_access_url.go
@@ -0,0 +1,20 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type UploadMethodAccessUrl struct {
+
+ // A fully resolvable URL that can be used to fetch the actual object bytes.
+ Url string `json:"url"`
+
+ // An optional list of headers to include in the HTTP request to `url`. These headers can be used to provide auth tokens required to fetch the object bytes.
+ Headers []string `json:"headers,omitempty"`
+}
diff --git a/internal/apigen/go/model_upload_request.go b/internal/apigen/go/model_upload_request.go
new file mode 100644
index 0000000..cc1570d
--- /dev/null
+++ b/internal/apigen/go/model_upload_request.go
@@ -0,0 +1,20 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type UploadRequest struct {
+
+ // Array of upload requests for files
+ Requests []UploadRequestObject `json:"requests"`
+
+ // Optional array of GA4GH Passport JWTs for authorization
+ Passports []string `json:"passports,omitempty"`
+}
diff --git a/internal/apigen/go/model_upload_request_object.go b/internal/apigen/go/model_upload_request_object.go
new file mode 100644
index 0000000..695822b
--- /dev/null
+++ b/internal/apigen/go/model_upload_request_object.go
@@ -0,0 +1,32 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type UploadRequestObject struct {
+
+ // The name of the file to upload
+ Name string `json:"name"`
+
+ // Size of the file in bytes
+ Size int64 `json:"size"`
+
+ // MIME type of the file
+ MimeType string `json:"mime_type"`
+
+ // Array of checksums for file integrity verification
+ Checksums []Checksum `json:"checksums"`
+
+ // Optional description of the file
+ Description string `json:"description,omitempty"`
+
+ // Optional array of alternative names for the file
+ Aliases []string `json:"aliases,omitempty"`
+}
diff --git a/internal/apigen/go/model_upload_response.go b/internal/apigen/go/model_upload_response.go
new file mode 100644
index 0000000..91f174c
--- /dev/null
+++ b/internal/apigen/go/model_upload_response.go
@@ -0,0 +1,17 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type UploadResponse struct {
+
+ // List of upload responses for the requested files
+ Responses []UploadResponseObject `json:"responses"`
+}
diff --git a/internal/apigen/go/model_upload_response_object.go b/internal/apigen/go/model_upload_response_object.go
new file mode 100644
index 0000000..0d0f554
--- /dev/null
+++ b/internal/apigen/go/model_upload_response_object.go
@@ -0,0 +1,35 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+type UploadResponseObject struct {
+
+ // The name of the file
+ Name string `json:"name"`
+
+ // Size of the file in bytes
+ Size int64 `json:"size"`
+
+ // MIME type of the file
+ MimeType string `json:"mime_type"`
+
+ // Array of checksums for file integrity verification
+ Checksums []Checksum `json:"checksums"`
+
+ // Optional description of the file
+ Description string `json:"description,omitempty"`
+
+ // Optional array of alternative names
+ Aliases []string `json:"aliases,omitempty"`
+
+ // Available methods for uploading this file
+ UploadMethods []UploadMethod `json:"upload_methods,omitempty"`
+}
diff --git a/internal/apigen/go/routers.go b/internal/apigen/go/routers.go
new file mode 100644
index 0000000..76f857b
--- /dev/null
+++ b/internal/apigen/go/routers.go
@@ -0,0 +1,173 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package openapi
+
+import (
+ "net/http"
+
+ "github.com/gin-gonic/gin"
+)
+
+// Route is the information for every URI.
+type Route struct {
+ // Name is the name of this Route.
+ Name string
+ // Method is the string for the HTTP method. ex) GET, POST etc..
+ Method string
+ // Pattern is the pattern of the URI.
+ Pattern string
+ // HandlerFunc is the handler function of this route.
+ HandlerFunc gin.HandlerFunc
+}
+
+// NewRouter returns a new router.
+func NewRouter(handleFunctions ApiHandleFunctions) *gin.Engine {
+ return NewRouterWithGinEngine(gin.Default(), handleFunctions)
+}
+
+// NewRouter add routes to existing gin engine.
+func NewRouterWithGinEngine(router *gin.Engine, handleFunctions ApiHandleFunctions) *gin.Engine {
+ for _, route := range getRoutes(handleFunctions) {
+ if route.HandlerFunc == nil {
+ route.HandlerFunc = DefaultHandleFunc
+ }
+ switch route.Method {
+ case http.MethodGet:
+ router.GET(route.Pattern, route.HandlerFunc)
+ case http.MethodPost:
+ router.POST(route.Pattern, route.HandlerFunc)
+ case http.MethodPut:
+ router.PUT(route.Pattern, route.HandlerFunc)
+ case http.MethodPatch:
+ router.PATCH(route.Pattern, route.HandlerFunc)
+ case http.MethodDelete:
+ router.DELETE(route.Pattern, route.HandlerFunc)
+ }
+ }
+
+ return router
+}
+
+// Default handler for not yet implemented routes
+func DefaultHandleFunc(c *gin.Context) {
+ c.String(http.StatusNotImplemented, "501 not implemented")
+}
+
+type ApiHandleFunctions struct {
+
+ // Routes for the ObjectsAPI part of the API
+ ObjectsAPI ObjectsAPI
+ // Routes for the ServiceInfoAPI part of the API
+ ServiceInfoAPI ServiceInfoAPI
+ // Routes for the UploadRequestAPI part of the API
+ UploadRequestAPI UploadRequestAPI
+}
+
+func getRoutes(handleFunctions ApiHandleFunctions) []Route {
+ return []Route{
+ {
+ "BulkDeleteObjects",
+ http.MethodPost,
+ "/ga4gh/drs/v1/objects/delete",
+ handleFunctions.ObjectsAPI.BulkDeleteObjects,
+ },
+ {
+ "BulkUpdateAccessMethods",
+ http.MethodPost,
+ "/ga4gh/drs/v1/objects/access-methods",
+ handleFunctions.ObjectsAPI.BulkUpdateAccessMethods,
+ },
+ {
+ "DeleteObject",
+ http.MethodPost,
+ "/ga4gh/drs/v1/objects/:object_id/delete",
+ handleFunctions.ObjectsAPI.DeleteObject,
+ },
+ {
+ "GetAccessURL",
+ http.MethodGet,
+ "/ga4gh/drs/v1/objects/:object_id/access/:access_id",
+ handleFunctions.ObjectsAPI.GetAccessURL,
+ },
+ {
+ "GetBulkAccessURL",
+ http.MethodPost,
+ "/ga4gh/drs/v1/objects/access",
+ handleFunctions.ObjectsAPI.GetBulkAccessURL,
+ },
+ {
+ "GetBulkObjects",
+ http.MethodPost,
+ "/ga4gh/drs/v1/objects",
+ handleFunctions.ObjectsAPI.GetBulkObjects,
+ },
+ {
+ "GetObject",
+ http.MethodGet,
+ "/ga4gh/drs/v1/objects/:object_id",
+ handleFunctions.ObjectsAPI.GetObject,
+ },
+ {
+ "GetObjectsByChecksum",
+ http.MethodGet,
+ "/ga4gh/drs/v1/objects/checksum/:checksum",
+ handleFunctions.ObjectsAPI.GetObjectsByChecksum,
+ },
+ {
+ "OptionsBulkObject",
+ http.MethodOptions,
+ "/ga4gh/drs/v1/objects",
+ handleFunctions.ObjectsAPI.OptionsBulkObject,
+ },
+ {
+ "OptionsObject",
+ http.MethodOptions,
+ "/ga4gh/drs/v1/objects/:object_id",
+ handleFunctions.ObjectsAPI.OptionsObject,
+ },
+ {
+ "PostAccessURL",
+ http.MethodPost,
+ "/ga4gh/drs/v1/objects/:object_id/access/:access_id",
+ handleFunctions.ObjectsAPI.PostAccessURL,
+ },
+ {
+ "PostObject",
+ http.MethodPost,
+ "/ga4gh/drs/v1/objects/:object_id",
+ handleFunctions.ObjectsAPI.PostObject,
+ },
+ {
+ "RegisterObjects",
+ http.MethodPost,
+ "/ga4gh/drs/v1/objects/register",
+ handleFunctions.ObjectsAPI.RegisterObjects,
+ },
+ {
+ "UpdateObjectAccessMethods",
+ http.MethodPost,
+ "/ga4gh/drs/v1/objects/:object_id/access-methods",
+ handleFunctions.ObjectsAPI.UpdateObjectAccessMethods,
+ },
+ {
+ "GetServiceInfo",
+ http.MethodGet,
+ "/ga4gh/drs/v1/service-info",
+ handleFunctions.ServiceInfoAPI.GetServiceInfo,
+ },
+ {
+ "PostUploadRequest",
+ http.MethodPost,
+ "/ga4gh/drs/v1/upload-request",
+ handleFunctions.UploadRequestAPI.PostUploadRequest,
+ },
+ }
+}
diff --git a/internal/apigen/main.go b/internal/apigen/main.go
new file mode 100644
index 0000000..3588f2e
--- /dev/null
+++ b/internal/apigen/main.go
@@ -0,0 +1,30 @@
+/*
+ * Data Repository Service
+ *
+ * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
+ *
+ * API version: 1.5.0
+ * Contact: ga4gh-cloud@ga4gh.org
+ * Generated by: OpenAPI Generator (https://openapi-generator.tech)
+ */
+
+package main
+
+import (
+ "log"
+
+ // WARNING!
+ // Pass --git-repo-id and --git-user-id properties when generating the code
+ //
+ sw "github.com/calypr/drs-server/go"
+)
+
+func main() {
+ routes := sw.ApiHandleFunctions{}
+
+ log.Printf("Server started")
+
+ router := sw.NewRouter(routes)
+
+ log.Fatal(router.Run(":8080"))
+}