Skip to content

feat(openapi): OpenAPI 3.1 спецификация REST API#57

Merged
friench merged 1 commit into
mainfrom
feat/openapi
Jul 6, 2026
Merged

feat(openapi): OpenAPI 3.1 спецификация REST API#57
friench merged 1 commit into
mainfrom
feat/openapi

Conversation

@friench

@friench friench commented Jul 6, 2026

Copy link
Copy Markdown
Owner

Что это

OpenAPI 3.1 спецификация REST API (закрывает #22). Отдаётся на GET /openapi.json (публично), собирается из компактного манифеста роутов. Тела запросов выводятся из реальных zod-валидаторов через z.toJSONSchema (zod v4) — поэтому спека не может разойтись с тем, что API валидирует. Без новых зависимостей.

Surfaces: REST API + dashboard + MCP (генерация клиентов/доков — стандартным тулингом из спеки).

Как работает

  • lib/openapi: манифест роутов + buildOpenApiDocument (теги, security-схемы ApiKeyAuth (X-Api-Key) и SessionCookie; admin-эндпоинты принимают любой из двух).
  • GET /openapi.json (без аутентификации), документ строится один раз при старте.
  • pnpm openapi:emit [file] — выгрузка спеки в файл для CI и генерации клиентов (openapi-generator, redoc, …).
  • UI: ссылка «API spec ↗» в сайдбаре (same-origin, CSP-safe) + i18n en/ru.

Покрытие

Публичный sending API (/send, /jobs) — точно, с телом запроса из sendBodySchema; плюс основные admin-ресурсы (domains, mailboxes, aliases, suppressions, bounces, api-keys, import, access-rules, fetchmail, migrations, smtp-accounts, webhooks, observability). 29 путей, 16 тегов.

Изменения

  • lib/openapi.ts, routes/openapi.ts, bin/emit-openapi.ts + скрипт openapi:emit.
  • UI: ссылка на спеку в навигации.
  • Тесты: unit (валидный 3.1-документ, security-схемы, тело /send из валидатора, ключевые пути) + интеграционный (отдаётся публично).

Проверки

typecheck · lint · format:check · vitest (525 ✓) · ui typecheck/build — всё зелёное. pnpm openapi:emit даёт валидный JSON (29 путей).

Заметка

Тела запросов точные (из валидаторов); ответы описаны на высоком уровне (статус + описание) — этого достаточно для генерации клиентов и навигации. .refine()/.transform() в валидаторах не выразимы в JSON Schema и эмитятся как {} (опция unrepresentable: 'any'). Встроенный рендер Swagger UI не добавлял намеренно — строгий CSP дашборда блокирует CDN-скрипты; спека отдаётся как JSON, доки генерятся внешним тулингом.

Closes #22

🤖 Generated with Claude Code

Serve an OpenAPI 3.1 document at GET /openapi.json (public), built from a
compact route manifest. Request bodies are derived from the actual zod
validators via z.toJSONSchema (zod v4) — so the spec can't drift from
what the API validates. No new dependency.

- lib/openapi: route manifest + buildOpenApiDocument (tags, ApiKeyAuth +
  SessionCookie security schemes; admin endpoints accept either)
- routes/openapi: GET /openapi.json (unauthenticated), built once at start
- bin/emit-openapi + `pnpm openapi:emit [file]` for CI / client generation
- UI: "API spec ↗" link in the sidebar (same-origin, CSP-safe) + i18n
- tests: unit (valid 3.1 doc, security, send body from validator, core
  paths) + integration (served publicly)

Covers the public sending API (/send, /jobs) precisely plus the primary
admin resources. Clients/docs are generated from the served spec with
standard tooling (openapi-generator, redoc, …).

Closes #22

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@friench friench merged commit e512b4b into main Jul 6, 2026
1 check passed
@friench friench deleted the feat/openapi branch July 6, 2026 16:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

OpenAPI specification for the REST API

1 participant