CDCgov / prime-reportstream

ReportStream is a public intermediary tool for delivery of data between different parts of the healthcare ecosystem.
https://reportstream.cdc.gov
Creative Commons Zero v1.0 Universal
72 stars 40 forks source link

Add CapabilityStatement to RS API #12765

Open JFU-NAVA-PBC opened 10 months ago

JFU-NAVA-PBC commented 10 months ago

User Story

As report stream developer, I want FHIR CapabilityStatement added to the API so that API callers know the basic FHIR compliance info of the API

See FHIR spec for capability statement:

https://build.fhir.org/capabilitystatement.html

See the FHIR CapabilityStatement json from other APIs as example.

Description/Use Case

Each FHIR API should provide a public endpoint where API consumers can check the meta info about the API: such as FHIR spec version - R4 e.g. endpoints exposed

The CapabilityStatement also usually referred to as API fhir meta data, the

Risks/Impacts/Considerations

This is a easy lift to manifest RS API's FHIR version and capabilities in an FHIR interroperable manner

Dev Notes

  1. Expose an API end point, e.g.
  2. /api/metadata?format=json
  3. No authorization required - public

Acceptance Criteria

AC:

  1. the end point implemented
  2. tests added
JFU-NAVA-PBC commented 10 months ago

Sample FHIR CapabilityStatement:

{ "resourceType": "CapabilityStatement", "id": "fcf7d2cc-a281-4909-856b-3996a38dcc79", "name": "RestServer", "status": "active", "date": "2023-12-28T16:40:12.793-05:00", "publisher": "Centers for Medicare & Medicaid Services", "kind": "instance", "software": { "name": "Blue Button API: Direct", "version": "2.88.0" }, "implementation": { "description": "gov.cms.bfd:bfd-server-war", "url": "http://testserver/v2/fhir" }, "fhirVersion": "4.0.1", "format": [ "application/json", "application/fhir+json" ], "rest": [ { "mode": "server", "resource": [ { "type": "Coverage", "profile": "http://hl7.org/fhir/StructureDefinition/Coverage", "interaction": [ { "code": "read" }, { "code": "search-type" } ], "searchInclude": [ "*", "Coverage:beneficiary" ], "searchRevInclude": [ "Claim:mbi", "ClaimResponse:mbi", "Coverage:beneficiary", "ExplanationOfBenefit:patient" ], "searchParam": [ { "name": "beneficiary", "type": "reference", "documentation": "Fetch _Beneficiary_ data using a FHIR _IdType_ identifier; an IdType\nrepresents the logical identity for a resource, or as much of that\nidentity that is known. In FHIR, every resource must have a _logical ID_ which is\ndefined by the [FHIR specification](https://www.hl7.org/fhir/r4/datatypes.html#id) as:\n\nAny combination of upper or lower case ASCII letters ('A'..'Z', and 'a'..'z', numerals ('0'..'9'),\n'-' and '.', with a length limit of 64 characters. (This might be an integer, an un-prefixed OID, UUID\nor any other identifier pattern that meets these constraints.)\n\nThis class contains that logical ID, and can optionally also contain a relative or absolute URL\nrepresenting the resource identity; the following are all valid values for IdType, and all might\nrepresent the same resource:\n-beneficiary=567834\n-beneficiary=1234" }, { "name": "_lastUpdated", "type": "date", "documentation": "Only satisfy the Search if the Beneficiary'slast_updatedDate falls within a specified _DateRange_.\nA _DateRange_ can be defined by providing less thanltand/or greater thangtvalues.\nThis parameter can be included in a request one or more times.\n\nExamples:\n -_lastUpdated=gt2023-01-02&_lastUpdated=lt2023-05-01defines a range between two provided dates\n -_lastUpdated=gt2023-01-02defines a range between the provided date and today\n -_lastUpdated=lt2023-05-01defines a range from the earliest available records until the provided date" }, { "name": "startIndex", "type": "string", "documentation": "When fetching a _Bundle Response_ using pagination, this URL parameter represents an offset\n(starting point) into the list of elements for the _Request_.\nIt is optional and defaults to 1 if not supplied.\nA value 0 is not allowed and negative indices are not currently supported.\n\nExample:\n -startIndex=100" } ] }, { "type": "ExplanationOfBenefit", "profile": "http://hl7.org/fhir/StructureDefinition/ExplanationOfBenefit", "interaction": [ { "code": "read" }, { "code": "search-type" } ], "searchInclude": [ "*", "ExplanationOfBenefit:patient" ], "searchRevInclude": [ "Claim:mbi", "ClaimResponse:mbi", "Coverage:beneficiary", "ExplanationOfBenefit:patient" ], "searchParam": [ { "name": "patient", "type": "reference", "documentation": "**NOTE: TO MAKE A REQUEST TO THIS ENDPOINT IT IS REQUIRED TO CHOOSE ONE OUT OF THE FOLLOWING THREE PARAMETERS AT A GIVEN TIME (_id, identifier, _has:Coverage.extension)**\n\nFetch _Patient_ data using a FHIR _IdType_ identifier; an IdType\nrepresents the logical identity for a resource, or as much of that\nidentity that is known. In FHIR, every resource must have a _logical ID_ which is\ndefined by the [FHIR specification](https://www.hl7.org/fhir/r4/datatypes.html#id) as:\n\nAny combination of upper or lower case ASCII letters ('A'..'Z', and 'a'..'z', numerals ('0'..'9'),\n'-' and '.', with a length limit of 64 characters. (This might be an integer, an un-prefixed OID, UUID\nor any other identifier pattern that meets these constraints.)\n\nThis class contains that logical ID, and can optionally also contain a relative or absolute URL\nrepresenting the resource identity; the following are all valid values for IdType, and all might\nrepresent the same resource:\n -_id=567834\n -_id=1234" }, { "name": "_lastUpdated", "type": "date", "documentation": "Only satisfy the Search if the Beneficiary'slast_updatedDate falls within a specified _DateRange_.\nA _DateRange_ can be defined by providing less thanltand/or greater thangtvalues.\nThis parameter can be included in a request one or more times.\n\nExamples:\n -_lastUpdated=gt2023-01-02&_lastUpdated=lt2023-05-01defines a range between two provided dates\n -_lastUpdated=gt2023-01-02defines a range between the provided date and today\n -_lastUpdated=lt2023-05-01defines a range from the earliest available records until the provided date" }, { "name": "excludeSAMHSA", "type": "string", "documentation": "The _Substance Abuse and Mental Health Services Administration_ (SAMHSA)\nis the agency within the U.S. Department of HHS that leads public health efforts to advance the behavioral health of the nation.\nSetting this flag to _true_, modifies the request to filter out all SAMSHA-related claims from the response.\n\nExamples:\n -excludeSAMHSA=true" }, { "name": "includeTaxNumbers", "type": "string", "documentation": "Setting this flag to _true_, provides tax number in the EOB transformed data for the response.\n\nExample:\n -includeTaxNumbers=true" }, { "name": "service-date", "type": "date", "documentation": "Only satisfy the Search request if a claim's _billable period_\nfalls within a specified _DateRange_. A _DateRange_ can be\ndefined by providing less thanltand/or greater thangtvalues.\nThis parameter can be included in a request one or more times.\n\nExamples:\n -service-date=gt2023-01-02&service-date=lt2023-05-01defines a range between two provided dates\n -service-date=gt2023-01-02defines a range between the provided date and today\n -service-date=lt2023-05-01defines a range from the earliest available records until the provided date" }, { "name": "startIndex", "type": "string", "documentation": "When fetching a _Bundle Response_ using pagination, this URL parameter represents an offset\n(starting point) into the list of elements for the _Request_.\nIt is optional and defaults to 1 if not supplied.\nA value 0 is not allowed and negative indices are not currently supported.\n\nExample:\n -startIndex=100" }, { "name": "type", "type": "token", "documentation": "One or more comma-delimited claim types that filters the response to contain only EoBs that include the specified claim types.\nThis is optional and defaults todenoting all types.\nSupported values for claim type:\n -all types (default)\n -carrier\n -dme\n -hha\n -hospice\n -inpatient\n -outpatient\n -partd\n -snf\n\nExamples:\n -type=carrier,inpatient,snf,dme\n -type=outpatient\n -type=`" } ] }, { "type": "Patient", "profile": "http://hl7.org/fhir/StructureDefinition/Patient", "interaction": [ { "code": "read" }, { "code": "search-type" } ], "searchInclude": [ "" ], "searchRevInclude": [ "Claim:mbi", "ClaimResponse:mbi", "Coverage:beneficiary", "ExplanationOfBenefit:patient" ], "searchParam": [ { "name": "_id", "type": "token", "documentation": "NOTE: TO MAKE A REQUEST TO THIS ENDPOINT IT IS REQUIRED TO CHOOSE ONE OUT OF THE FOLLOWING THREE PARAMETERS AT A GIVEN TIME (_id, identifier, _has:Coverage.extension)\n\nFetch Patient data using a FHIR IdType identifier; an IdType\nrepresents the logical identity for a resource, or as much of that\nidentity that is known. In FHIR, every resource must have a logical ID which is\ndefined by the FHIR specification as:\n\nAny combination of upper or lower case ASCII letters ('A'..'Z', and 'a'..'z', numerals ('0'..'9'),\n'-' and '.', with a length limit of 64 characters. (This might be an integer, an un-prefixed OID, UUID\nor any other identifier pattern that meets these constraints.)\n\nThis class contains that logical ID, and can optionally also contain a relative or absolute URL\nrepresenting the resource identity; the following are all valid values for IdType, and all might\nrepresent the same resource:\n - _id=567834\n - _id=1234" }, { "name": "_lastUpdated", "type": "date", "documentation": "Only satisfy the Search if the Beneficiary's last_updated Date falls within a specified DateRange.\nA DateRange can be defined by providing less than lt and/or greater than gt values.\nThis parameter can be included in a request one or more times.\n\nExamples:\n - _lastUpdated=gt2023-01-02&_lastUpdated=lt2023-05-01 defines a range between two provided dates\n - _lastUpdated=gt2023-01-02 defines a range between the provided date and today\n - _lastUpdated=lt2023-05-01 defines a range from the earliest available records until the provided date" }, { "name": "startIndex", "type": "string", "documentation": "When fetching a Bundle Response using pagination, this URL parameter represents an offset\n(starting point) into the list of elements for the Request.\nIt is optional and defaults to 1 if not supplied.\nA value 0 is not allowed and negative indices are not currently supported.\n\nExample:\n - startIndex=100" }, { "name": "identifier", "type": "token", "documentation": "NOTE: TO MAKE A REQUEST TO THIS ENDPOINT IT IS REQUIRED TO CHOOSE ONE OUT OF THE FOLLOWING THREE PARAMETERS AT A GIVEN TIME (_id, identifier, _has:Coverage.extension)\n\nFetch Patient data using a FHIR identifier; an identifier contains a set of values that\ninclude the logical identity for a resource. In FHIR, the identifier is a parent element\ndefined by the FHIR specification as:\n\nA string, typically numeric or alphanumeric, that is associated with a single object or entity within a given system.\nTypically, identifiers are used to connect content in resources to external content available in other frameworks or protocols.\nIdentifiers are associated with objects and may be changed or retired due to human or system process and errors.\n\nThis class contains the identifier, which is usually represented as a URL, along with a single, url encoded, pipe-delimited key|value pair, with the value as\n(mbi, hicn, etc); the following are all valid values for Identifier, and all might represent the same resource:\n - identifier=https://bluebutton.cms.gov/resources/identifier/hicn-hash|<your hicn hash>\n - identifier=https://bluebutton.cms.gov/resources/identifier/mbi-hash|<your mbi hash>" }, { "name": "_has:Coverage.extension", "type": "token", "documentation": "NOTE: TO MAKE A REQUEST TO THIS ENDPOINT IT IS REQUIRED TO CHOOSE ONE OUT OF THE FOLLOWING THREE PARAMETERS AT A GIVEN TIME (_id, identifier, _has:Coverage.extension)\n\nWhen searching for a Patient's Part D events information, this resource identifies\nthe Part D contract value that will be used when determining eligibility.\n\nExample:\n - _has:Coverage.extension=<Part D Contract ID Here>\n - _has:Coverage.extension=ABCD" }, { "name": "_has:Coverage.rfrncyr", "type": "token", "documentation": "When searching for a Patient's Part D events information, this resource identifies\nthe reference year that will be applied when determining applicable Part D events.\n\nExample:\n - _has:Coverage.rfrncyr=2023" }, { "name": "cursor", "type": "string", "documentation": "Provide a pagination cursor or numeric offset for processing Patient's Part D events information.\n\nExamples:\n - cursor=200 the first record is the 201st record\n - cursor=1000 the first record is the 1001st record" } ] } ], "security": { "cors": true, "service": [ { "text": "OAuth", "coding": [ { "system": "http://hl7.org/fhir/restful-security-service", "code": "OAuth", "display": "OAuth" } ] }, { "text": "OAuth2 using SMART-on-FHIR profile (see http://docs.smarthealthit.org)", "coding": [ { "system": "http://hl7.org/fhir/restful-security-service", "code": "SMART-on-FHIR", "display": "SMART-on-FHIR" } ] } ], "extension": [ { "url": "http://fhir-registry.smarthealthit.org/StructureDefinition/oauth-uris", "extension": [ { "url": "token", "valueUri": "https://sandbox.bluebutton.cms.gov/v2/o/token/" }, { "url": "authorize", "valueUri": "https://sandbox.bluebutton.cms.gov/v2/o/authorize/" } ] } ] } } ] }`