Skip to content

Commit 5571bb8

Browse files
committed
Add adaptive forms example
1 parent f5eec5e commit 5571bb8

File tree

16 files changed

+3102
-0
lines changed

16 files changed

+3102
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
node_modules
2+
dist
3+
.env
4+
.git
5+
.gitignore
6+
README.md
7+
docker-compose.yml
8+
Dockerfile
9+
init-bundle.json

aidbox-adaptive-forms/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
node_modules
2+
dist
3+
.env

aidbox-adaptive-forms/Dockerfile

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
FROM node:20-alpine
2+
3+
WORKDIR /app
4+
5+
COPY package*.json ./
6+
7+
RUN npm ci --only=production
8+
9+
COPY tsconfig.json ./
10+
COPY src ./src
11+
12+
RUN npm install -D typescript @types/node && \
13+
npm run build && \
14+
npm prune --production
15+
16+
CMD ["node", "dist/main.js"]

aidbox-adaptive-forms/README.md

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Aidbox Adaptive Forms - PHQ-2/PHQ-9 Server
2+
3+
A NestJS-based FHIR SDC Adaptive Questionnaire server that implements the PHQ-2/PHQ-9 depression screening workflow.
4+
5+
## Overview
6+
7+
This server implements the adaptive questionnaire pattern where:
8+
1. Patient starts with PHQ-2 (2 questions)
9+
2. Server calculates the PHQ-2 score
10+
3. If score > 2, the server returns PHQ-9 (9 questions) for further assessment
11+
4. If score <= 2, the assessment is complete
12+
13+
## Quick Start with Docker Compose
14+
15+
The easiest way to run the entire stack (Aidbox + Adaptive Forms Server) with pre-loaded questionnaires:
16+
17+
```bash
18+
docker-compose up -d
19+
```
20+
21+
This will start:
22+
- **Aidbox** at http://localhost:8888 (admin/password)
23+
- **Adaptive Forms Server** at http://localhost:3000
24+
- **PostgreSQL** database
25+
- **Pre-loaded PHQ-2 Questionnaire** (via init-bundle)
26+
27+
Wait 30-60 seconds for services to initialize, then verify the questionnaire was loaded:
28+
29+
```bash
30+
curl -u basic:secret http://localhost:8888/fhir/Questionnaire/phq-2
31+
```
32+
33+
To stop:
34+
```bash
35+
docker-compose down
36+
```
37+
38+
## FHIR SDC Compliance
39+
40+
This implementation follows the FHIR SDC (Structured Data Capture) Adaptive Questionnaire specification:
41+
- Implements `$next-question` operation
42+
- Accepts QuestionnaireResponse
43+
- Returns next Questionnaire based on adaptive logic
44+
- Uses standard LOINC codes for answers
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
volumes:
2+
aidbox_pg_data: {}
3+
4+
services:
5+
aidbox_db:
6+
image: healthsamurai/aidboxdb:17
7+
volumes:
8+
- aidbox_pg_data:/var/lib/postgresql/data:delegated
9+
environment:
10+
POSTGRES_USER: aidbox
11+
POSTGRES_PORT: "5432"
12+
POSTGRES_DB: aidbox
13+
POSTGRES_PASSWORD: M3ya7uZxdJ
14+
15+
aidbox:
16+
extra_hosts:
17+
- "host.docker.internal:host-gateway"
18+
pull_policy: always
19+
image: healthsamurai/aidboxone:edge
20+
depends_on:
21+
- aidbox_db
22+
ports:
23+
- 8888:8888
24+
environment:
25+
BOX_ADMIN_PASSWORD: password
26+
BOX_BOOTSTRAP_FHIR_PACKAGES: hl7.fhir.r4.core#4.0.1
27+
BOX_COMPATIBILITY_VALIDATION_JSON__SCHEMA_REGEX: "#{:fhir-datetime}"
28+
BOX_DB_DATABASE: aidbox
29+
BOX_DB_HOST: aidbox_db
30+
BOX_DB_PASSWORD: M3ya7uZxdJ
31+
BOX_DB_PORT: "5432"
32+
BOX_DB_USER: aidbox
33+
BOX_FHIR_COMPLIANT_MODE: true
34+
BOX_FHIR_CORRECT_AIDBOX_FORMAT: true
35+
BOX_FHIR_CREATEDAT_URL: https://aidbox.app/ex/createdAt
36+
BOX_FHIR_SCHEMA_VALIDATION: true
37+
BOX_FHIR_SEARCH_AUTHORIZE_INLINE_REQUESTS: true
38+
BOX_FHIR_SEARCH_CHAIN_SUBSELECT: true
39+
BOX_FHIR_SEARCH_COMPARISONS: true
40+
BOX_FHIR_TERMINOLOGY_ENGINE: hybrid
41+
BOX_FHIR_TERMINOLOGY_ENGINE_HYBRID_EXTERNAL_TX_SERVER: https://tx.health-samurai.io/fhir
42+
BOX_FHIR_TERMINOLOGY_SERVICE_BASE_URL: https://tx.health-samurai.io/fhir
43+
BOX_INIT_BUNDLE: file:///app/init-bundle.json
44+
BOX_MODULE_SDC_STRICT_ACCESS_CONTROL: false
45+
BOX_ROOT_CLIENT_SECRET: BQuJmUG7N6
46+
BOX_SEARCH_INCLUDE_CONFORMANT: true
47+
BOX_SECURITY_DEV_MODE: true
48+
BOX_SETTINGS_MODE: read-write
49+
BOX_WEB_BASE_URL: http://localhost:8888
50+
BOX_WEB_PORT: 8888
51+
BOX_AUTH_KEYS_PUBLIC: |
52+
-----BEGIN PUBLIC KEY-----
53+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAkOTNRyU491tDI3dBPlnW
54+
Mi90Gj0kVM7lt/9KXVNjUK6MJfb9e44pAL58lzmLhZxk9u/jMvITkG/mFNMELgk8
55+
ki1SYbOTCfF1eEK8EbmQPOsFHvL9REY1uJukEzJC2Pr1xd1lvO3KbWHnpOvhFV9M
56+
xeECbxQQ/3ho3J1PnMhUdXWCDPoVwb6WKuhGsxkKIC6cCg6MXd47ZUdJeQyImMds
57+
sTBoMb/r3arSbIrsh1piDKgkwDXeFMWOvK+G4xC3AqiARjgSAXrzWDPP/AFsIVCJ
58+
e3T25j9P/lrCBooyocbhkXNfFstyUxXKSsUQxc8b5dtpfNiev0VJl3a9THZfIU/1
59+
CwIDAQAB
60+
-----END PUBLIC KEY-----
61+
BOX_AUTH_KEYS_PRIVATE: |
62+
-----BEGIN RSA PRIVATE KEY-----
63+
MIIEogIBAAKCAQEAkOTNRyU491tDI3dBPlnWMi90Gj0kVM7lt/9KXVNjUK6MJfb9
64+
e44pAL58lzmLhZxk9u/jMvITkG/mFNMELgk8ki1SYbOTCfF1eEK8EbmQPOsFHvL9
65+
REY1uJukEzJC2Pr1xd1lvO3KbWHnpOvhFV9MxeECbxQQ/3ho3J1PnMhUdXWCDPoV
66+
wb6WKuhGsxkKIC6cCg6MXd47ZUdJeQyImMdssTBoMb/r3arSbIrsh1piDKgkwDXe
67+
FMWOvK+G4xC3AqiARjgSAXrzWDPP/AFsIVCJe3T25j9P/lrCBooyocbhkXNfFsty
68+
UxXKSsUQxc8b5dtpfNiev0VJl3a9THZfIU/1CwIDAQABAoIBADU6B/rpvpqHiQtf
69+
RLVt9RSsf/8flNgexR6phpzwBBzgchWEPSwFViSy1TwMZKepgyF/kDvn164InUHr
70+
Hq72r6yXP5sqh4pwjBGomkP8ofLu9wuegdFx5UwyyLxQi2QAFQchxLz5sZIrFBhu
71+
mlnqj15lwSoi+fePOR5KH7Pdl8Ep4xjS0OADzdyY+g/m4ELzdZZVfbtoUAI8qdW7
72+
NyC85zI6l2fMsxkfmNLEmc5V3IYGj0IqeuIJIVNRMgLzODwf123tan1DRpuuC//7
73+
+8b+FURRVdv/94yA4lH+afpVrWHjkc0ddGWo6sb44acpwrDugNKVDGfKZgGuJEn1
74+
ipPibPkCgYEAxTsPTAO/Y1VkJTIiRRJ8091UOXCbXUJaHNlxi0Y03u/QcyofuDZd
75+
usPUESerNVegX7gB6imNkOUEGCQkToS817Fe0b+LWjD1mq7CcwY9qKnQuqDbtzu4
76+
aczVLPZPiATUwiVL7DFMDHle+4eSTx1kN0GvZucOF8soHDxZ+TsrfOcCgYEAvBFu
77+
fINo+H6nPwCQ222W+t3Trxk4J8nVFrxTaCAS7pJIFsayaEUHuG7HYAw/SoZGNMgg
78+
7dd2LsXU8+KxH/JotmWQOg0RqJU3uafitZKzjqvde+XhoQcxp0Eh0Co94QuP45hj
79+
IJIggXP/jzKRdwRcmA5U8WZYHihDduEHItcK/j0CgYAwQbINdEFIqaT2IN0Xr11R
80+
bS7lWvL4j3qC4oUQgZ4ACgcjlmPqa4rlXnKtu9n9FDKOGPSG+aHEmPQ2f+lOONYH
81+
pENB6K7M43vEXAwBnr5JXTtP3nnDzF3jrRVfieiNrDjuQ7fe03T6/FtMCbC3oMZb
82+
arvi3pepJLDsr6uH+n06cwKBgBc347cVljEPmeBKVpfwiLJCDq9QYsFuxpL+/yEc
83+
zJmNj77YGxCKbTCU5KJ0AKBXwXUkvAQBFMMjg230r79s8waJtWulT2fLvEx8cJ3Q
84+
FcDocPip4dg6hiPLA7yqamdNQR9tIdfUkpTI2GU6bgEOlcvkARKoevqGKAYWNAZW
85+
HDJVAoGAL67j03Syb6qcExKv1mUNFImWmLQOMP2RRHumO9zcBU45BEgGP3g7e9XG
86+
Oy1JeGxMUvo9/OAUGM696x0yaXNMfTB9qrSBZI+T6wTVh1ueDnuEgA0Va8JoAQUT
87+
0dLbbVOhDx4vg0WExVqkvoAAoOrSzL3n8hWosUdqCE+zhH7b+18=
88+
-----END RSA PRIVATE KEY-----
89+
volumes:
90+
- ./init-bundle.json:/app/init-bundle.json:ro
91+
92+
adaptive-forms-server:
93+
build:
94+
context: .
95+
dockerfile: Dockerfile
96+
ports:
97+
- 3000:3000
98+
environment:
99+
NODE_ENV: production
100+
PORT: 3000
101+
depends_on:
102+
- aidbox
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{
2+
"resourceType": "Bundle",
3+
"type": "transaction",
4+
"entry": [
5+
{
6+
"request": {
7+
"method": "PUT",
8+
"url": "/Questionnaire/depression-assesment"
9+
},
10+
"resource": {
11+
"resourceType": "Questionnaire",
12+
"title": "Depression Assesment Form",
13+
"id": "780f2581-ddc2-4f99-bac6-64aa854e2ef2",
14+
"status": "draft",
15+
"url": "http://forms.aidbox.io/questionnaire/depression-assesment-form",
16+
"extension": [
17+
{
18+
"url": "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-questionnaireAdaptive",
19+
"valueUri": "http://adaptive-forms-server:3000"
20+
}
21+
]
22+
}
23+
}
24+
25+
]
26+
}

0 commit comments

Comments
 (0)