ProductReadyProductReady

OpenAPI REST API

使用 oRPC 契约构建外部 REST API 并自动生成 OpenAPI 文档

OpenAPI REST API

ProductReady 包含使用 oRPC 契约优先 构建的 REST API,并自动生成 OpenAPI 文档。它适合外部集成、移动应用、服务间调用,以及非 TypeScript 客户端。

ProductReady 前端优先使用 tRPC。其他系统需要 HTTP/OpenAPI 接口或生成 SDK 时,使用 REST API。

Contract 导出

REST contract 和 client 从轻量 oRPC 集成层 ~/lib/orpc 导出:

import {
  createProductReadyOpenApiClient,
  productreadyOpenApiContract,
} from "~/lib/orpc";

const client = createProductReadyOpenApiClient({
  baseUrl: "https://your-app.com",
  apiKey: process.env.PRODUCTREADY_API_KEY,
});

const me = await client.users.me();

外部 TypeScript 包如果要自己创建 oRPC client,可以直接复用 productreadyOpenApiContract

API 文档访问方式

项目结构

src/
├── app/api/v1/[[...server]]/
│   ├── app.ts          # 测试兼容的 request wrapper
│   └── route.ts        # Next.js route handler
├── domains/openapi/
│   ├── auth.ts         # 普通 REST endpoint 的 API key 认证
│   ├── contract.ts     # 普通 REST oRPC contract 与 Zod schemas
│   └── router.ts       # 普通 REST contract 实现
├── domains/systemadmin/openapi/
│   ├── auth.ts         # System admin secret 认证
│   ├── contract.ts     # System admin oRPC contract
│   └── router.ts       # System admin 实现
└── lib/orpc/
    ├── client.ts       # 类型安全 oRPC/OpenAPI client helper
    ├── spec.ts         # OpenAPI spec 生成
    ├── http.ts         # Fetch handler 与 Swagger UI
    └── index.ts        # 公开导出

新增端点

先在所属 domain 的 contract 添加 procedure,例如 src/domains/openapi/contract.ts

import { oc } from "@orpc/contract";
import { z } from "zod";

export const hello = oc
  .route({
    method: "GET",
    path: "/api/v1/hello",
    tags: ["General"],
    summary: "Say hello",
  })
  .output(z.object({ message: z.string(), timestamp: z.string() }));

再到对应 domain router 实现,例如 src/domains/openapi/router.ts

hello: os.hello.handler(() => ({
  message: "Hello from ProductReady!",
  timestamp: new Date().toISOString(),
}));

同一份 contract 会驱动运行时 handler、/api/v1/openapi.json、Swagger UI 和 TypeScript client。

认证

受保护端点使用 Bearer token:

curl -H "Authorization: Bearer YOUR_API_KEY" \
  http://localhost:3000/api/v1/users/me

/api/v1/system-admin/* 下的系统管理端点需要全局 system admin secret,或 system admin API key。

快速开始

curl http://localhost:3000/api/v1/health
curl http://localhost:3000/api/v1/openapi.json

测试

app.request() wrapper 会保留给现有集成测试使用:

import { app } from "../src/app/api/v1/[[...server]]/app";

const response = await app.request("/api/v1/health");
expect(response.status).toBe(200);

需要 client contract 检查时,从 ~/lib/orpc 导入 createProductReadyOpenApiClient

相关页面

On this page