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 и вкладка «Журнал ошибок» в Настройках.
17 lines
836 B
SQL
17 lines
836 B
SQL
-- Серверный журнал ошибок 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);
|