@crvouga/ mockingbird-service-rxvortex (英语)
本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .
国家模拟器 RxVortex( 任务) 测试套房的复合药用API: 客户端 - 证书符号、 命令提交、 状态、 取消、 发送者命令 id 的恢复查询, 预设目录 和签名状态 网络选择药店的帖子。 只移动命令 当测试这样说时(模拟器时钟上的管理过渡或自动推进路径),所以eRx 在真正的沙盒上等待60秒的套房 以毫秒的速度解决.
- 行动范围: 支助
- 供应商不公布具体内容:合同
openapi.yaml)是从线上手写的 造就我们的消费者阅读和写作, 并且它依赖的每一个领域都得到服务.
安装
npm install -D @crvouga/mockingbird-service-rxvortex
仅限无害环境管理。 节点 22或 Bun 1.2. 无土生属地. 给它服务
npx mockingbird-rxvortex serve, (中文(简体) ), createServer 从 ./server (节点),或 createRuntime 与
任何获取服务器.
使用量
点 RXVORTEX_API_URL 在模拟者那里。 设定 RXVORTEX_WEBHOOK_SECRET 在应用程序中,通过同样的
值为 --webhook-secret。 。 。 .
npx mockingbird-rxvortex serve --port 8791 \
--webhook-url http://127.0.0.1:3000/prescriptions/webhooks/rxvortex \
--webhook-secret "$RXVORTEX_WEBHOOK_SECRET" \
--auto-advance "2000:Fill,Shipping,Delivered" \
--catalog ./preset-catalog.json
--catalog 将自己的预设目录加载到每个命名空间: JSON 数组行,或
{data: [...]} 机构 GET /api/v1/preset-catalog-items 答案,所以一个记录的沙盒
响应负载 。 仅 catalog_id 财务报告和审定财务报表 medication_name 需要这样做. POST /__admin/reset
返回这些行。 过 --unknown-presets accept 以任何好的预设身份代之.
import { createServer } from "@crvouga/mockingbird-service-rxvortex/server"
// Test setup: a local RxVortex that posts its status webhooks to the app.
const server = await createServer({
webhooks: { url: "http://127.0.0.1:3000/prescriptions/webhooks/rxvortex", secret: "whsec-test" },
})
const baseUrl = server.url // the app's RXVORTEX_API_URL
const post = (path: string, body: unknown, headers: Record<string, string> = {}) =>
fetch(`${baseUrl}${path}`, {
method: "POST",
headers: { "content-type": "application/json", ...headers },
body: JSON.stringify(body),
})
// Application code: the requests it sends to RxVortex.
const { access_token } = (await (
await post("/api/v1/generate-access-token", { client_id: "acme", client_secret: "s" })
).json()) as { access_token: string }
// …then POST /api/v1/orders with Authorization: Bearer <access_token> and sender_order_id "pay_123"…
// Test control: move that order the way the pharmacy would; each step emits the signed status webhook.
await post("/__admin/orders/pay_123/transition", { to: "Shipping", trackingnumber: "1Z999" })
await post("/__admin/orders/pay_123/transition", { to: "Delivered" })
await server.close()
路线
| 路线 | 行为 |
|---|---|
POST /api/v1/generate-access-token | 贾森 {client_id, client_secret} → {access_token, token_type: "Bearer", expires_in: 86400}。任何一对有效,除非 clients 设定( e)PUT /__admin/settings) (中文(简体) ). Tokens在模拟时钟上保持有效为24 h;我们的客户端缓存为24 h,在401上从不刷新. |
POST /api/v1/orders | 对照合同验证提交有效载荷;违反情况为422起 {message, errors: {"patient.phone": ["…"]}}不活动或未知 preset_catalog_id 422(低于 unknownPresets: "accept" 一个未知的 UUID 成为以请求命名的活跃目录行 medication_name) (中文(简体) ). 重复 order.sender_order_id 409个。 成功 : {success: true, order_tracking_id: "RXV-…", sender_order_id, status: "Created"} (追踪id总是个字符串). |
GET /api/v1/orders/{id} | id 是跟踪 id 或者说 发送者命令 id (我们的付款 id, 回收查询) 。 回返 rxstatus, (中文(简体) ), orderstatus, (中文(简体) ), shipping_status, (中文(简体) ), delivered_date, (中文(简体) ), trackingnumber, (中文(简体) ), shippingservice, (中文(简体) ), shippingcarrier, (中文(简体) ), shipmenttrackingurl, (中文(简体) ), cancellable,并用 order_tracking_id, (中文(简体) ), tracking_id 财务报告和审定财务报表 orderReferenceID。 。 。 . |
DELETE /api/v1/orders/{id} | 取消时 cancellable 出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出出. |
GET /api/v1/preset-catalog-items | {data: [...]} 行为 catalog_id, (中文(简体) ), medication_name, (中文(简体) ), medication_strength, (中文(简体) ), package_size, (中文(简体) ), quantity, (中文(简体) ), quantity_units, (中文(简体) ), medication_form, (中文(简体) ), route, (中文(简体) ), states, (中文(简体) ), status。包括定制亮点主播预设 e404ad76-0f82-4b04-8f25-841650e2e819 和一个不活动行. |
网络呼号
每个地位变动员额 {event: "order.status_updated", orderReferenceID, order_tracking_id, tracking_id, sender_order_id, rxstatus, orderstatus, shipping_status, delivered_date, trackingnumber, shippingcarrier, shippingservice, shipmenttrackingurl, updated_at} 有页眉
x-rxvortex-webhook-secret: <secret> (方言平等,作为我们的接受者检查). 非-2xx 答案
重新试验(即立即5分、5分、30分、2分). GET /__admin/webhooks 清单,
GET /__admin/webhooks/events 载荷, POST /__admin/webhooks/flush 运行等待重试
现在,和 PUT /__admin/webhook-endpoints 每个名称空间接收器.
管理员(超过标准合同)
| 路线 | 效果 |
|---|---|
POST /__admin/orders/:id/transition | {to, trackingnumber?, shippingcarrier?, shippingservice?, delivered_date?}。 。 。 . to 是一个供应商身份: Fill, (中文(简体) ), PV1 Complete, (中文(简体) ), Compound, (中文(简体) ), Out of Stock, (中文(简体) ), On Hold, (中文(简体) ), Shipping, (中文(简体) ), Delivered, (中文(简体) ), Cancelled, (中文(简体) ), Rejected, (中文(简体) ), Error,或任意字符串(已使用逐字记录)。 三个状态字段一起移动;在不给出时,航运生成跟踪. |
PUT /__admin/catalog | {items: [{catalog_id, medication_name, medication_strength?, package_size?, quantity?, quantity_units?, medication_form?, route?, states?, status?}], mode?: "replace" | "merge"} 用于调用命名空间( n)replace 默认; merge 调高由 catalog_id) (中文(简体) ). 答复 {count},命名空间的行数. items 也可作为 data。 。 。 . |
GET /__admin/catalog | 命名空间的行, 如 {data: [...]}。 。 。 . |
PUT /__admin/settings | {tokenTtlSeconds?, staticTokens?, clients?, autoAdvance?: {afterMs, path} | null, unknownPresets?: "reject" | "accept"} 呼叫的命名空间. unknownPresets 默认为 reject就像沙盒一样. staticTokens 承认 RXVORTEX_API_TOKEN (目录客户端的静态持有者). |
POST /__admin/tick | 应用模拟器时钟上到期的每个自动推进步骤(服务模拟器也每100毫秒计分). |
GET /__admin/orders | 名字空间的命令. |
错误预设( E)POST /__admin/faults {"preset": "<name>", "count"?: n}· ; GET /__admin/faults/presets:
duplicate_sender_order_id, (中文(简体) ), created_but_500 (创造,然后500;恢复成功),
numeric_tracking_id, (中文(简体) ), token_expired, (中文(简体) ), stale_error_with_delivered_date, (中文(简体) ),
validation_errors_array, (中文(简体) ), validation_errors_object, (中文(简体) ), validation_errors_empty, (中文(简体) ), server_error, (中文(简体) ),
webhook_duplicate, (中文(简体) ), webhook_reorder, (中文(简体) ), webhook_drop。 。 。 .
命名空间
我们的后端 fetch 无法添加信头,所以可以选择三个方式:
x-mockingbird-namespace页:1 /__admin/ns/<name> 前缀在 RXVORTEX_API_URL,或客户端代码:
PUT /__admin/credentials {"credentials": {"<RXVORTEX_CLIENT_ID>": "<namespace>"}} (手提箱携带)
他们的客户身份被签发.
故意不模拟
- 实际完成时间:除非
autoAdvance已经设定. - 患者和处方细节经过验证,从未存储或回放.
- 活目录:默认行被合成到活客户端的字段名中( 否)
沙盒记录存在). 装入已记录行
serve --catalog, (中文(简体) ),PUT /__admin/catalog, (中文(简体) ), 或catalog选项. - 复置并多令发运.
API 密码
| 导出 | 仁爱 | 说明 |
|---|---|---|
RxVortexAPI | 类 | 进程模拟器 : fetch(request), (中文(简体) ), reset(), (中文(简体) ), transition(id, {to, …}), (中文(简体) ), tick(), (中文(简体) ), orders()选项: sqlite, (中文(简体) ), now, (中文(简体) ), namespace, (中文(简体) ), catalog, (中文(简体) ), settings, (中文(简体) ), onWebhook。 。 。 . |
createRuntime | 函数 | 全面服务合同的仿真器(健康、管理、命名空间、证书、预设、网络呼号)。 选项 : webhooks: {url, secret, retryDelaysMs?, fetch?}, (中文(简体) ), settings, (中文(简体) ), catalog, (中文(简体) ), tickMs, (中文(简体) ), clock, (中文(简体) ), seed, (中文(简体) ), adminKey, (中文(简体) ), onLog。 。 。 . |
RXVORTEX_PRESETS | 对象 | 每个命名的断层预设. |
RXVORTEX_NAMESPACE | 字符串 | 服务名称, "rxvortex"。 。 。 . |
tokenCredential | 函数 | 向客户端代号为无记名代号(如何将证书映射到命名空间). |
CUSTOM_CREAM_ANCHOR_PRESET_ID | 字符串 | 沙盒自定义奶油主播预设ID. |
DEFAULT_CATALOG | 数组 | 默认的预设目录行 . |
parseCatalog, (中文(简体) ), parseCatalogItem | 函数 | 从 JSON 阵列或录入的目录行 {data: [...]} 机构( 缺少可选字段默认为 null, (中文(简体) ), states 改为 [], (中文(简体) ), status 改为 "active");丢入一行畸形. |
document, (中文(简体) ), operationIds, (中文(简体) ), supportedOperationIds | 数值 | 销售商为OpenAPI合同及其业务代号. |
createServer, (中文(简体) ), serveTarget, (中文(简体) ), DEFAULT_PORT, (中文(简体) ), loadCatalogFile (单位:千美元)./server(中文(简体) ) | 节点 | 服务过来 node:http (自动提醒每100米) serve CLI 目标; 端口 8791; 读取a --catalog 文档. |
部分 嘲笑鸟。 。 。 .