@crvouga/mockingbird-service-pharmetika (中文(简体) )
本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .
国家模拟器 法尔梅蒂卡 测试套房的复合药剂供应商门户: 诊所和病人的检查、病人的创造、药物订单验证/EPCS准备/提交/ 检查,v7取消, 药物模式目录, 状态网点药店 邮递员 命令只当测试时才移动( 管理过渡或自动推进路径) 模拟时钟.
- 行动范围: 支助
- 供应商不公布具体内容:合同
openapi.yaml)是从线上手写的 塑造我们的消费者阅读和写作(pharmetika-fulfillment.adapter.ts, (中文(简体) ),pharmetika-live.client.ts,以及适配器谱中记录的遗体). - 成功法则. 每具尸体都带着Pharmetika的
success旗帜。 仅true或者说1实值 成功:模拟器回答商业故障(未知病人,提交控制物质, 重复使用的命令 id,...) HTTP 200 带success: 0财务报告和审定财务报表messages: [{message, type}],则 我们的适配器卫兵会反对.
安装
npm install -D @crvouga/mockingbird-service-pharmetika
仅限无害环境管理。 节点 22或 Bun 1.2. 无土生属地. 给它服务
npx mockingbird-pharmetika serve, (中文(简体) ), createServer 从 ./server (节点),或 createRuntime 与
任何获取服务器.
使用量
点 PHARMETIKA_API_URL 在模拟器上给应用程序任何 PHARMETIKA_API_TOKEN (或一针)
与 --api-token) (中文(简体) ). 设定 PHARMETIKA_WEBHOOK_SECRET 在应用程序中传递与
--webhook-secret。 。 。 . PHARMETIKA_PRACTITIONER_IDENTIFIER 可以是任意字符串;
PHARMETIKA_CLINIC_NAME=Acme 选择种子诊所.
npx mockingbird-pharmetika serve --port 8801 \
--webhook-url http://127.0.0.1:3000/prescriptions/webhooks/pharmetika \
--webhook-secret "$PHARMETIKA_WEBHOOK_SECRET" \
--auto-advance "2000:data_entry,shipped,completed"
import { createServer } from "@crvouga/mockingbird-service-pharmetika/server"
// Test setup: a local Pharmetika that posts its status webhooks to the app.
const server = await createServer({
webhooks: { url: "http://127.0.0.1:3000/prescriptions/webhooks/pharmetika", secret: "whsec" },
})
const baseUrl = server.url // the app's PHARMETIKA_API_URL
// Application code: the order it submits to Pharmetika.
const id = "0192f0c8-7a3e-7cc1-9f5d-3b2a1c4d5e6f"
await fetch(`${baseUrl}/api/v5/provider_portal/medication_order/id/${id}/submit`, {
method: "PUT",
headers: { "x-pmk-authentication-token": "pmk_test", "content-type": "application/json" },
body: JSON.stringify({
clinic_identifier: "clinic-acme-0001",
medication_order_identifier: id,
patient: { identification: { patient_id: 1 } },
medication_requests: [
{ product_identification: { product_identifier: "PMK-ENCLO-25" }, quantity_authorized: 1, sig: "daily" },
],
}),
})
// Test control: move the order the way the pharmacy would; each step posts the status webhook.
const transition = (body: unknown) =>
fetch(`${baseUrl}/__admin/orders/${id}/transition`, {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify(body),
})
await transition({ to: "data_entry" })
await transition({ to: "shipped", tracking_id: "1Z999" })
await transition({ to: "completed" })
await server.close()
路线
所有供应商-门户路线都需要 x-pmk-authentication-token (任何非空相,除非
tokens ; 缺少或拒绝的符号是 401 {success: 0, messages}。 。 。 .
| 路线 | 行为 |
|---|---|
GET /api/v5/provider_portal/clinic/clinic_list | {success: 1, data: [{identifier, data: {name}}]}种子 Acme 财务报告和审定财务报表 Acme West。 。 。 . |
GET /api/v5/provider_portal/provider/patient_list | {success: 1, data: [{patient_id, demographics: {first_name, last_name, DOB, email, phone_primary, line_1, postal_code}}]}. 从一个沙盒病人(id 1,"沙盒病人")开始. |
POST /api/v5/provider_portal/patient/create_new | 一个FHIR Patient 加号 clinic_identifier创建时间 : {success: true, patient_id, messages: [{message: "Added Patient!"}]}。与现有病人相同的首名/上名和DOB: {success: 0, duplicate_entry_count, duplicate_entries: [...]} (我们的适配器通过匹配). |
PUT …/medication_order/id/{uuid}/validate | 干跑动。 检查诊所、病人的身份证 product_identifier 以物配主 sig ("请示"). 答复 data: {controlled_substance_list_count, medication_list: [{…entry, medication_order_entry_identifier, controlled, control_level}]}; 预定产品(testosterone为C-III)成套 controlled。 。 。 . |
PUT …/medication_order/id/{uuid} | EPCS 准备(需要) prepared_by) (中文(简体) ). 将顺序 : pending_prescriber_approval这是 未提交。处方的“标志”,其管理员向 signed。 。 。 . |
PUT …/medication_order/id/{uuid}/submit | 创建顺序于 prescription_entered1. 受控物质被拒绝(success: 0) (中文(简体) ). UUIDv7号案:重新提交同一诊所/病人/产品/数量/西格(我们的适配器再生物) date_issued 和每次尝试的条目标识,所以这些被忽略)答案与第一次一样;在被使用的标识下的不同内容是 409 {success: 0};同一id同时提交的是: 409。 。 。 . |
GET …/medication_order/id/{uuid} | {success: 1, data: {order_status, medication_order_identifier, electronic_prescription_order_number, data: {order_status, …, ancillary_order_data: {medication_order_status: {workflow_status, tracking_id}}}}}; 未知编号 404. |
PUT /api/v7/provider_portal/medication_order/entry/cancel | {note, prescriber_order_number: <uuid>} → {success: 1, messages: []} (或不明) success: 0{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}让网友知道. |
GET /api/pharmetika/provider_access/profile/medication_templates | {success: 1, data: [{template_identifier, medication_display_name, description, map_dose_to_product: {dose: product_identifier}, qty_options, default_sigs, available_states, controlled}]},接受符号,基本(PHARMETIKA_USERNAME/PASSWORD,任意一对,除非 basic )或无证书(除非 anonymousCatalog: false)——我们的委托人三个倒计时. |
网络呼号
每个地位员额改为: --webhook-url 有页眉 x-pharmetika-webhook-secret: <secret>
(方言平等,作为我们的接受者检查). 身体形状跟随命名空间
webhookVariant,每个球场一个倒下 我们的接收器说:
| 备选案文 | 体质 |
|---|---|
workflow_status (默认) | {event_type, event_data: {electronic_prescription_order_number, medication_order_identifier, medication_order_status: {workflow_status, tracking_id}, tracking_id?, updated_at}} |
status | {event_type, event_data: {medication_order_identifier, status, tracking_id?}} |
flat | {medication_order_identifier, medication_order_workflow_status, tracking_id?} |
ID两个字段都带有我们的UUIDv7(接收器从它那里得到付款)。 非-2xx的答案是:
重审(即即时取出5 s,5 min,30 min,2 h). GET /__admin/webhooks 清单,
GET /__admin/webhooks/events 载荷, POST /__admin/webhooks/flush 运行等待重试,
PUT /__admin/webhook-endpoints 每个名称空间接收器.
状态图
已设定的过渡 workflow_status 逐字记录,所以任何字符串都有效。 那些我们的地图员知道:
| 工作流动状况 | 我们的地位 |
|---|---|
completed, (中文(简体) ), shipped-received, (中文(简体) ), delivered | 已交付 |
shipped, (中文(简体) ), Completed Orders | 已运出 |
cancelled | 已取消 |
data_entry*, (中文(简体) ), lab_formulation, (中文(简体) ), contacting_patient, (中文(简体) ), compounding*, (中文(简体) ), filled, (中文(简体) ), dispensed, (中文(简体) ), dispense_checked, (中文(简体) ), dispense_verified, (中文(简体) ), order_reconciliation, (中文(简体) ), shipping, (中文(简体) ), signed, (中文(简体) ), verified, (中文(简体) ), checked, (中文(简体) ), ready, (中文(简体) ), ready-ship, (中文(简体) ), Complete Processing | 处理 |
其它东西prescription_entered, (中文(简体) ), pending_prescriber_approval(中文(简体) ) | 提交的 |
装运或后期状态产生 tracking_id 当未给出时; 跟踪标识促进
提交/处理后运入接收器.
管理员(超过标准合同)
| 路线 | 效果 |
|---|---|
POST /__admin/orders/:uuid/transition | {to, tracking_id?}:设置工作流程状态并放出webhook. |
GET /__admin/orders | 取名空间的命令(只有身份和状态). |
GET /__admin/patients, (中文(简体) ), POST /__admin/patients | 阅读或播种名册: {patient_id?, clinic_identifier?, demographics: {first_name, last_name, DOB, …}}。 。 。 . |
PUT /__admin/templates | 替换药品模板({templates: [...]}) (中文(简体) ). |
GET编号 :PUT /__admin/settings | {tokens?, basic?, anonymousCatalog?, webhookVariant?, autoAdvance?: {afterMs, path} | null} 呼叫的命名空间. |
POST /__admin/tick | 应用适当的自动推进步骤(服务仿真器每100毫秒勾出). 等待处方批准的命令从来不自动执行. |
错误预设( E)POST /__admin/faults {"preset": "<name>", "count"?: n}· ; GET /__admin/faults/presets:
| 预设 | 效果 |
|---|---|
validate_success_zero, (中文(简体) ), submit_success_zero, (中文(简体) ), prepare_success_zero, (中文(简体) ), lookup_success_zero | HTTP 200 带 success: 0 和一个消息 |
validate_422 | 422个 {success: 0, messages: [{message: "Please provide instructions"}]} |
success_boolean | 成功答案 success: true 改为 1 |
success_string | 成功答案 success: "1" (我们的客户端读为失败) |
cancel_success_true | 取消对答 success: true (我们的取消只接受) 1(中文(简体) ) |
submitted_but_500 | 提交记录顺序, 然后回答 500; 重试重放成功 |
patient_create_duplicate, (中文(简体) ), patient_create_500 | 创建被拒绝为重复( 命名为病人) , 或失败 |
clinic_list_keyed | clinic_list 答题 data 作为被标识符键入的对象 |
controlled_count_string, (中文(简体) ), controlled_nested_requests | 验证的可控物质信号作为字符串计数,或在 data.medication_requests |
unauthorized, (中文(简体) ), server_error | 每通电话401;每通服务商-门户电话500 |
webhook_duplicate, (中文(简体) ), webhook_reorder, (中文(简体) ), webhook_drop | 下一个状态的 webhooks 发送错误 |
命名空间
我们的后端 fetch 无法添加信头,所以可以选择三个方式:
x-mockingbird-namespace页:1 /__admin/ns/<name> 前缀在 PHARMETIKA_API_URL,或证书:
PUT /__admin/credentials {"credentials": {"<PHARMETIKA_API_TOKEN>": "<namespace>"}} (基本法)
用户名对目录客户端同样有效.
故意不模拟
- 真正的完成时间和药房的内部排队:除非
autoAdvance已经设定. - EPCS签署本身(两个要素,DEA检查):向
signed代表着它. - Sigs,根据订单,文件和理由整理的人口统计被验证,从未被存储
或重复;只有名册保留人口统计
patient_list返回. - 活目录: 默认模板在活客户端剖析的字段中合成
(没有沙盒记录);通过
templates或者说PUT /__admin/templates以装入已记录行. - 复取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取出取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取.
API 密码
| 导出 | 仁爱 | 说明 |
|---|---|---|
PharmetikaAPI | 类 | 进程模拟器 : fetch(request), (中文(简体) ), reset(), (中文(简体) ), transition(uuid, {to, tracking_id?}), (中文(简体) ), tick(), (中文(简体) ), orders(), (中文(简体) ), webhookBody(order)选项: sqlite, (中文(简体) ), now, (中文(简体) ), namespace, (中文(简体) ), templates, (中文(简体) ), clinics, (中文(简体) ), patients, (中文(简体) ), settings, (中文(简体) ), onWebhook。 。 。 . |
createRuntime | 函数 | 全面服务合同的仿真器(健康、管理、命名空间、证书、预设、网络呼号)。 选项 : webhooks: {url, secret, retryDelaysMs?, fetch?}, (中文(简体) ), settings, (中文(简体) ), templates, (中文(简体) ), clinics, (中文(简体) ), patients, (中文(简体) ), tickMs, (中文(简体) ), clock, (中文(简体) ), seed, (中文(简体) ), adminKey, (中文(简体) ), onLog。 。 。 . |
PHARMETIKA_PRESETS | 对象 | 每个命名的断层预设. |
PHARMETIKA_NAMESPACE | 字符串 | 服务名称, "pharmetika"。 。 。 . |
TOKEN_HEADER | 字符串 | "x-pmk-authentication-token"。 。 。 . |
WEBHOOK_SECRET_HEADER | 字符串 | "x-pharmetika-webhook-secret"。 。 。 . |
tokenCredential | 函数 | 请求所携带的证书(portal sorders, else Basic username),用于命名空间映射. |
DEFAULT_TEMPLATES, (中文(简体) ), DEFAULT_CLINICS, (中文(简体) ), SANDBOX_PATIENT | 数值 | 种子目录、诊所和名册病人. |
KNOWN_STATUSES, (中文(简体) ), SUBMITTED_STATUS, (中文(简体) ), PENDING_APPROVAL_STATUS | 数值 | 有记录的工作流程状态 . |
document, (中文(简体) ), operationIds, (中文(简体) ), supportedOperationIds | 数值 | 销售商为OpenAPI合同及其业务代号. |
createServer, (中文(简体) ), serveTarget, (中文(简体) ), DEFAULT_PORT (单位:千美元)./server(中文(简体) ) | 节点 | 服务过来 node:http (自动提醒每100米) serve CLI目标; 第8801口. |
部分 嘲笑鸟。 。 。 .