classify document source outages

This commit is contained in:
2026-09-06 18:55:43 +03:00
parent c44176e996
commit 171392585c
2 changed files with 14 additions and 3 deletions
+4
View File
@@ -10,6 +10,10 @@ Aynı read-only taramada 6 Eylül 2026 sonrası beş güncel sağlık/tıbbi mal
Bu beş adayın canlı `/api/documents/ilan` çağrıları da read-only denendi ve tamamı HTTP 502 döndürdü. Resmi ilan metni alınamadığı için kalem, belge, ÜTS veya teklif türü doğrulaması yapılmadı. Kanıt [`qa-live-health-document-probe.json`](evidence/qa-live-health-document-probe.json). Bu beş adayın canlı `/api/documents/ilan` çağrıları da read-only denendi ve tamamı HTTP 502 döndürdü. Resmi ilan metni alınamadığı için kalem, belge, ÜTS veya teklif türü doğrulaması yapılmadı. Kanıt [`qa-live-health-document-probe.json`](evidence/qa-live-health-document-probe.json).
Belge URL’si, ilan metni ve tarayıcı belge metni endpoint’leri artık 502 durumunda `code: SOURCE_UNAVAILABLE` ve `retryable: true` alanlarını döndürüyor. İstemciler kaynak kesintisini kalıcı biçim hatasından ayırıp yeniden deneme sunabilir.
Doğrulama: 292/292 otomatik test geçti.
## Kanıtlanan ilk değişiklikler ## Kanıtlanan ilk değişiklikler
- Eski belgeler tablosunda ikn indeksi kolon migration'ından önce oluşuyordu. Transaction içinde kolonlar önce ekleniyor; eski belgeyi koruyan, tekrarlanabilir migration testi geçti. - Eski belgeler tablosunda ikn indeksi kolon migration'ından önce oluşuyordu. Transaction içinde kolonlar önce ekleniyor; eski belgeyi koruyan, tekrarlanabilir migration testi geçti.
+10 -3
View File
@@ -657,6 +657,13 @@ function json(res, code, body) {
res.end(JSON.stringify(body)); res.end(JSON.stringify(body));
} }
const sourceUnavailable = error => ({
success: false,
error: error?.message || 'Resmi belge kaynağına ulaşılamadı.',
code: 'SOURCE_UNAVAILABLE',
retryable: true,
});
function readRaw(req, limit = 1024 * 1024) { function readRaw(req, limit = 1024 * 1024) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let buf = ''; let buf = '';
@@ -829,7 +836,7 @@ const server = http.createServer(async (req, res) => {
const out = await documentUrl(ikn); const out = await documentUrl(ikn);
return json(res, 200, { success: true, ...out }); return json(res, 200, { success: true, ...out });
} catch (e) { } catch (e) {
return json(res, 502, { success: false, error: e.message }); return json(res, 502, sourceUnavailable(e));
} }
} }
// İlan metni + kalemler — analiz için (tarayıcı gerektirmez) // İlan metni + kalemler — analiz için (tarayıcı gerektirmez)
@@ -840,7 +847,7 @@ const server = http.createServer(async (req, res) => {
const out = await ilanMetni(ikn); const out = await ilanMetni(ikn);
return json(res, 200, { success: true, ...out, ...announcementFields(out.metin) }); return json(res, 200, { success: true, ...out, ...announcementFields(out.metin) });
} catch (e) { } catch (e) {
return json(res, 502, { success: false, error: e.message }); return json(res, 502, sourceUnavailable(e));
} }
} }
// Doküman metni — sunucu tarafı tarayıcı gerektirir // Doküman metni — sunucu tarafı tarayıcı gerektirir
@@ -853,7 +860,7 @@ const server = http.createServer(async (req, res) => {
const out = await documentText(ikn); const out = await documentText(ikn);
return json(res, 200, { success: true, ...out }); return json(res, 200, { success: true, ...out });
} catch (e) { } catch (e) {
return json(res, 502, { success: false, error: e.message }); return json(res, 502, sourceUnavailable(e));
} }
} }
if (url.pathname === '/api/documents/config') { if (url.pathname === '/api/documents/config') {