Files
admin/.tasks/coord-loader-admin-api-client.md
vitya 5d66a86ee3 meta(handoff): loader-migration + admin-api deploy CLOSED; handoff на next session
Эта сессия: координация loader-migrate-to-admin-api-client завершена (identity PASS +
прод-импорт через API, 0 ошибок), admin-api стек 25 LIVE. Coord-таска финал. Handoff
пишет на следующий разворот: MinIO-retire (≈05.08) + kreknin-ремонт + вернуть бэкапы.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-04 19:37:06 +03:00

133 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# coord-loader-admin-api-client
## Goal
Я (admin-сессия) — **координатор** таски у pilorama98.ru
`loader-migrate-to-admin-api-client`: перевод `apps/loader` с прямого DB-доступа
(`@snollajs/data`, MSSQL MoreThenCms) на типизированный `@snolla/admin-api-client`
(разрабатывает snolla, таска `admin-typed-api`). Vitya назначил 2026-08-04.
## Роль
- **Координатор** миграции загрузчика (pilorama98): отслеживать готовность snolla
(клиент + API Key + ответы на open questions), маршрутизировать, разблокировать,
эскалировать застой.
- **Ревьюер snolla** (назначен vitya 2026-08-04): код `admin-typed-api` — S1 auth/keys,
S2 `@snolla/admin-api-client`, S3 `@snolla/admin-schema-gen`. Канал: snolla шлёт
ревью-запрос в мой inbox (commit/hash + что смотреть), я ревьюю и возвращаю финайдинги.
Ревью S2 — **до публикации в Verdaccio** (pilorama98 завязан на клиент).
- **Ревьюер загрузчика pilorama98** (назначен vitya 2026-08-04): код миграции —
`ApiCatalogStore`, contract-tests, identity-тест. Канал: pilorama98 шлёт commit'ы + что
смотреть; фокус — identity (API vs DB одинаковое состояние) и byte-for-byte `Content`.
## Ревью-чекпойнты (snolla)
- [x] S2 + S3 — **ревью DONE, F1 CONFIRMED 2026-08-04T14:48Z, publish разрешён.**
Фиксы `f9714f2`+`ddf47a1`: F1a server-guard `Fields.length>0`, F1b typed-save без Fields при
пустых defs (Content byte-for-byte), F3 джанкции в `$transaction` (tx прокинут), F5 pascal-сан,
F6 no-clobber. Пере-ревью + тесты: admin-api **13/13**, schema-gen **19/19**, client 19/19+tsc0,
остатков `[TEST]` в проде 0. Нюанс F2: variants `?sku=` ✅, Sku в products search-OR не добавлен
(не блокер; loader матчит продукты списком/ProductId). Жду: publish 0.2.0/0.1.0 + API Key.
- [ ] S1 auth-плагин (PAT+cookie-JWT) + keys-эндпоинты — после завершения
## Текущий статус
- 🟢 **2026-08-04T16:30Z — ПРОД-ИМПОРТ ЧЕРЕЗ API ВЫПОЛНЕН, ВСЁ ЗАКРЫТО.**
pilorama98: exit 0, 224 rows, products 224 update/0 create, pages 32, price-tables 25.
Прод admin-api: ~2070 API-вызовов, 0 ошибок (только внешние 401-пробы на /, /robots.txt).
Read-back: 229 products, контент на месте. Миграция 100% (координация + ревью + деплой + прод).
- 🟢 **2026-08-04T16:17Z — МИГРАЦИЯ ЗАВЕРШЕНА. Таска pilorama98 🟢 done.**
Все acceptance 14 выполнены (identity PASS, bin/* через store, TDD 105/105, ключ gitignored).
baseUrl переключён на прод `https://admin-api.vds.kzntsv.site`. **Координация закрыта.**
Остаётся операционный шаг: реальный прод-импорт (`node bin/index.js`, store:api) — решение
vitya; рекомендация — через identity-check против прод-эндпоинта.
- 🟢 **2026-08-04T16:16Z — ротация ключа: РЕШЕНО не ротировать** (vitya: «на ключ похуй»,
риск приватного Gitea принят). Ключ `sk_6a83…` остаётся. Вопрос закрыт.
- 🟢 **2026-08-04T15:42Z — IDENTITY PASS ✅, миграция по коду ЗАКРЫТА.**
- Ошибки (оператор прав): (1) 400 на числовом sku → `String()` с null-guard; (2) toLegacyTag
без content → 86 breadcrumbs-diff. Пофикшены (665006f, 105/105).
- identity-check.js харнесс ревьюнут (оба пути→staging, полевой diff content, --fresh).
**PASS: 229 products / 3327 variants идентичны** (API vs DB). Acceptance №1 закрыт.
- Прод-cutover: admin-api прод жив (`https://admin-api.vds.kzntsv.site`), pilorama98
переключает baseUrl; staging-PASS достаточно, прод-прогон опционален.
- 🟢 **2026-08-04T15:36Z — ДЕПЛОЙ admin-api LIVE на vds.** `admin-api.vds.kzntsv.site`
(стек 25, образ ca0dfa3 ESM-фикс). /health ok, LE-серт выдан, ключ pilorama98 проходит.
Prod-эндпоинт для loader'а после identity. Compose source-of-truth закоммичен (cd76ce8f).
- 🔵 **2026-08-04T15:26Z — деплой admin-api: стек 25 создан, блокер в Dockerfile.**
- Образ `admin-api:e1540de` собран+запушен. Стек 25 (`admin-api.vds.kzntsv.site`, env 8/8,
proxy-сеть, mem_limit 512m) создан. **Контейнер крашится**: ESM `ERR_MODULE_NOT_FOUND`
dist/plugins/prisma — 32 файла extensionless импортов + tsconfig `moduleResolution:bundler`.
Фикс маршрутизирован snolla (15-26-16Z): добавить `.js` + node16, или bundle esbuild.
Staging 4732 (tsx) работает — identity не блокируется. Жду sha фикса → пересборка + PUT.
- 🟢 **2026-08-04T15:18Z — staging admin-api перезапущен с Number-fix (911b9b7).**
Write-probe сам: Number 424242→424242 ✅, throwaway удалён. pilorama98 запускает
identity-прогон (bump 0.2.1 + Number в ApiCatalogStore, 104/104).
- 🟢 **2026-08-04T15:14Z — Number РЕШЁН, identity-тест разблокирован.**
- snolla: `Number` добавлен в products/save (`911b9b7`/`6fe1088`, client **0.2.1**): create —
присланный иначе findNextNumber, update — ставит если прислан. Тесты 23/23+19/19, чисто.
- pilorama98: F1 (apiKey→local.json gitignored)+F2 (TypeId из чтения) пофикшены (4372c59, 103/103).
Собирают identity-тест на staging (bump 0.2.1 + Number в ApiCatalogStore).
- **Ротация ключа** (был в истории git fb07849): рекомендация — принять риск (приватный Gitea),
решение за vitya.
- Деплой: жду Dockerfile от snolla.
- 🟢 **2026-08-04T15:12Z — ревью ApiCatalogStore DONE (тесты 102/102).**
- **F1 🔴** API-ключ `sk_6a83…` закоммичен в `apps/loader/config/default.json` (трекаемый) —
нарушение acceptance №4; фикс: `config/local.json` gitignored + ротация (по решению pilorama98).
- **F2 🟡** `updateProduct` хардкодит `TypeId` (расходится с DB-путем для др. типа); F3 🟡 get+save
на джанкции (перф). Content byte-for-byte/джанкции/пагинация/store-selection ✅.
- Number: зазор подтверждён, вопрос у snolla (15:06Z).
- 🟢 **2026-08-04T15:06Z — staging write-probe: ок, но зазор `Number`.**
- pilorama98: products/save Content byte-for-byte ✅, variants/save ✅. ⚠️ **`Number`
серверно-манится** (saveSchema без Number, create = findNextNumber max+1) → identity по
Number ломается (лоадер пишет явно). Вопрос маршрутизирован snolla (15-06-26Z),
рекомендация — добавить `Number` в save-schema. Если server-managed → решение vitya
(ослабить identity по Number / гибрид).
- **Деплой-план согласован с snolla** (14-56-38Z): Dockerfile — snolla коммитит,
оркестрация/деплой — я; хостнейм `admin-api.vds.kzntsv.site`; один общий инстанс;
env JWT_SECRET (реальный)/DATABASE_URL/S3; mem_limit 512m.
## Хронология
- **Staging admin-api поднят** `127.0.0.1:4732``MoreThenCmsStaging` (свежая копия
MoreThenCms на vds mssql, restore из COPY_ONLY-бэкапа, snolla=db_owner, логи сжаты).
Ключ pilorama98 проходит (scope read-write). Письмо pilorama98 14-59-32Z (staging +
роль ревьюера).
- **Лог-чистка (вопрос vitya):** MoreThenCms 10ГБ→1ГБ (SIMPLE recovery + SHRINK, кап-риск
Express устранён), staging log 10ГБ→259МБ. Диск 35ГБ свободно.
- **Деплой-план согласован с snolla** (14-56-38Z): Dockerfile — snolla коммитит,
оркестрация/деплой — я; хостнейм `admin-api.vds.kzntsv.site`; один общий инстанс;
env JWT_SECRET (реальный)/DATABASE_URL/S3; mem_limit 512m.
- Инцидент snolla: cleanup-live-keys `[CLIENT-VERIFY]` — LIKE character class снёс ключ,
перевыпущен + скрипт починен (7eb1bb8).
## Хронология
- **Решение vitya: расширять snolla** (AskUserQuestion). snolla подтвердила независимо —
variants/categories/tags + джанкции в текущем скоупе, реализует после ядра кодгена.
- **Контракт от snolla relay'нут pilorama98** (14-29-11Z): query (GET list?scope&skip&take /
POST list; `{success,data,total}`), write (save=upsert по entity-id, delete по id,
идемпотентно; 400/404/500), `page.content` byte-for-byte только при `Content` (не `Fields[]`),
auth Bearer `sk_…` + POST /api/keys, base URL per-env. Джанкции = reconciliation
`CategoryIds[]`/`TagIds[]` в products/save.
- pilorama98: prep разблокирован (seam-рефактор `DbCatalogStore` + contract-tests-каркас),
таска 🔵 до publish + ключ.
- snolla: ревьюер-роль подтверждена; S2 publish держится до моего ревью.
- **Жду:** publish S2 + API Key; пинги с commit'ами на ревью (S1 auth/keys, S2 клиент, джанкции).
## Открытый вопрос оператору (vitya) — РЕШЁН 2026-08-04
Расширять snolla на variants/categories/tags (+ джанкции). Выбрано vitya, подтверждено snolla.
Полный разблок миграции loader'а; acceptance №1 pilorama98 цел.
## Хронология
- 2026-08-04: **ApiKeys миграция прогнана на обоих боевых SNOLLA** (vds `MoreThenCms`
+ stostayer `stostayer`) — таблица `dbo.ApiKeys` + индексы + FK. Это предпосылка
S1 auth-плагина / keys-эндпоинтов snolla. Письмо snolla отправлено
(`snolla/.claude-inbox/2026-08-04T13-29-54Z-admin.md`).
- 2026-08-04: назначен координатором, письма-интро обоим проектам.
## Связанное
- Таска pilorama98: `~/projects/pilorama98.ru/.tasks/loader-migrate-to-admin-api-client.md`
(🔵 blocked на snolla; open questions там).
- Таска snolla: `~/projects/snolla/.tasks/admin-typed-api.md` (S1 auth — после DDL).