feat: чанкинг batch-create >100 задач + журнал ошибок API

B: BatchCreateDialog режет список на чанки ≤100 (лимит сервера), каждый
чанк со своим idempotency-key (requestId-N) — повтор после ошибки не
создаёт дублей; 10-минутный лок армируется только при полном успехе,
а не до запроса (раньше блокировал даже после 400).

D: таблица error_logs (миграция 0066), захват ответов >=400 в request
middleware (без 401/health/events, дедуп 60с), admin API GET/DELETE
/api/error-logs и вкладка «Журнал ошибок» в Настройках.
This commit is contained in:
2026-08-03 14:55:29 +03:00
parent 1bb6a53226
commit 1d5321ed0c
8 changed files with 406 additions and 21 deletions

View File

@@ -0,0 +1,16 @@
-- Серверный журнал ошибок API (просмотр админом в Настройках)
-- Без RLS: вставки выполняет только серверный middleware (best-effort, в т.ч. до/без auth),
-- чтение — только через admin-роут с явным фильтром organization_id.
CREATE TABLE IF NOT EXISTS error_logs (
id SERIAL PRIMARY KEY,
organization_id INTEGER REFERENCES organizations(id) ON DELETE CASCADE,
user_id INTEGER,
method VARCHAR(10) NOT NULL,
path TEXT NOT NULL,
status_code INTEGER NOT NULL,
message TEXT,
created_at TIMESTAMP NOT NULL DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS error_logs_org_created_idx ON error_logs(organization_id, created_at);
CREATE INDEX IF NOT EXISTS error_logs_status_idx ON error_logs(status_code);