Files
Bridge-and-Join-s/internal/nsdadapter
fontvielle de41aea00c feat(igw): REST-клиент ИШ НРД по DOC/instr-ish-rest-api.pdf + упаковщик ZIP
Полный клиент Интеграционного шлюза НРД в internal/nsdadapter/igw/:

client.go — REST endpoint'ы по свежей спецификации НРД:
- POST /api/package/{channel}/file — отправка ZIP (Type=archive, File=base64)
  возвращает id пакета (поддерживаются варианты id|package_id|ID)
- GET /api/package/status/{id} — статус NEW|SENT|ERROR (с error-полем)
- GET /api/package?channel=&type=M2MTD|M2MER&date=&id=&count=&excludeErrors=
  — список входящих от НРД, с files[] и signs[] (ИШ сам проверяет ЭП и
  выдаёт VALID|INVALID)
- GET /api/package/{id} — скачать ZIP (raw или base64-в-JSON, авто-детект
  по сигнатуре PK\x03\x04)
- Ретраи только на 5xx/сетевые ошибки (4xx — сразу ошибка)
- HTTP-клиент через options, кастомный таймаут, ретраи

pack.go — упаковщик/распаковщик ZIP по разделу 2.3 инструкции:
- PackRequest(req, docName) — M2MTransferRequest→ZIP с config.xml
- PackXML(xml, docName, packageType) — для эталонных сообщений
- UnpackPackage(zip) → {DocXML, WinfXML, Signature, Filenames}
- ParseDecision / ParseResponse через nsdxml.Unmarshal

Покрыто тестами (10/10 PASS):
- send happy path с проверкой формата JSON-body
- retry на 5xx, без ретраев на 4xx
- GetStatus с числовым id
- ListIncoming как массив (новый формат) и как {items:[]} (старый)
- GetPackage raw ZIP + GetPackage с base64-в-JSON
- упаковка/распаковка: 2 файла в ZIP, имена, содержимое config.xml
- распаковка с .sgn и winf.xml

cmd/bj-server/main.go — NSD-poller адаптирован под новый API
(client.ListIncoming(ctx, ListFilter{}) вместо позиционных параметров;
поля Package.ID/Name/Type/State вместо PackageID/PackageType).

Скачана и положена в DOC/ свежая спецификация (798 KB, 15 стр):
DOC/instr-ish-rest-api.pdf — это исходный документ для нашей реализации.

REPORT.md обновлён:
- общая готовность 65% → 70%
- готовность к роботу 80% → 85%
- добавлен раздел про REST-клиент ИШ
- блокер #6 — отсутствие «Руководства по установке ИШ»
2026-05-14 17:10:17 +03:00
..

internal/nsdadapter — транспорт к НРД

Реализует m2mcore.NSDSender. Основной канал — Интеграционный шлюз (ИШ) НРД через REST API; ИШ сам подписывает и упаковывает пакеты ЭДО, нам XMLDSig не требуется. Резерв — WS ONYX (заглушка до PR-6).

Состав

  • igw/client.go — REST-клиент ИШ: SendPackage, GetStatus, ListIncoming. Body передаётся base64 в JSON, ретраи на 5xx и сетевые ошибки, 4xx не ретраится.
  • router.go — маршрутизация доменного типа сообщения в PackageType ЭДО (#M2MTR, #M2MTD, #M2MER, SUBBR/SUBER/SUB16, Assets_investment).
  • sender.go — реализация m2mcore.NSDSender: сериализует Request в windows-1251 через nsdxml.Marshal и шлёт в ИШ. Ответы НРД приходят асинхронно через входящий поллер.
  • config.go — профили guest-gost, guest-rsa, test3-gost, test3-rsa, prod-gost, prod-rsa (URL ИШ, канал, контейнер ключа, таймауты, retry).
  • onyx/onyx.go — скелет SOAP-клиента WS ONYX. Реальная реализация — после PR-6 (подпись через crypto-service).

cmd/nsd-adapter

cmd/nsd-adapter/main.go — сервис с HTTP /healthz и фоновым поллером входящих пакетов (ListIncoming по типам ЭДО из IncomingPackageKinds). Параметры:

  • BJ_HTTP_ADDR — адрес HTTP (по умолчанию :8082).
  • BJ_NSD_PROFILE — имя профиля. Если не задан — сервис стартует в режиме idle (только healthz, опрос отключён). Полезно для CI и смоук-тестов без реального ИШ.
  • BJ_NSD_POLL_INTERVAL — частота опроса, например 15s.

Принципы логирования

  • Логируем: метод, путь, HTTP-статус, package_id, длительность.
  • Не логируем тело пакета — там могут быть ПДн.
  • Маскировка ПДн в любых журналах — на стороне m2m-core при логировании content до отправки в адаптер.