@crvouga/ mockingbird-service-odx (英语)
本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .
国家模拟器 优化DX(ODX) 测试套房的API:伙伴实验室及其
生物标记元素、练习病人(创建、更新、删除、伙伴链接、搜索)、实验室
《功能卫生报告》(JSON或PDF),
网络记录和签名 PatientTest (原始内容存档于2018-10-21). Webhoks ODX spots back.
该供应商已退役 2026-07-22. 我们的队列路径只能由
acme-pdf-enabled旗帜( 默认)false),所以一个没有PostHog的本地堆栈仍然呼叫ODX. 更便宜的修补就是通过PostHog模拟器把旗子打开 (单位:千美元)@crvouga/mockingbird-service-posthog); 当套房必须练习 ODX 时使用此模拟器 路径本身(生物时代的网络呼声、健康PDF上传、迁移).
- 行动范围: 支助
- ODX 发布无 spec :
openapi.yaml由我们消费者的电线形状手工制作 (单位:千美元)optimal.dx.service.ts和QA的防线odx-client.ts) (中文(简体) ).
安装
npm install -D @crvouga/mockingbird-service-odx
仅限无害环境管理。 节点 22或 Bun 1.2. 无土生属地. 给它服务
npx mockingbird-odx serve, (中文(简体) ), createServer 从 ./server (节点),或 createRuntime 带有任意
获取服务器 .
使用量
真正的基础 URL 是 https://odxinstanceresource.azure-api.net/<partner>;伙伴部分为
你的账户是sult.
点 OPTIMAL_URL 在模拟器上( 它是压倒性的; 不需要路径前缀), 保留任何
OPTIMAL_API_KEY 财务报告和审定财务报表 OPTIMAL_PRACTICE_ID。预先登记后端的 Webhook, 或者让
manageWebhooks 通过注册 POST /v1/webhook 在生产方面:
npx mockingbird-odx serve --port 8817 \
--webhook-url http://127.0.0.1:3000/odx/webhook # must equal SYSTEM_API_DEPLOYMENT_URL/odx/webhook
import { createServer } from "@crvouga/mockingbird-service-odx/server"
// Test setup: the emulator, with the backend's webhook pre-registered.
const server = await createServer({ webhook: { url: "http://127.0.0.1:3000/odx/webhook" } })
// Application code: OPTIMAL_URL is server.url; any OPTIMAL_API_KEY and practice id.
const baseUrl = server.url
const created = await fetch(`${baseUrl}/v1/practice/p1/patient`, {
method: "POST",
headers: { ApiKey: "any", "content-type": "application/json" },
body: JSON.stringify({
firstName: "Ada",
lastName: "Lovelace",
gender: "Female",
email: "[email protected]",
}),
})
const patient = (await created.json()) as { patientId: number }
// …the app posts HL7 to /v1/practice/p1/patient/{patientId}/test; the emulator answers the parsed
// PatientTest and posts a signed `Created` webhook to /odx/webhook.
await server.close()
路线
| 路线 | 行为 |
|---|---|
GET /v1/partner/labs | [{labId, name, isCurrentLab}]: AHA (1), 查询(2), LabCorp (3). |
GET /v1/elements/{labId} | 要件ELEMENTS实验室: elementId, (中文(简体) ), elementName, (中文(简体) ), elementGenderType, (中文(简体) ), cuUnit, (中文(简体) ), siUnit, (中文(简体) ), cuToSiConversionFactor, (中文(简体) ), elementReferences[{elementCode}] (LOINC代码为HL7 OBX-3被映射出). 包括九种同龄输入(494,496,506,511,537/538,556,564,568,571). 未知实验室 ~ 404 {Message}。 。 。 . |
POST /v1/practice/{pid}/patient | 创建一个 OdxPatient 带有数字 patientId (10001...) (中文(简体) ). firstName, (中文(简体) ), lastName, (中文(简体) ), email ,否则ASP.NET问题细节400. dateOfBirth 变成 YYYY-MM-DDT00:00:00· ; gender 改为 Male编号 :Female编号 :Unknown。 。 。 . |
PUT /v1/practice/{pid}/patient/{id} | 替换患者; 404 {Message} 在那个惯例中未知. |
DELETE /v1/practice/{pid}/patient/{id} | 204; 放弃测试(QA destroption). |
POST /v1/practice/{pid}/patient/{id}/partner/{localUserId} | 身体为文字 false; 存储我们的用户代号(admin-visible). 答复 true。 。 。 . |
GET /v1/practice/{pid}/patients | 所有患者;其中任何一位 email, (中文(简体) ), firstName, (中文(简体) ), lastName, (中文(简体) ), dateOfBirth 这是一个对案件不敏感的搜索 答案 404 当没有匹配时 (我们的客户通行证) ignore404) (中文(简体) ). |
POST …/patient/{id}/test | HL7 导入 : {labProfileId, labId, testDate, unitType, userId, externalReference, externalMessageControlId?, externalPatientTestId, menstrualPhase, isFasting, hl7}目标3 code^text 根据实验室代码绘制到元素的地图, EL<id>,或名称(hs-CRP选择病人的性别);OBX-5等值 <0.2 变成 comparison: "<"。未映射/非数值观测地 importLogs释放 Created。没有MSH或OBX的信息是400. |
PUT …/patient/{id}/test/{testId} | 再入; 输出 Updated (ODX发送一个Created+更新的配对,数据相同). |
POST …/patient/{id}/testresults | 结构化导入( E)results[{elementId, value, comparison}]; 发射 Created。 。 。 . |
GET …/patient/{id}/tests | 病人的测试,最古老的第一. |
POST /v1/reports/FunctionalHealthReport | outputType: Json → {metadata, labs, elements, sections} 与部分 我们 storeHealthData a. 读取(组、上/下最佳、“功能体系统”条件、健康问题); Pdf • 有效的单页 application/pdf。未知测试 ~ 404. |
GET /v1/webhooks | [{partnerWebhookId, signingKey, createDate, entityEvents: {PatientTest}, webhookUrl}] - 我们的后卫呼吁这个 每个 输入到 webhook 获取密钥. |
POST /v1/webhook, (中文(简体) ), PUT /v1/webhook/{id} | 登记册/更新manageWebhooks) (中文(简体) ). |
错误: 缺少/ 未知 ApiKey 第401条 {statusCode, message} (Azure API 管理形状);
ODX 错误 {Message}; 验证 → ASP.NET 问题细节 {title, status, errors}。 。 。 .
网络呼号
每个测试进口或再进口站 {entityType: "PatientTest", eventType, data: <PatientTest>}
连接到每个已注册的 Webhook URL 订阅该事件,并
optimaldx-signature: <UPPERCASE hex HMAC-SHA256(signingKey, rawBody)>。 。 。 . data 是全数
病人试验(results[].comparison 永远是弦,正如我们的接收器的 zod DTO 要求.
非-2xx的答案被重审(即即时5 s,5 min,30 min,2 h). GET /__admin/webhooks, (中文(简体) ),
/__admin/webhooks/events, (中文(简体) ), POST /__admin/webhooks/flush 财务报告和审定财务报表 …/replay 工作如常.
管理员(超过标准合同)
| 路线 | 效果 |
|---|---|
POST /__admin/tests/:id/webhook | {eventType?: Created|Updated|Deleted, signature?: valid|short|bad}: 释放出一个被存储的测试的网页. |
DELETE /__admin/tests/:id | 释放 Deleted 并放弃测试. |
GET /__admin/patients, (中文(简体) ), GET /__admin/tests | 命名空间的记录(病人包括 partnerUserId; HL7 文本从未被存储). |
GET编号 :PUT /__admin/settings | {apiKeys?: string[]} (空接受任何密钥). |
错误预设( E)POST /__admin/faults {"preset": "<name>", "count"?: n}: wrong_length_signature, (中文(简体) ),
bad_signature, (中文(简体) ), empty_success, (中文(简体) ), no_content, (中文(简体) ), not_found, (中文(简体) ), server_error, (中文(简体) ), slow, (中文(简体) ),
webhook_duplicate, (中文(简体) ), webhook_reorder, (中文(简体) ), webhook_drop。 。 。 .
命名空间
x-mockingbird-namespace页:1 /__admin/ns/<name> 前缀在 OPTIMAL_URL,或用 API 键:
PUT /__admin/credentials {"credentials": {"<OPTIMAL_API_KEY>": "<namespace>"}}。 。 。 .
已知的消费者错误
- 错误的签名 − 500.
OdxSignatureGuard.verifyHmac电话crypto.timingSafeEqual不同长度的缓冲器,可抛出RangeError改为 回来的假,所以一个短optimaldx-signature是一个500(ODX然后重试)而不是一个 403. 国家wrong_length_signature预设发送32个特征的签名来复制. manageWebhooks“更新”一个自有的旧 URL 的呆滞注册( 无), 然后注册 新的,所以 stale 注册积累.updateWebhook通过方法为'Put'; 节点的取来使其正常化( Bun 的取出没有—— 即 随着应用程序运行在节点上,消费端口恢复正常.
故意不模拟
- 临床逻辑:报告状况和健康问题仅产生结果 生物年龄没有计算.
- 真正的元素目录(千个元素,实验室专用代码):13个元素体 满足消费者的需求 HL7除MSH/OBX以外的部分被忽略;PID从未被存储.
- 报告主题,超出元数据标签的收件人,以及PDF内容.
- 没有正式的SDK存在,所以没有SDK放入测试.
API 密码
| 导出 | 仁爱 | 说明 |
|---|---|---|
OdxAPI | 类 | 进程模拟器 : fetch(request), (中文(简体) ), reset(), (中文(简体) ), emit(testId, eventType, signature?), (中文(简体) ), patients(), (中文(简体) ), tests()选项: sqlite, (中文(简体) ), now, (中文(简体) ), namespace, (中文(简体) ), settings, (中文(简体) ), onWebhook。 。 。 . |
createRuntime | 函数 | 服务合同的模拟者。 选项 : webhook: {url, signingKey?}, (中文(简体) ), settings, (中文(简体) ), retryDelaysMs, (中文(简体) ), fetch, (中文(简体) ), clock, (中文(简体) ), seed, (中文(简体) ), adminKey, (中文(简体) ), onLog。 。 。 . |
ODX_PRESETS | 对象 | 每个命名的断层预设. |
ODX_NAMESPACE | 字符串 | 服务名称, "odx"。 。 。 . |
SIGNATURE_HEADER | 字符串 | "optimaldx-signature"。 。 。 . |
signOdx | 函数 | (signingKey, body) → UPPERCASE hex HMAC-SHA256。 。 。 . |
apiKeyCredential | 函数 | 这个 ApiKey 页眉( 如何将证书映射到命名空间) . |
ELEMENTS, (中文(简体) ), LABS | 数组 | 元素体和伙伴实验室. |
matchElement, (中文(简体) ), parseObservations | 函数 | HL7 OBX解析和代码 → 元素映射. |
DEFAULT_SETTINGS | 对象 | 人名空间默认值 . |
document, (中文(简体) ), operationIds, (中文(简体) ), supportedOperationIds | 数值 | 销售商为OpenAPI合同及其业务代号. |
createServer, (中文(简体) ), serveTarget, (中文(简体) ), DEFAULT_PORT (单位:千美元)./server(中文(简体) ) | 节点 | 服务过来 node:http; 数据 serve CLI目标; 第8817口. |
部分 嘲笑鸟。 。 。 .