# Local Terminology
## Objectives
* Create a local CodeSystem and ValueSet for use in the resource validation.
* Explore how multiple versions of canonical resources can coexist on the same FHIR server.
## Before you begin
* Set up your local Aidbox instance by following the Getting Started [guide](../../getting-started/run-aidbox-locally.md). It will make sure that the Aidbox version is `2507` or higher.
* The following settings in the `docker-compose.yaml` enable the hybrid terminology engine.\
```yaml
aidbox:
...
environment:
....
BOX_FHIR_TERMINOLOGY_ENGINE: hybrid
BOX_FHIR_TERMINOLOGY_ENGINE_HYBRID_EXTERNAL_TX_SERVER: https://tx.health-samurai.io/fhir
```
You can learn more about these configuration options [here](../../reference/all-settings.md#terminology).
## Creating and Uploading a FHIR package
We will create a FHIR Package that includes the following components:
* A **CodeSystem** containing three custom codes
* A **ValueSet** that includes all conceps from the **CodeSystem**
* A **profile** for the **ServiceRequest** resource that binds the _ServiceRequest.code_ element to the **ValueSet** and enforces this binding as **required**.\
1. Create the folder structure for your FHIR package using the following command:\
`mkdir -p mypackage/input/resources`
2. Create the JSON file with the **CodeSystem** FHIR resource at the path: `mypackage/input/resources/CodeSystem-tutorial-service-codes.json`\
Add the following content to the file:\
```json
{
"resourceType": "CodeSystem",
"id": "tutorial-service-codes",
"url": "http://example.com/fhir/CodeSystem/tutorial-service-codes",
"version": "1.0.0",
"name": "TutorialServiceCodes",
"title": "Tutorial Service Codes",
"status": "active",
"experimental": false,
"date": "2024-01-01",
"publisher": "Tutorial Example",
"description": "A sample code system for tutorial purposes containing service request codes",
"caseSensitive": true,
"content": "complete",
"count": 3,
"concept": [
{
"code": "consultation",
"display": "Medical Consultation",
"definition": "A general medical consultation service"
},
{
"code": "lab-test",
"display": "Laboratory Test",
"definition": "Laboratory testing service"
},
{
"code": "imaging",
"display": "Medical Imaging",
"definition": "Medical imaging service including X-ray, MRI, CT scan"
}
]
}
```
3. Create the JSON file with the **ValueSet** FHIR resource at the path: \
`mypackage/input/resources/ValueSet-tutorial-service-codes.json`\
Add the following content to the file:\
```json
{
"resourceType": "ValueSet",
"id": "tutorial-service-codes",
"url": "http://example.com/fhir/ValueSet/tutorial-service-codes",
"version": "1.0.0",
"name": "TutorialServiceCodes",
"title": "Tutorial Service Codes ValueSet",
"status": "active",
"experimental": false,
"date": "2024-01-01",
"publisher": "Tutorial Example",
"description": "ValueSet containing codes for service request types in tutorial examples",
"compose": {
"include": [
{
"system": "http://example.com/fhir/CodeSystem/tutorial-service-codes"
}
]
}
}
```
4. Create the JSON file with the FHIR profile at the path:\
`mypackage/input/resources/StructureDefinition-tutorial-service-request.json`\
Add the following content to the file:\
```json
{
"resourceType": "StructureDefinition",
"id": "tutorial-service-request",
"url": "http://example.com/fhir/StructureDefinition/tutorial-service-request",
"version": "1.0.0",
"name": "TutorialServiceRequest",
"title": "Tutorial Service Request Profile",
"status": "active",
"experimental": false,
"date": "2024-01-01",
"publisher": "Tutorial Example",
"description": "A ServiceRequest profile for tutorial purposes with required binding to tutorial service codes",
"fhirVersion": "4.0.1",
"kind": "resource",
"abstract": false,
"type": "ServiceRequest",
"baseDefinition": "http://hl7.org/fhir/StructureDefinition/ServiceRequest",
"derivation": "constraint",
"differential": {
"element": [
{
"id": "ServiceRequest",
"path": "ServiceRequest",
"short": "Tutorial Service Request",
"definition": "A service request with required binding to tutorial service codes"
},
{
"id": "ServiceRequest.code",
"path": "ServiceRequest.code",
"short": "Service code from tutorial ValueSet",
"definition": "The code for the service being requested, must be from the tutorial service codes ValueSet",
"min": 1,
"binding": {
"strength": "required",
"valueSet": "http://example.com/fhir/ValueSet/tutorial-service-codes"
}
}
]
}
}
```
\
5. Create the `mypackage/package.json` file:\
```json
{
"name": "tutorial-fhir-package",
"version": "1.0.0",
"description": "A tutorial FHIR package with ServiceRequest profile and required bindings",
"fhirVersions": ["4.0.1"],
"dependencies": {
"hl7.fhir.r4.core": "4.0.1"
},
"author": "Tutorial Example",
"license": "MIT"
}
```
6. At this point, the `mypackage` directory structure should look like this:\
```
mypackage
├── input
│ └── resources
│ ├── CodeSystem-tutorial-service-codes.json
│ ├── StructureDefinition-tutorial-service-request.json
│ └── ValueSet-tutorial-service-codes.json
└── package.json
```
7. Create `tar.gz` file for FHIR package using the following command:\
```bash
cd mypackage && tar -czf ../tutorial-fhir-package-1.0.0.tgz .
```
8. Open [Aidbox UI](http://localhost:8080/) and go to the _**FAR**_ tab. Click the "**Import package**" button, select the `tutorial-fhir-package-1.0.0.tgz` file, and then click **Import.**\
At this point, you should be able to see the loaded package in the packages list. \
## Testing the local terminology
1. Navigate to **Aidbox UI -> REST Console** and create a patient with id `pt-1`\
```json
POST /fhir/Patient
content-type: application/json
accept: application/json
{
"resourceType": "Patient",
"id": "pt-1"
}
```
2. Create a **ServiceRequest** that conforms to the profile included in the imported package.\
```json
POST /fhir/ServiceRequest
content-type: application/json
accept: application/json
{
"meta": {
"profile": [
"http://example.com/fhir/StructureDefinition/tutorial-service-request"
]
},
"status": "active",
"intent": "order",
"code": {
"coding": [
{
"code": "consultation",
"system": "http://example.com/fhir/CodeSystem/tutorial-service-codes"
}
]
},
"requester": {
"reference": "Patient/pt-1"
},
"subject": {
"reference": "Patient/pt-1"
},
"identifier": [
{
"value": "123"
}
],
"authoredOn": "2024-01-01"
}
```
\
**Note:** `meta.profile` property references the imported profile:\
```json
"meta": {
"profile": [
"http://example.com/fhir/StructureDefinition/tutorial-service-request"
]
}
```
This informs the FHIR server to validate the resource against the specified profile when it is created.\
\
**Note:** `code.coding` contains a valid code from the imported code system:\
```json
"code": {
"coding": [
{
"code": "consultation",
"system": "http://example.com/fhir/CodeSystem/tutorial-service-codes"
}
]
}
```
3. Create an invalid Service Request by executing the following request:\
```json
POST /fhir/ServiceRequest
content-type: application/json
accept: application/json
{
"meta": {
"profile": [
"http://example.com/fhir/StructureDefinition/tutorial-service-request"
]
},
"status": "active",
"intent": "order",
"code": {
"coding": [
{
"code": "follow-up",
"system": "http://example.com/fhir/CodeSystem/tutorial-service-codes"
}
]
},
"requester": {
"reference": "Patient/pt-1"
},
"subject": {
"reference": "Patient/pt-1"
},
"identifier": [
{
"value": "123"
}
],
"authoredOn": "2024-01-01"
}
```
You will see the following error:
```
The provided code 'http://example.com/fhir/CodeSystem/tutorial-service-codes#follow-up' was not found in the value set 'http://example.com/fhir/ValueSet/tutorial-service-codes|1.0.0
```
This is expected, as the CodeSystem `http://example.com/fhir/CodeSystem/tutorial-service-codes` does not include the code `follow-up`.
## Adding new code to the CodeSystem
Suppose we want to add a new code to the CodeSystem that was previously imported as part of a FHIR package. We can do this without creating a new version of the package or reloading it into the FHIR server.\
The ValueSet references the CodeSystem without specifying an exact version:
```json
"compose": {
"include": [
{
"system": "http://example.com/fhir/CodeSystem/tutorial-service-codes"
}
]
}
```
This means Aidbox will use the latest available version of the CodeSystem in the system when validating codes. You can read more about versioning of canonical resources [here](../../artifact-registry/artifact-registry-overview.md#versioning-strategy).\
1. Create a new version of the **CodeSystem** by executing the request below.\
**Note:** The version has been incremented to `1.0.1` and a new code `follow-up` has been added.\
```json
PUT /fhir/CodeSystem/tutorial-service-codes
content-type: application/json
accept: application/json
{
"resourceType": "CodeSystem",
"id": "tutorial-service-codes",
"url": "http://example.com/fhir/CodeSystem/tutorial-service-codes",
"version": "1.0.1",
"name": "TutorialServiceCodes",
"title": "Tutorial Service Codes",
"status": "active",
"experimental": false,
"date": "2024-01-01",
"publisher": "Tutorial Example",
"description": "A sample code system for tutorial purposes containing service request codes",
"caseSensitive": true,
"content": "complete",
"count": 4,
"concept": [
{
"code": "consultation",
"display": "Medical Consultation",
"definition": "A general medical consultation service"
},
{
"code": "lab-test",
"display": "Laboratory Test",
"definition": "Laboratory testing service"
},
{
"code": "imaging",
"display": "Medical Imaging",
"definition": "Medical imaging service including X-ray, MRI, CT scan"
},
{
"code": "follow-up",
"display": "Follow-up Appointment",
"definition": "A follow-up appointment service for ongoing care"
}
]
}
```
\
**Note:** it's not possible to update the content of an already loaded package in Aidbox. The new version of the CodeSystem was created in the default `app.aidbox.main` package.
2. Verify that the request to create a follow-up ServiceRequest can now be executed successfully:\
```json
POST /fhir/ServiceRequest
content-type: application/json
accept: application/json
{
"meta": {
"profile": [
"http://example.com/fhir/StructureDefinition/tutorial-service-request"
]
},
"status": "active",
"intent": "order",
"code": {
"coding": [
{
"code": "follow-up",
"system": "http://example.com/fhir/CodeSystem/tutorial-service-codes"
}
]
},
"requester": {
"reference": "Patient/pt-1"
},
"subject": {
"reference": "Patient/pt-1"
},
"identifier": [
{
"value": "123"
}
],
"authoredOn": "2024-01-01"
}
```
\