From b4286288936e2f27ba3159c4555b6a589e5a2494 Mon Sep 17 00:00:00 2001 From: Aleksandr Penskoi Date: Fri, 24 Jul 2026 15:28:02 +0400 Subject: [PATCH] [HealthSamurai/sansara#8017] Remove FHIRSchema endpoint tutorials The POST/PUT /fhir/FHIRSchema endpoints were removed in the July 2026 release. Delete the two tutorials that documented them and redirect their URLs to the StructureDefinition-based equivalents. --- SUMMARY.md | 2 - .../d05df5a8-b47c-474b-bccc-287520d47f1f.avif | Bin 25849 -> 0 bytes docs/overview/release-notes.md | 2 +- .../custom-resources/README.md | 9 +- .../custom-resources-using-fhir-schema.md | 738 ------------------ ...th-entity-and-attributes-to-fhir-schema.md | 8 +- ...sources-defined-with-zen-to-fhir-schema.md | 9 +- .../extensions-using-fhirschema.md | 63 -- .../extensions-using-structuredefinition.md | 2 - redirects.yaml | 8 +- 10 files changed, 13 insertions(+), 828 deletions(-) delete mode 100644 assets/d05df5a8-b47c-474b-bccc-287520d47f1f.avif delete mode 100644 docs/tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-fhir-schema.md delete mode 100644 docs/tutorials/artifact-registry-tutorials/define-extensions/extensions-using-fhirschema.md diff --git a/SUMMARY.md b/SUMMARY.md index 8a4d9ccb1..2e6f35887 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -99,9 +99,7 @@ * [How to create FHIR npm package](tutorials/artifact-registry-tutorials/how-to-create-fhir-npm-package.md) * [Define Extensions](tutorials/artifact-registry-tutorials/define-extensions/README.md) * [Extensions using StructureDefinition](tutorials/artifact-registry-tutorials/define-extensions/extensions-using-structuredefinition.md) - * [Extensions using FHIRSchema](tutorials/artifact-registry-tutorials/define-extensions/extensions-using-fhirschema.md) * [Custom Resources](tutorials/artifact-registry-tutorials/custom-resources/README.md) - * [Custom resources using FHIR Schema](tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-fhir-schema.md) * [Custom resources using StructureDefinition](tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-structuredefinition.md) * [Migrate to FHIR Schema](tutorials/artifact-registry-tutorials/custom-resources/migrate-to-fhirschema/README.md) * [Migrate custom resources defined with Entity and Attributes to FHIR Schema](tutorials/artifact-registry-tutorials/custom-resources/migrate-to-fhirschema/migrate-custom-resources-defined-with-entity-and-attributes-to-fhir-schema.md) diff --git a/assets/d05df5a8-b47c-474b-bccc-287520d47f1f.avif b/assets/d05df5a8-b47c-474b-bccc-287520d47f1f.avif deleted file mode 100644 index 8e8877c30489cd6f5ec445ab1ce7985c1ca8d8da..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25849 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 SiB3%jL@wTE&?V@-1pfyEeavzI diff --git a/docs/overview/release-notes.md b/docs/overview/release-notes.md index fcffad587..7b3c46f01 100644 --- a/docs/overview/release-notes.md +++ b/docs/overview/release-notes.md @@ -662,7 +662,7 @@ Minor updates: ## July 2024 _`2407`_ * Aidbox - * Introduced support for [custom resources using FHIR StructureDefinitions](../tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-structuredefinition.md) and [custom resources using FHIR schemas](../tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-fhir-schema.md) + * Introduced support for [custom resources using FHIR StructureDefinitions](../tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-structuredefinition.md) and custom resources using FHIR schemas (removed in the July 2026 release) * Published [JavaScript app example](https://github.com/Aidbox/examples/tree/main/aidbox-features/aidbox-notify-via-custom-resources) demonstrating custom resources with a typical notification flow: requesting a notification, locking it for sending, and sending it (placeholder) * Supported [enabling Audit Log using an environment variable](../reference/all-settings.md) * [Aidbox Forms](https://www.health-samurai.io/docs/formbox) diff --git a/docs/tutorials/artifact-registry-tutorials/custom-resources/README.md b/docs/tutorials/artifact-registry-tutorials/custom-resources/README.md index 12dc710ba..c5db6ddda 100644 --- a/docs/tutorials/artifact-registry-tutorials/custom-resources/README.md +++ b/docs/tutorials/artifact-registry-tutorials/custom-resources/README.md @@ -1,5 +1,5 @@ --- -description: Define custom FHIR resources in Aidbox using StructureDefinition or FHIR Schema for non-standard healthcare data. +description: Define custom FHIR resources in Aidbox using StructureDefinition for non-standard healthcare data. --- # Custom Resources @@ -23,9 +23,6 @@ Using this approach, you create your own storage and runtime for custom resource ## Define custom resources using FHIR abstractions -Use FHIR StructureDefinition or FHIR Schema to define a custom resource. Although resources defined this way will not be interoperable across different FHIR servers, within the bounds of your application, you can use all available utilities and the regular interface for interactions with these resources. This includes validation, search parameters, CRUD operations, and more. +Use FHIR StructureDefinition to define a custom resource. Although resources defined this way will not be interoperable across different FHIR servers, within the bounds of your application, you can use all available utilities and the regular interface for interactions with these resources. This includes validation, search parameters, CRUD operations, and more. -\ -Aidbox provides the following mechanisms to create custom resource types: -- [Using StructureDefnition](./custom-resources-using-structuredefinition.md) FHIR resource. -- [Using FHIRSchema](./custom-resources-using-fhir-schema.md) custom Aidbox resource — available in Aidbox versions 2606 and earlier; the `POST/PUT /fhir/FHIRSchema` endpoints were removed in the July 2026 release. +See [Custom resources using StructureDefinition](./custom-resources-using-structuredefinition.md). diff --git a/docs/tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-fhir-schema.md b/docs/tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-fhir-schema.md deleted file mode 100644 index c75d67872..000000000 --- a/docs/tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-fhir-schema.md +++ /dev/null @@ -1,738 +0,0 @@ ---- -description: Create custom FHIR resources using FHIR Schema in Aidbox with validation, search parameters, and resource definitions. ---- - -# Custom resources using FHIR Schema - -{% hint style="warning" %} -Custom resources are defined by individual organizations or projects to meet specific needs not covered by the FHIR standard. While these resources can be useful within a particular ecosystem, they may not be interoperable with other systems that do not recognize or support those custom resources. -{% endhint %} - -{% hint style="danger" %} -**Removed in the July 2026 release.** The `POST /fhir/FHIRSchema` and `PUT /fhir/FHIRSchema` endpoints have been removed, including `FHIRSchema` entries in transaction bundles and [init bundles](../../../configuration/init-bundle.md). The instructions below apply only to Aidbox versions 2606 and earlier. - -Define custom resources with [StructureDefinition](custom-resources-using-structuredefinition.md) instead. StructureDefinition is a standard FHIR resource, making your definitions portable and compatible with the broader FHIR ecosystem and tooling (e.g. FSH/SUSHI). -{% endhint %} - -FHIR Schema is a community project that aims to simplify the implementation and validation of FHIR (Fast Healthcare Interoperability Resources) resources across different programming languages. It also provides the ability to define custom resources. You can read more about the syntax and validation algorithms in the [FHIR Schema documentation](https://fhir-schema.github.io/fhir-schema/). - -## Configure Aidbox - -To begin using custom FHIR resources, enable the FHIRSchema validator engine in Aidbox. - -{% content-ref url="../../../modules/profiling-and-validation/fhir-schema-validator/setup-aidbox-with-fhir-schema-validation-engine.md" %} -[setup-aidbox-with-fhir-schema-validation-engine.md](../../../modules/profiling-and-validation/fhir-schema-validator/setup-aidbox-with-fhir-schema-validation-engine.md) -{% endcontent-ref %} - -## FHIR Schema endpoint - -In Aidbox versions 2606 and earlier, Aidbox provides the `/fhir/FHIRSchema` POST endpoint for creating FHIRSchema instances. Examples of usage are given in this article below. - -{% tabs %} -{% tab title="Request" %} -```yaml -POST /fhir/FHIRSchema -content-type: application/json -accept: application/json - - -``` -{% endtab %} - -{% tab title="Response" %} -{% code title="Status 200" %} -``` - -``` -{% endcode %} -{% endtab %} -{% endtabs %} - -## FHIR Schema top level properties - -To understand the meaning of the schemas described below, it is important to know the meaning of some basic FHIR Schema properties: - -
PropertyDescriptionAdditional Notes
base

This property contains the canonical URL to the FHIR Schema/StructureDefinition whose elements and constraints will be inherited.

It shares the same meaning as FHIR StructureDefinition.baseDefinition

Usually, you want to set this property to DomainResource. This provides all the resource infrastructure, such as top-level extension collection and meta, which allows you to populate meta in the FHIR manner and add profile references.

If you omit this field, only the elements defined in the elements section of FHIR Schema will be validated. Aidbox does not perform any automatic inference of the base if it is omitted.

url*

This field contains the unique canonical URL for your FHIRSchema.

In the context of custom resources, this field is not important. However, it becomes crucial when defining profiles, as you use the profile's canonical URL to reference it in the meta.profile of a resource instance.

It shares the same meaning as FHIR StructureDefinition.url

name*This field provides the computer-readable name for your custom resource or profile.

It shares the same meaning as FHIR StructureDefinition.name
When defining a new resource type, the current implementation requires that this field must be equal to both the type and id.
typeThis property provides reource type name for a new resource definition or in case of profiling the type of resource that is being constrained.

It shares the same meaning as FHIR StructureDefinition.type
When defining a new resource type, the current implementation requires that this field must be equal to both the name and id.
kind*This property is used to define the kind of structure that FHIRSchema is describing.

It shares the same meaning as FHIR StructureDefinition.kind
To define custom resources, you should use kind: resource or kind: logical
derivation*This property represents how the type relates to the base property. If it is set to specialization - Aidbox will create a new resource type with tables in the database and other resource infrastructure. If it is set to constraint - Aidbox will create a new profile that can be referenced on resource instances
idIt shares the same meaning as FHIR Resource.idWhen defining a new resource type, the current implementation requires that this field must be equal to both the type and name.
- -FHIR Schema may contain additional fields at the top level, but they share the same meaning as properties defined in the `elements` instruction. - -For more information about these fields, please refer to the FHIR Schema reference [specification](https://fhir-schema.github.io/fhir-schema/index.html). - -### Limitations of FHIR Logical Models - -Logical models (StructureDefinition/FHIRSchema with kind: logical) have two limitations as guided by the FHIR specification: - -1. **Base Value:** - * The base value is limited to two possible values: `Element` or `base`. -2. **Type Value:** - * The type value must be a fully specified URL and may share the same value as the URL property. This requirement is enforced by FHIR to avoid clashes with core resources. - -Since FHIR Schema shares the same semantic meaning and purpose as StructureDefinition, it inherits all these limitations of the original StructureDefinition resource. - -{% hint style="danger" %} -Due to the second limitation, resource definitions based on logical models are not intended for instantiation and are provided to an end FHIR server only as data structure examples. -{% endhint %} - -## Create customs resources using FHIR Schemas - -This guide will walk you through the process of creating custom resources for a notification system, demonstrating the typical workflow of creating, managing, and sending template-based notifications from a healthcare system to patients using custom resources defined through FHIRSchema. - -Additionally, there is a [JavaScript application](https://github.com/Aidbox/examples/tree/main/aidbox-features/aidbox-notify-via-custom-resources#aidbox-notify-via-custom-resources) that showcases the implementation of notification handling. This includes requesting notifications, locking them for processing, and completing the sending process. - -To implement a notification flow, you may need a notification resource and a template resource to store your notification messages. - -Let's start with shaping a TutorNotificationTemplate resource. - -This resource contains one property defined under `FHIRSchema.elements`: - -1. `template`: this property is for notification template text and is of the FHIR `string` data type. Also, it is a required property. - -Also `FHIRSchema.derivation`: `specialization` is a property that tells the Aidbox to create a new resource instead of constraining an existing one with a new profile. - -{% tabs %} -{% tab title="Request" %} -
POST /fhir/FHIRSchema
-content-type: application/json
-accept: application/json
-
-{
-  "url": "http://example.com/aidbox-sms-tutor/TutorNotificationTemplate",
-  "type": "TutorNotificationTemplate",
-  "name": "TutorNotificationTemplate",
-  "base": "DomainResource",
-  "kind": "resource",
-  "derivation": "specialization",
-  "required": [
-    "template"
-  ],
-  "elements": {
-    "template": {
-      "type": "string",
-      "scalar": true
-    }
-  }
-}
-
-{% endtab %} - -{% tab title="Response" %} -```json -Status: 200 -{ - "derivation": "specialization", - "name": "TutorNotificationTemplate", - "type": "TutorNotificationTemplate", - "resourceType": "FHIRSchema", - "elements": { - "template": { - "type": "string", - "scalar": true - } - }, - "id": "TutorNotificationTemplate", - "kind": "resource", - "url": "http://example.com/aidbox-sms-tutor/TutorNotificationTemplate", - "base": "DomainResource", - "required": [ - "template" - ] -} -``` -{% endtab %} -{% endtabs %} - -Now, when a resource to store notification templates is available, a more complex resource can be shaped: the `TutorNotification`. This resource will include several key properties: - -1. `type`: property that contains `binding` value set URL in `valueSet` property and `strength`: `required`, that is used to force binding validation. -2. `status`: property with `binding` to `valueSet: http://hl7.org/fhir/ValueSet/task-status` with additional constraint to `requested`, `in-progress` or `completed` values. -3. `template`: reference to `TutorNotificationTemplate` resource that we created above. -4. `message`: message text and is of the FHIR `string` data type. -5. `sendAfter`: property that specifies the `dateTime` after which this notification should be sent. -6. `subject`: reference to the `Patient` resource to whom this notification will be sent. - -{% tabs %} -{% tab title="Request" %} -```yaml -POST /fhir/FHIRSchema -content-type: application/json -accept: application/json - -{ - "url": "http://example.com/aidbox-sms-tutor/TutorNotification", - "type": "TutorNotification", - "name": "TutorNotification", - "base": "DomainResource", - "kind": "resource", - "derivation": "specialization", - "required": [ - "sendAfter", - "status", - "subject", - "template", - "type" - ], - "elements": { - "type": { - "type": "string", - "scalar": true, - "binding": { - "valueSet": "http://hl7.org/fhir/ValueSet/contact-point-system", - "strength": "required" - } - }, - "status": { - "type": "string", - "scalar": true, - "constraints": { - "cont-status": { - "human": "Status should be 'requested', 'in-progress' or 'completed'", - "severity": "error", - "expression": "%context='requested' or %context='in-progress' or %context='completed'" - } - }, - "binding": { - "valueSet": "http://hl7.org/fhir/ValueSet/task-status", - "strength": "required" - } - }, - "template": { - "type": "Reference", - "scalar": true, - "refers": [ - "TutorNotificationTemplate" - ] - }, - "message": { - "type": "string", - "scalar": true - }, - "sendAfter": { - "type": "dateTime", - "scalar": true - }, - "subject": { - "type": "Reference", - "scalar": true, - "refers": [ - "Patient" - ] - } - } -} -``` -{% endtab %} - -{% tab title="Response" %} -```json -Status: 200 -{ - "derivation": "specialization", - "name": "TutorNotification", - "type": "TutorNotification", - "resourceType": "FHIRSchema", - "elements": { - "type": { - "type": "string", - "scalar": true, - "binding": { - "valueSet": "http://hl7.org/fhir/ValueSet/contact-point-system", - "strength": "required" - } - }, - "status": { - "type": "string", - "scalar": true, - "constraints": { - "cont-status": { - "human": "Status should be 'requested', 'in-progress' or 'completed'", - "severity": "error", - "expression": "%context='requested' or %context='in-progress' or %context='completed'" - } - }, - "binding": { - "valueSet": "http://hl7.org/fhir/ValueSet/task-status", - "strength": "required" - } - }, - "template": { - "type": "Reference", - "scalar": true, - "refers": [ - "TutorNotificationTemplate" - ] - }, - "message": { - "type": "string", - "scalar": true - }, - "sendAfter": { - "type": "dateTime", - "scalar": true - }, - "subject": { - "type": "Reference", - "scalar": true, - "refers": [ - "Patient" - ] - } - }, - "id": "TutorNotification", - "kind": "resource", - "url": "http://example.com/aidbox-sms-tutor/TutorNotification", - "base": "DomainResource", - "required": [ - "sendAfter", - "status", - "subject", - "template", - "type" - ] -} -``` -{% endtab %} -{% endtabs %} - -## Define search parameters - -With defined resources, most of the work is done, but there is one missing aspect of any FHIR resource. You definitely want to check your requested notifications or include related subjects to the search bundle. Aidbox allows you to define SearchParameter resources in addition to custom resources. - -Let's create the search parameters mentioned above. - -{% tabs %} -{% tab title="Request" %} -```json -POST /fhir/SearchParameter -content-type: application/json -accept: application/json - -{ - "resourceType": "SearchParameter", - "id": "TutorNotification-status", - "url": "http://example.com/aidbox-sms-tutor/TutorNotification-status", - "version": "0.0.1", - "status": "draft", - "name": "status", - "code": "status", - "base": [ - "TutorNotification" - ], - "type": "token", - "description": "Search TutorNotification by status", - "expression": "TutorNotification.status" -} -``` -{% endtab %} - -{% tab title="Response" %} -```json -Status: 200 -{ - "description": "Search TutorNotification by status", - "expression": "TutorNotification.status", - "name": "status", - "type": "token", - "resourceType": "SearchParameter", - "status": "draft", - "id": "TutorNotification-status", - "url": "http://example.com/aidbox-sms-tutor/TutorNotification-status", - "code": "status", - "base": [ - "TutorNotification" - ], - "version": "0.0.1" -} -``` -{% endtab %} -{% endtabs %} - -This one defines the `expression` to achieve resource status, which allows you to search for TutorNotification resources by status like this: - -{% tabs %} -{% tab title="Request" %} -```json -GET /fhir/TutorNotification?status=requested -``` -{% endtab %} - -{% tab title="Response" %} -```json -{ - "resourceType": "Bundle", - "type": "searchset", - "meta": { - "versionId": "0" - }, - "total": 1, - "link": [ - { - "relation": "first", - "url": "http://localhost:8765/fhir/TutorNotification?status=requested&page=1" - }, - { - "relation": "self", - "url": "http://localhost:8765/fhir/TutorNotification?status=requested&page=1" - } - ], - "entry": [ - { - "resource": { - "type": "sms", - "status": "requested", - "subject": { - "reference": "Patient/pt-1" - }, - "template": { - "reference": "TutorNotificationTemplate/welcome" - }, - "sendAfter": "2024-07-12T12:00:00Z", - "id": "c4d1afd5-0a38-4dd5-843d-85834e23243c", - "resourceType": "TutorNotification", - "meta": { - "lastUpdated": "2024-07-24T11:31:26.091674Z", - "versionId": "261", - "extension": [ - { - "url": "http://example.com/createdat", - "valueInstant": "2024-07-24T11:31:26.091674Z" - } - ] - } - }, - "search": { - "mode": "match" - }, - "fullUrl": "http://localhost:8765/TutorNotification/c4d1afd5-0a38-4dd5-843d-85834e23243c", - "link": [ - { - "relation": "self", - "url": "http://localhost:8765/TutorNotification/c4d1afd5-0a38-4dd5-843d-85834e23243c" - } - ] - } - ] -} -``` -{% endtab %} -{% endtabs %} - -The other one is used to include related Patient resources to the search bundle. - -{% tabs %} -{% tab title="Request" %} -```json -POST /fhir/SearchParameter -content-type: application/json -accept: application/json - -{ - "resourceType": "SearchParameter", - "id": "TutorNotification-subject", - "url": "http://example.com/aidbox-sms-tutor/TutorNotification-subject", - "version": "0.0.1", - "status": "draft", - "name": "subject", - "code": "subject", - "base": [ - "TutorNotification" - ], - "type": "reference", - "description": "Search TutorNotification by subject", - "expression": "TutorNotification.subject" -} -``` -{% endtab %} - -{% tab title="Response" %} -```json -{ - "description": "Search TutorNotification by subject", - "expression": "TutorNotification.subject", - "name": "subject", - "type": "reference", - "resourceType": "SearchParameter", - "status": "draft", - "id": "TutorNotification-subject", - "url": "http://example.com/aidbox-sms-tutor/TutorNotification-subject", - "code": "subject", - "base": [ - "TutorNotification" - ], - "version": "0.0.1" -} -``` -{% endtab %} -{% endtabs %} - -It allows you to make following requests: - -{% tabs %} -{% tab title="Request" %} -```json -GET /fhir/TutorNotification?_include=TutorNotification:subject:Patient -``` -{% endtab %} - -{% tab title="Response" %} -```json -Status: 200 -{ - "resourceType": "Bundle", - "type": "searchset", - "meta": { - "versionId": "0" - }, - "total": 1, - "link": [ - { - "relation": "first", - "url": "http://localhost:8765/fhir/TutorNotification?_include=TutorNotification:subject:Patient&page=1" - }, - { - "relation": "self", - "url": "http://localhost:8765/fhir/TutorNotification?_include=TutorNotification:subject:Patient&page=1" - } - ], - "entry": [ - { - "resource": { - "type": "sms", - "status": "requested", - "subject": { - "reference": "Patient/pt-1" - }, - "template": { - "reference": "TutorNotificationTemplate/welcome" - }, - "sendAfter": "2024-07-12T12:00:00Z", - "id": "c4d1afd5-0a38-4dd5-843d-85834e23243c", - "resourceType": "TutorNotification", - "meta": { - "lastUpdated": "2024-07-24T11:31:26.091674Z", - "versionId": "261", - "extension": [ - { - "url": "http://example.com/createdat", - "valueInstant": "2024-07-24T11:31:26.091674Z" - } - ] - } - }, - "search": { - "mode": "match" - }, - "fullUrl": "http://localhost:8765/TutorNotification/c4d1afd5-0a38-4dd5-843d-85834e23243c", - "link": [ - { - "relation": "self", - "url": "http://localhost:8765/TutorNotification/c4d1afd5-0a38-4dd5-843d-85834e23243c" - } - ] - }, - { - "resource": { - "name": [ - { - "given": [ - "James" - ], - "family": "Morgan" - } - ], - "id": "pt-1", - "resourceType": "Patient", - "meta": { - "lastUpdated": "2024-07-23T11:07:35.330824Z", - "versionId": "225", - "extension": [ - { - "url": "http://example.com/createdat", - "valueInstant": "2024-07-23T11:07:35.330824Z" - } - ] - } - }, - "search": { - "mode": "include" - }, - "fullUrl": "http://localhost:8765/Patient/pt-1", - "link": [ - { - "relation": "self", - "url": "http://localhost:8765/Patient/pt-1" - } - ] - } - ] -} -``` -{% endtab %} -{% endtabs %} - -## Interact with a resource - -Now you can interact with created resources just like with any other FHIR resources. - -Let's create an instance of `TutorNotificationTemplate` resource with welcome message based on related patient's given name. - -{% tabs %} -{% tab title="Request" %} -```json -POST /fhir/TutorNotificationTemplate -content-type: application/json -accept: application/json - -{ - "id": "welcome", - "resourceType": "TutorNotificationTemplate", - "template": "Hello user name: {{patient.name.given}}\n" -} -``` -{% endtab %} - -{% tab title="Response" %} -```json -Status: 201 -{ - "template": "Hello user name: {{patient.name.given}}\n", - "id": "welcome", - "resourceType": "TutorNotificationTemplate", - "meta": { - "lastUpdated": "2024-07-24T11:40:16.461445Z", - "versionId": "275", - "extension": [ - { - "url": "http://example.com/createdat", - "valueInstant": "2024-07-24T11:40:16.461445Z" - } - ] - } -} -``` -{% endtab %} -{% endtabs %} - -Then we probably want to create some patient: - -{% tabs %} -{% tab title="Request" %} -```json -POST /fhir/Patient -content-type: application/json -accept: application/json - -{ - "id": "pt-1", - "name": [ - { - "given": [ - "James" - ], - "family": "Morgan" - } - ], - "resourceType": "Patient" -} -``` -{% endtab %} - -{% tab title="Response" %} -```json -Status: 201 -{ - "name": [ - { - "given": [ - "James" - ], - "family": "Morgan" - } - ], - "id": "pt-1", - "resourceType": "Patient", - "meta": { - "lastUpdated": "2024-07-24T11:41:44.014328Z", - "versionId": "281", - "extension": [ - { - "url": "http://example.com/createdat", - "valueInstant": "2024-07-24T11:41:44.014328Z" - } - ] - } -} -``` -{% endtab %} -{% endtabs %} - -So request that creates welcome sms notification for James Morgan at 12:00 should look like this: - -{% tabs %} -{% tab title="Request" %} -```json -POST /fhir/TutorNotification -content-type: application/json -accept: application/json - -{ - "resourceType": "TutorNotification", - "type": "sms", - "status": "requested", - "template": { - "reference": "TutorNotificationTemplate/welcome" - }, - "sendAfter": "2024-07-12T12:00:00.000Z", - "subject": { - "reference": "Patient/pt-1" - } -} -``` -{% endtab %} - -{% tab title="Response" %} -```json -Status: 201 -{ - "meta": { - "lastUpdated": "2024-07-24T11:43:35.415536Z", - "versionId": "283", - "extension": [ - { - "url": "http://example.com/createdat", - "valueInstant": "2024-07-24T11:43:35.415536Z" - } - ] - }, - "type": "sms", - "template": { - "reference": "TutorNotificationTemplate/welcome" - }, - "resourceType": "TutorNotification", - "status": "requested", - "id": "17843645-27c2-4e6b-9681-19f2aa526ce7", - "sendAfter": "2024-07-12T12:00:00.000Z", - "subject": { - "reference": "Patient/pt-1" - } -} -``` -{% endtab %} -{% endtabs %} - -## How Aidbox Deals with FHIR Limitations for Custom Resources - -### **FHIR Type ValueSet Bindings** - -FHIR defines certain ValueSets that list all resource types and binds them with required strength to some properties. For example, the `SearchParameter.base` property points to the resource this `SearchParameter` is intended for and has this exact binding. Obviously, your custom resource type is not mentioned in this ValueSet. However, you still want to create and use search parameters for your custom resources. - -During validation, Aidbox checks whether the resource type is in the given ValueSet or if it is a known custom resource for Aidbox. This allows you to use custom resources in resources like `CapabilityStatement` or `SearchParameter`, or in the `type` property of references. - -### **References to Unknown FHIR Types** - -FHIR allows references to point only to FHIR resources. Aidbox, however, allows you to specify custom resources in reference targets as well. - -### **Bundle Entries Must Inherit from Resource FHIR Type** - -FHIR explicitly states that `Bundle.entry.resource` must be a type that inherits from the Resource FHIR type. Aidbox relaxes this constraint and checks that the referenced resource inherits from at least one `StructureDefinition`/`FHIRSchema` with `kind: resource` and `derivation: specialization`. - -\\ diff --git a/docs/tutorials/artifact-registry-tutorials/custom-resources/migrate-to-fhirschema/migrate-custom-resources-defined-with-entity-and-attributes-to-fhir-schema.md b/docs/tutorials/artifact-registry-tutorials/custom-resources/migrate-to-fhirschema/migrate-custom-resources-defined-with-entity-and-attributes-to-fhir-schema.md index 9b73643cc..4a94d0402 100644 --- a/docs/tutorials/artifact-registry-tutorials/custom-resources/migrate-to-fhirschema/migrate-custom-resources-defined-with-entity-and-attributes-to-fhir-schema.md +++ b/docs/tutorials/artifact-registry-tutorials/custom-resources/migrate-to-fhirschema/migrate-custom-resources-defined-with-entity-and-attributes-to-fhir-schema.md @@ -466,13 +466,9 @@ to Aidbox, follow these steps.\ Ensure that your Aidbox is configured to run with the\ FHIRSchema validation engine. Here's[a guide describing how to achieve that](../../../../modules/profiling-and-validation/fhir-schema-validator/). -**Single FHIRSchema Delivery** +**Delivering Schemas as a Package** -If you have only one FHIRSchema that replaces your custom-defined Entity/Attributes, follow [this guide](../custom-resources-using-fhir-schema.md) to deliver a single FHIRSchema to Aidbox. - -**Multiple Schemas as a Package** - -If you have multiple schemas replacing a set of resources and want to work with this set of entities as a package (ImplementationGuide), refer to this guide on how to create your own FHIR NPM package with ImplementationGuide entities. +Package the resulting schemas as a FHIR NPM package (ImplementationGuide) and load it into Aidbox. Refer to this guide on how to create your own FHIR NPM package with ImplementationGuide entities. {% content-ref url="../../how-to-create-fhir-npm-package.md" %} [how-to-create-fhir-npm-package.md](../../how-to-create-fhir-npm-package.md) diff --git a/docs/tutorials/artifact-registry-tutorials/custom-resources/migrate-to-fhirschema/migrate-custom-resources-defined-with-zen-to-fhir-schema.md b/docs/tutorials/artifact-registry-tutorials/custom-resources/migrate-to-fhirschema/migrate-custom-resources-defined-with-zen-to-fhir-schema.md index b63d028e2..3fcdd0871 100644 --- a/docs/tutorials/artifact-registry-tutorials/custom-resources/migrate-to-fhirschema/migrate-custom-resources-defined-with-zen-to-fhir-schema.md +++ b/docs/tutorials/artifact-registry-tutorials/custom-resources/migrate-to-fhirschema/migrate-custom-resources-defined-with-zen-to-fhir-schema.md @@ -561,14 +561,9 @@ To deliver the FHIR Schema(s) and related Entities you authored to Aidbox, follo Ensure that your Aidbox is configured to run with the FHIRSchema validation engine.\ Here's [a guide describing how to achieve that](../../../../modules/profiling-and-validation/fhir-schema-validator/). -**Single FHIRSchema Delivery** +**Delivering Schemas as a Package** -If you have only one FHIRSchema that replaces your custom-defined Zen definition,\ -follow [this guide](../custom-resources-using-fhir-schema.md) to deliver a single FHIRSchema to Aidbox. - -**Multiple Schemas as a Package** - -If you have multiple schemas replacing a set of resources and want to work with this set of entities as a package (ImplementationGuide), refer to this guide on how to create your own FHIR NPM package with ImplementationGuide entities. +Package the resulting schemas as a FHIR NPM package (ImplementationGuide) and load it into Aidbox. Refer to this guide on how to create your own FHIR NPM package with ImplementationGuide entities. {% content-ref url="../../how-to-create-fhir-npm-package.md" %} [how-to-create-fhir-npm-package.md](../../how-to-create-fhir-npm-package.md) diff --git a/docs/tutorials/artifact-registry-tutorials/define-extensions/extensions-using-fhirschema.md b/docs/tutorials/artifact-registry-tutorials/define-extensions/extensions-using-fhirschema.md deleted file mode 100644 index acf755aa0..000000000 --- a/docs/tutorials/artifact-registry-tutorials/define-extensions/extensions-using-fhirschema.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -description: Define FHIR extensions in Aidbox using FHIRSchema format for extending resource capabilities. ---- - -# Extensions using FHIRSchema - -{% hint style="danger" %} -**Removed in the July 2026 release.** The `POST /fhir/FHIRSchema` and `PUT /fhir/FHIRSchema` endpoints have been removed, including `FHIRSchema` entries in transaction bundles and [init bundles](../../../configuration/init-bundle.md). The instructions below apply only to Aidbox versions 2606 and earlier. - -Define extensions with [StructureDefinition](extensions-using-structuredefinition.md) instead. -{% endhint %} - -When Aidbox is configured with [FHIRSchema mode](../../../modules/profiling-and-validation/fhir-schema-validator/), it is possible to define Extension in [FHIRSchema format](https://fhir-schema.github.io/fhir-schema/). - -See also [Extensions using StructureDefinition](extensions-using-structuredefinition.md). - -## Example - -In Aidbox versions 2606 and earlier, to create the extension, use `POST /fhir/FHIRSchema` endpoint. - -```http -POST /fhir/FHIRSchema - -url: http://my-extension/insurance-plan-reference -id: insurance-plan-reference -base: Extension -name: insurance-plan-reference -kind: complex-type -type: Extension -version: 0.0.1 -resourceType: FHIRSchema -elements: - url: - fixed: http://my-extension/insurance-plan-reference - value: - choices: - - valueReference - valueReference: - type: Reference - refers: - - InsurancePlan - choiceOf: value -derivation: constraint -``` - -When the extension is created, you can inspect it in "FHIR Packages" Aidbox UI page. - -
FHIR Packages page showing insurance-plan-reference extension
- -Usage of the extension: - -
PUT /fhir/Coverage/my-coverage
-
-extension:
-- url: http://my-extension/insurance-plan-reference
-  valueReference: 
-    reference: InsurancePlan/ip1
-payor: 
-- reference: Patient/pt1
-beneficiary:
-  reference: Patient/pt1
-status: active
-
diff --git a/docs/tutorials/artifact-registry-tutorials/define-extensions/extensions-using-structuredefinition.md b/docs/tutorials/artifact-registry-tutorials/define-extensions/extensions-using-structuredefinition.md index 590f1d63e..a71f7d957 100644 --- a/docs/tutorials/artifact-registry-tutorials/define-extensions/extensions-using-structuredefinition.md +++ b/docs/tutorials/artifact-registry-tutorials/define-extensions/extensions-using-structuredefinition.md @@ -6,8 +6,6 @@ description: Create FHIR extensions using StructureDefinition resources in Aidbo Aidbox supports defining extensions using [StructureDefinition](https://build.fhir.org/structuredefinition.html) FHIR resource. This is possible when Aidbox is configured with [FHIRSchema mode](../../../modules/profiling-and-validation/fhir-schema-validator/). -See also [Extensions using FHIRSchema](extensions-using-fhirschema.md). - ## Example To create the Extension, simply `PUT` or `POST` the StructureDefinition with `Extension` type to the `/fhir/StructureDefinition` endpoint. diff --git a/redirects.yaml b/redirects.yaml index 5a992cfaf..fbfac96d7 100644 --- a/redirects.yaml +++ b/redirects.yaml @@ -264,7 +264,7 @@ redirects: modules-1/custom-resources/custom-resources-using-structuredefinition: tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-structuredefinition.md modules-1/custom-resources/migrate-to-fhirschema/migrate-custom-resources-defined-with-entity-and-attributes-to-fhir-schema: tutorials/artifact-registry-tutorials/custom-resources/migrate-to-fhirschema/migrate-custom-resources-defined-with-entity-and-attributes-to-fhir-schema.md modules-1/custom-resources/migrate-to-fhirschema/migrate-custom-resources-defined-with-zen-to-fhir-schema: tutorials/artifact-registry-tutorials/custom-resources/migrate-to-fhirschema/migrate-custom-resources-defined-with-zen-to-fhir-schema.md - modules-1/define-extensions/extensions-using-fhirschema: tutorials/artifact-registry-tutorials/define-extensions/extensions-using-fhirschema.md + modules-1/define-extensions/extensions-using-fhirschema: tutorials/artifact-registry-tutorials/define-extensions/extensions-using-structuredefinition.md modules-1/define-extensions/extensions-using-structuredefinition: tutorials/artifact-registry-tutorials/define-extensions/extensions-using-structuredefinition.md modules-1/eprescription/directory/addproviderlocation-message: modules/eprescription/directory/addproviderlocation-message.md modules-1/eprescription/directory/directorydownload-message: modules/eprescription/directory/directorydownload-message.md @@ -554,7 +554,7 @@ redirects: modules-1/topic-based-subscriptions/setup-subscriptiontopic: deprecated/deprecated/zen-related/topic-based-subscriptions/set-up-subscriptiontopic.md modules-1/workflow-engine/services: deprecated/deprecated/zen-related/workflow-engine/README.md modules/aidbox-forms/aidbox-code-editor/how-to-create-a-dynamic-form: deprecated/deprecated/forms/aidbox-code-editor/dynamic-form-creation.md - modules/custom-resources/custom-resources-using-fhir-schema: tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-fhir-schema.md + modules/custom-resources/custom-resources-using-fhir-schema: tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-structuredefinition.md modules/eprescription/tutorials/list-of-metrics: modules/eprescription/reference/list-of-metrics.md modules/integration-toolkit/ccda-converter/sections/admissiondiagnosissectionv3: modules/integration-toolkit/ccda-converter/sections/admission-diagnosis-section-docs-v3.md modules/integration-toolkit/ccda-converter/sections/medicalequipmentsectionv2: modules/integration-toolkit/ccda-converter/sections/medical-equipment-section-docs-v2.md @@ -827,7 +827,7 @@ redirects: # storage-1/* storage-1/aidboxdb-image/migrate-to-aidboxdb-16: deprecated/deprecated/aidboxdb/migrate-to-aidboxdb-16.md storage-1/custom-resources: tutorials/artifact-registry-tutorials/custom-resources/README.md - storage-1/custom-resources/custom-resources-using-fhirschema: tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-fhir-schema.md + storage-1/custom-resources/custom-resources-using-fhirschema: tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-structuredefinition.md storage-1/ha-aidboxdb: deprecated/deprecated/aidboxdb/ha-aidboxdb.md storage-1/index-management: deployment-and-maintenance/indexes/README.md storage-1/indexes: deployment-and-maintenance/indexes/README.md @@ -846,6 +846,8 @@ redirects: # tutorials/* tutorials/tutorials/hl7-v2-pipeline-with-patient-mapping: deprecated/deprecated/other/other-deprecated-tutorials/hl7-v2-pipeline-with-patient-mapping.md + tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-fhir-schema: tutorials/artifact-registry-tutorials/custom-resources/custom-resources-using-structuredefinition.md + tutorials/artifact-registry-tutorials/define-extensions/extensions-using-fhirschema: tutorials/artifact-registry-tutorials/define-extensions/extensions-using-structuredefinition.md # modules-1/security-and-access-control/how-to-guides/* (no clear match) modules-1/security-and-access-control/how-to-guides/research-possible-security-issues: access-control/access-control.md