# PR-3: OpenAPI контракт `lk-gateway` (ESIA Finance API V1) ## Цель Зафиксировать REST-контракт между `lk-gateway` (наш сервис) и ЛК клиента на платформе ESIA Finance. Контракт — отправная точка для: - собственного эмулятора ЛК (`lk-emulator`, PR будет позже); - интеграции с командой реального ЛК (когда формы документа на стороне ЛК будут готовы). ## Источники правды - `DOC/API ЛК ЕСИА.pdf` — официальное описание API V1 платформы ESIA Finance (`/api/v1/back_office/...`, Basic HTTP, JSON, UTF-8). - `DOC/M2MSchemas_260408/*.xsd` — поля заявления должны быть достаточны для формирования `M2MTransferRequest`. ## Состав PR ### 1. `docs/lk-contract/v1/openapi.yaml` Спецификация OpenAPI 3.0. Покрывает следующие операции: - `POST /api/v1/back_office/claims/` — создание заявки на M2M-перевод. - Тело: подписанное заявление инвестора (XML или JSON, согласовать с командой ЛК; XML с XMLDSig — предпочтительнее, проще верифицировать на нашей стороне через `crypto-service`). - Ответ: `{ id, status, created_at, success: true }`. - `GET /api/v1/back_office/claims/{id}` — получение заявки и её статуса. - `PATCH /api/v1/back_office/claims/{id}` — обновление статуса от нашей стороны (callback). - `GET /api/v1/back_office/claims` — список заявок (фильтры по статусу, периоду, инвестору). - Аутентификация: Basic HTTP (как в API V1 ESIA Finance). - Формат ошибок — как в `API ЛК ЕСИА.pdf`: `{ error: true, status, code, title, meta: { message, errors } }`. ### 2. Состав модели «Заявка» Минимальный набор полей, нужный для формирования `M2MTransferRequest`: - `id` (uuid), - `created_at`, `updated_at`, - `status` — enum (`draft|signed|submitted|in_progress|confirmed|rejected|timed_out`), - `investor` — ссылка на пользователя в ЛК (или встроенные ФИО+документ); - `transferring_depository_inn`, `receiving_depository_inn`, - `securities[]` — список с `security_code`, `isin` (или `security_info`), `quantity_whole|fractional`, `settlement_accounts[]`, - `cost_info` — `yes { code } | no`, - `iia_agreement` (опц., для ИИС) — `agreement_type T12|T03`, `agreement_number`, `agreement_date`, `broker_inn`, - `signed_document` (base64) — подписанный XML заявления, - `signature_format` — `XMLDSig-GOST` или `XMLDSig-RSA`. ### 3. Состав модели «Callback статуса» Что мы отправляем обратно в ЛК: - `claim_id`, - `new_status` (по тому же enum), - `reason_code` (для отказов — код причины из M2MTransferResponse), - `reason_text`, - `updated_at`, - `nsd_response` — оригинал ответа НРД (опц., для аудита). ### 4. `docs/lk-contract/v1/examples/` - `examples/claim-request.json` — пример заявки на перевод (3 ЦБ, ИИС, заполненные реквизиты). - `examples/claim-response.json` — пример ответа. - `examples/callback-confirmed.json` — пример callback подтверждения. - `examples/callback-rejected.json` — пример callback отказа. - `examples/error-422.json` — пример ошибки валидации. ### 5. `docs/lk-contract/v1/changelog.md` Версионирование контракта. Первая запись — `v1.0.0`. ### 6. Обновить `docs/lk-contract/v1/README.md` Описать состав, способ работы и порядок согласования с командой ЛК. ## Требования к коду - OpenAPI 3.0.x, валидный по `spectral` или `openapi-cli`. - Имена операций (operationId) — `snake_case`. - Описания (description) — на русском. - Все поля с `description` и примерами. - Без эмодзи. ## Коммит ``` feat(lk-contract): OpenAPI контракт lk-gateway по ESIA Finance API V1 - docs/lk-contract/v1/openapi.yaml — спецификация - docs/lk-contract/v1/examples/ — примеры запросов/ответов/callback - docs/lk-contract/v1/changelog.md — v1.0.0 Контракт предлагается команде реального ЛК как точка синхронизации. В lk-emulator (отдельный PR) контракт реализуется как «как-будто-ЛК» для проверки сквозного потока. Co-Authored-By: Claude Opus 4.7 (1M context) ``` ## После коммита 1. Обновить `docs/tasks/README.md`: PR-3 — «выполнено». 2. Сообщить заказчику, что OpenAPI готов и можно отправлять команде ЛК.