143 lines
13 KiB
Markdown
143 lines
13 KiB
Markdown
# 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.
|
||
- [x] S1 auth-плагин (PAT+cookie-JWT) + keys-эндпоинты — DONE (в проде; snolla admin-typed-api:
|
||
ApiKeys DDL на обоих SNOLLA, auth 396/396, keys-эндпоинты live)
|
||
|
||
## Текущий статус
|
||
|
||
- 🟢 **2026-08-04T18:33Z — S2 review APPROVE (ed7da15), publish+deploy HELD (vitya).**
|
||
Клиент 20/20 + schema-gen 19/19 + tsc 0 (прогнал сам), покрытие 52/52 non-F. Финайдинги F1–F3
|
||
минорные → snolla (18-31-26Z). **Роль продолжается в след. сессии** (vitya: координатор+ревьювер).
|
||
Ждём снятия publish-hold → деплой одним срезом в конце эпика.
|
||
- 🟡 **2026-08-04T18:15Z — ОТМЕНА camel ОТОЗВАНА (vitya: «Продолжать S2»).**
|
||
Entry 18:10Z (отмена) — ошибочная интерпретация, не в силе. Урок: не рассылать другим сессиям
|
||
письма-отмены по своему прочтению (вмешательство; у snolla был прямой приказ оператора).
|
||
**S2 (клиент 0.3.x camel) ПРОДОЛЖАЕТСЯ** у snolla; деплой = один срез в конце эпика (зона admin),
|
||
live ca0dfa3 (Pascal) остаётся до готовности. Ключ не ротируем.
|
||
- 🟢 **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 1–4 выполнены (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/.agents/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).
|