Files
Bridge-and-Join-s/docs/tasks/PR-5-nsd-adapter-skeleton.md
zuevav 3fdc526031 docs: план проекта + промпты задач PR-1..PR-6 для Claude Code на ВМ
- docs/architecture/plan.md — полный план проекта (архитектура,
  стек, SLA, регуляторика, Реестр ПО, roadmap M1–M5, открытые
  вопросы и решения).
- docs/tasks/README.md — индекс задач и инструкция запуска для
  Claude Code на dev-ВМ.
- docs/tasks/PR-1-go-models-m2m.md — Go-модели M2M, парсер
  windows-1251, NSDDateTime, round-trip тесты на эталонах.
- docs/tasks/PR-2-fansy-ddl.md — DDL принимающей БД для команды
  Fansy (контракт данных, ETL-требования, словарь полей,
  тестовые данные).
- docs/tasks/PR-3-lk-openapi.md — OpenAPI контракт lk-gateway по
  ESIA Finance API V1, для синхронизации с командой ЛК.
- docs/tasks/PR-4-m2m-core-skeleton.md — FSM сделки,
  репозиторий, идемпотентность по GUID, метрики SLA.
- docs/tasks/PR-5-nsd-adapter-skeleton.md — REST-клиент ИШ НРД,
  маршрутизация типов пакетов (M2MTR/M2MTD/M2MER/SUBBR/SUBER/SUB16).
- docs/tasks/PR-6-crypto-service-skeleton.md — gRPC-каркас
  Java-сервиса криптографии (КриптоПро JCP, UDS, Provider-абстракция).

С этого коммита дальнейшая разработка идёт на dev-ВМ через
запущенный там Claude Code. Промпты PR-1..PR-3 готовы к параллельному
запуску; PR-4 после PR-1; PR-5 и PR-6 ждут поставку артефактов
(ИШ НРД, сертификаты, КриптоПро JCP).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-13 22:48:21 +03:00

133 lines
5.8 KiB
Markdown

# PR-5: Каркас `nsd-adapter` — клиент к ИШ НРД (REST), резерв через WS ONYX
## Цель
Реализовать транспорт к НРД. Основной канал — Интеграционный шлюз НРД
через REST API (ИШ сам подписывает и упаковывает пакеты ЭДО, нам
XMLDSig не нужен). Резерв — WS ONYX (с подписью на нашей стороне через
`crypto-service`, реализуется когда КриптоПро JCP будет доступен).
## Зависимости
- PR-1 (Go-модели).
- PR-4 (`m2m-core` — туда инжектим `NSDSender`).
- Внешние: установленный ИШ НРД на ВМ, тестовые сертификаты GUEST/TEST3.
## Состояние блокеров
Этот PR можно начать **только после**:
- НРД выдал тестовые сертификаты GUEST/TEST3 (ГОСТ или RSA);
- получен и установлен дистрибутив Интеграционного шлюза;
- доступен REST-эндпоинт ИШ (обычно `http://localhost:8080/api/...`).
До этого — оставить PR-5 в очереди, не блокировать другие PR.
## Источники
- `DOC/Инструкция по передаче эталонного запроса на перевод M2M 08.04 (1).pdf`
- `DOC/Презентация MOEX MOST.pdf`
- `DOC/instr_podkl_stend_v3.pdf`
- `DOC/Ссылки для доступа в тестовые контуры.pdf`
## Состав PR
### 1. REST-клиент ИШ
`internal/nsdadapter/igw/client.go`:
Методы:
- `SendPackage(ctx, channel, packageType, body []byte) (packageID string, err error)`
`POST /api/package/{channel}/file`, тело: ZIP в base64 в JSON.
- `GetStatus(ctx, packageID) (Status, err error)`
`GET /api/package/status/{id}`.
- `ListIncoming(ctx, channel, since time.Time, packageType string) ([]Package, error)`
`GET /api/package?channel=&date=&type=...`.
Поддержка типов пакетов: `#M2MTR`, `#M2MTD`, `#M2MER`, `SUBBR`, `SUBER`,
`SUB16`, Assets_investment_*, стандартные квитанции ЭДО.
### 2. Маршрутизация и пакетирование
`internal/nsdadapter/router.go`:
Функция «доменное сообщение → тип пакета ЭДО + содержимое ZIP».
Каждое сообщение M2M упаковывается в ZIP вместе с `config.xml` по
Правилам ЭДО — но если ИШ работает в режиме «принимаю XML, сам
формирую пакет», достаточно отправить чистый XML и тип пакета.
### 3. Реализация `NSDSender` из PR-4
`internal/nsdadapter/sender.go`:
Реализует интерфейс `m2mcore.NSDSender`, использует REST-клиент ИШ.
### 4. Конфигурация
`internal/nsdadapter/config.go`:
Профили: `guest-gost`, `guest-rsa`, `test3-gost`, `test3-rsa`,
`prod-gost`, `prod-rsa`.
Каждый профиль: URL ИШ, путь к ключевому контейнеру (на стороне ИШ),
таймауты, retry-политика.
### 5. Резервный канал WS ONYX (опц., если время позволяет)
`internal/nsdadapter/onyx/`:
SOAP-клиент к `OnyxEdoWSService`. Подпись пакета через
`crypto-service` (gRPC). Реализуется когда `crypto-service` будет
готов (PR-6).
В PR-5 — структуры и заглушка с TODO.
### 6. Опрос входящих
`cmd/nsd-adapter/main.go`:
Минимальный сервис: каждые N секунд (конфиг) делает
`ListIncoming` для актуальных типов пакетов, скачивает новые,
сохраняет в БД (`incoming_packages` таблица), эмитит событие в
`m2m-core` через шину или прямой вызов.
### 7. Интеграционный тест на стенде
`internal/nsdadapter/igw/integration_test.go`:
- Помечен `//go:build integration`.
- Запускает эталонный запрос из
`DOC/Инструкция по передаче эталонного запроса на перевод M2M 08.04 (1).pdf`
на TEST3.
- Проверяет, что приходит `#M2MTD` (от тестового брокера 2) или
`#M2MER` (тех. ошибка).
- Поднимается только когда `BJ_INTEGRATION_TEST_NSD=1`.
## Требования
- Логировать каждое обращение к ИШ (метод, URL, HTTP-статус,
package_id, длительность). **Не логировать содержимое пакета**
(там могут быть ПДн).
- Маскировать ПДн (ФИО, документы) в любых логах.
- Без эмодзи.
## Коммит
```
feat(nsd-adapter): REST-клиент ИШ НРД + маршрутизация типов пакетов
- internal/nsdadapter/igw/: REST-клиент ИШ (SendPackage, GetStatus, ListIncoming)
- internal/nsdadapter/router.go: маршрутизация по типам пакетов ЭДО
- internal/nsdadapter/sender.go: реализация m2mcore.NSDSender
- internal/nsdadapter/config.go: профили GUEST/TEST3/PROD x ГОСТ/RSA
- internal/nsdadapter/onyx/: каркас резервного канала WS ONYX
- cmd/nsd-adapter/main.go: опрос входящих пакетов
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
```
## После коммита
Обновить `docs/tasks/README.md`: PR-5 — «выполнено».