Chybova hlaseni konektoru rikaji, co se stalo, a kam to slo

Duvod od sluzby jde primo do hlasky: z tela odpovedi se vytahne detail,
error_description, message, title, error i seznam missingHeaders. Retezec,
ktery vypada jako JSON, se rozbaluje dal - sluzba iDoklad presne takhle
predava telo od iDokladu samotneho. Kdyz sluzba nenapsala nic, rekne se to.

401 a 403 uz nejsou jedna hlaska. 401 = udaje sluzba dostala a neuznala je.
403 = tvar udaju je v poradku, zakazuje se samo volani.

V kazde hlasce je cela adresa vcetne serveru (ScriptRequestInfo.url),
bez query - v query muze byt tajemstvi. Zaklad adresy je z konfigurace
a konektor ho smi prepsat, takze se neda odvodit z toho, kde je nasazeny
portal. Adresa je videt i na karte konektoru a v odpovedi na test, i kdyz
overeni projde.

Tlacitko Logy na karte konektoru a historie poslednich peti overeni.
Odpoved sluzby dosud existovala jen v odpovedi na test, tedy do prekresleni
stranky, a v logu containeru. Do logu containeru se nikdo divat nechodi.
Zaznam se uklada i pri uspechu, jinak by neslo poznat, jestli konektor nesel
nikdy, nebo prestal jit ve chvili, kdy nekdo sahnul na udaje.

Migrace 003_connector_checks.sql, endpoint GET /connectors/:id/checks.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
JiriUhlir
2026-08-25 07:06:14 +02:00
co-authored by Claude Opus 5
parent 6297bbf480
commit 5a124a53d8
14 changed files with 648 additions and 54 deletions
+68
View File
@@ -222,6 +222,12 @@ export function buildOpenApiDocument() {
status: { type: 'string', enum: ['untested', 'ok', 'error'] },
lastCheckAt: { type: 'string', format: 'date-time', nullable: true },
lastError: { type: 'string', nullable: true },
checkCount: {
type: 'integer',
description:
'Kolik zaznamu o overeni je v historii. Samotna historie se cte pres ' +
'/api/dashboard/connectors/{id}/checks - v seznamu by to byla tela odpovedi navic.',
},
isDefault: {
type: 'boolean',
description: 'Krok stromu bez vybraneho konektoru pouzije tenhle.',
@@ -1674,6 +1680,68 @@ export function buildOpenApiDocument() {
checked: { type: 'string' },
status: { type: 'integer' },
message: { type: 'string' },
baseUrl: {
type: 'string',
description:
'Kam konektor miri. Vraci se i pri uspechu - zaklad adresy je ' +
'z konfigurace a konektor ho smi prepsat, takze bez nej nerika ' +
'kod odpovedi nic o tom, jestli se to trefilo na spravny stroj.',
},
},
},
},
},
},
'404': { description: 'Konektor neexistuje' },
},
},
},
'/api/dashboard/connectors/{id}/checks': {
get: {
tags: ['Konektory'],
summary: 'Historie overeni konektoru',
description:
'Poslednich pet overeni, nejnovejsi prvni. U neuspechu nese zaznam cele telo ' +
'odpovedi sluzby v poli detail - prave tam sluzba pise, co ji vadilo, a bez ' +
'toho se neda rozlisit spatny udaj od zakazane IP adresy. Texty jsou uz ' +
'zredigovane, pristupovy udaj v nich neni. Historie je zvlast a ne v seznamu ' +
'konektoru proto, ze telo odpovedi byva o rady velikosti vetsi nez zbytek radku.',
security: [{ bearerAuth: [] }],
parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],
responses: {
'200': {
description: 'Zaznamy o overeni',
content: {
'application/json': {
schema: {
type: 'object',
properties: {
limit: { type: 'integer' },
items: {
type: 'array',
items: {
type: 'object',
properties: {
at: { type: 'string', format: 'date-time' },
ok: { type: 'boolean' },
checked: { type: 'string' },
status: { type: 'integer', nullable: true },
message: { type: 'string' },
detail: { type: 'string', nullable: true },
request: {
type: 'object',
nullable: true,
description:
'url je cela adresa vcetne serveru, bez query - v query muze byt tajemstvi.',
properties: {
method: { type: 'string' },
path: { type: 'string' },
url: { type: 'string' },
},
},
},
},
},
},
},
},