47 lines
1.8 KiB
TypeScript
47 lines
1.8 KiB
TypeScript
import { OpenAPIHandler } from '@orpc/openapi/fetch'
|
||
import { OpenAPIReferencePlugin } from '@orpc/openapi/plugins'
|
||
import { onError } from '@orpc/server'
|
||
import { ZodToJsonSchemaConverter } from '@orpc/zod/zod4'
|
||
import { createFileRoute } from '@tanstack/react-router'
|
||
import { name, version } from '@/../package.json'
|
||
import { handleValidationError, logError } from '@/server/api/interceptors'
|
||
import { router } from '@/server/api/routers'
|
||
|
||
const handler = new OpenAPIHandler(router, {
|
||
plugins: [
|
||
new OpenAPIReferencePlugin({
|
||
docsProvider: 'scalar',
|
||
schemaConverters: [new ZodToJsonSchemaConverter()],
|
||
specGenerateOptions: {
|
||
info: {
|
||
title: name,
|
||
version,
|
||
description:
|
||
'UX 授权服务 OpenAPI 文档。该服务用于工具箱侧本地身份初始化与密码学能力调用,覆盖设备授权密文生成、任务二维码解密、摘要信息加密、报告签名打包等流程。\n\n推荐调用顺序:\n1) 写入平台公钥;\n2) 写入已签名 licence JSON;\n3) 写入 OpenPGP 私钥;\n4) 读取本机身份状态进行前置校验;\n5) 执行加密/解密与签名接口。\n\n说明:除文件下载接口外,返回体均为 JSON;字段示例已提供,便于联调和 Mock。',
|
||
},
|
||
},
|
||
docsPath: '/docs',
|
||
specPath: '/spec.json',
|
||
}),
|
||
],
|
||
interceptors: [onError(logError)],
|
||
clientInterceptors: [onError(handleValidationError)],
|
||
})
|
||
|
||
export const Route = createFileRoute('/api/$')({
|
||
server: {
|
||
handlers: {
|
||
ANY: async ({ request }) => {
|
||
const { response } = await handler.handle(request, {
|
||
prefix: '/api',
|
||
context: {
|
||
headers: request.headers,
|
||
},
|
||
})
|
||
|
||
return response ?? new Response('Not Found', { status: 404 })
|
||
},
|
||
},
|
||
},
|
||
})
|