surface retryable tender feed outages
This commit is contained in:
@@ -14,7 +14,9 @@ Belge URL’si, ilan metni ve tarayıcı belge metni endpoint’leri artık 502
|
|||||||
|
|
||||||
İhale detay istemcisi bu kodu tanıyıp “Resmi ihale kaynağı geçici olarak erişilemiyor; birkaç dakika sonra yeniden deneyin” mesajına dönüştürüyor; normal 503 gibi diğer durumlar özgün HTTP hatası olarak korunuyor.
|
İhale detay istemcisi bu kodu tanıyıp “Resmi ihale kaynağı geçici olarak erişilemiyor; birkaç dakika sonra yeniden deneyin” mesajına dönüştürüyor; normal 503 gibi diğer durumlar özgün HTTP hatası olarak korunuyor.
|
||||||
|
|
||||||
Doğrulama: 292/292 otomatik test ve üretim derlemesi başarılı.
|
Ana ihale listesi istemcisi de aynı geçici kaynak mesajını kullanıyor; başarısız yanıtı boş ihale listesine çevirmiyor.
|
||||||
|
|
||||||
|
Doğrulama: 293/293 otomatik test ve üretim derlemesi başarılı.
|
||||||
|
|
||||||
## Kanıtlanan ilk değişiklikler
|
## Kanıtlanan ilk değişiklikler
|
||||||
|
|
||||||
|
|||||||
@@ -6,8 +6,11 @@
|
|||||||
|
|
||||||
export async function fetchLiveTenders({ refresh = false } = {}) {
|
export async function fetchLiveTenders({ refresh = false } = {}) {
|
||||||
const res = await fetch(`/api/tenders${refresh ? '?refresh=1' : ''}`);
|
const res = await fetch(`/api/tenders${refresh ? '?refresh=1' : ''}`);
|
||||||
if (!res.ok) throw new Error(`API hatası: HTTP ${res.status}`);
|
const data = await res.json().catch(() => ({}));
|
||||||
const data = await res.json();
|
if (!res.ok) {
|
||||||
|
if (data.code === 'SOURCE_UNAVAILABLE' && data.retryable) throw new Error('İhale kaynağı geçici olarak erişilemiyor. Birkaç dakika sonra yeniden deneyin.');
|
||||||
|
throw new Error(`API hatası: HTTP ${res.status}`);
|
||||||
|
}
|
||||||
if (!data.success) throw new Error(data.error || 'API başarısız yanıt döndü');
|
if (!data.success) throw new Error(data.error || 'API başarısız yanıt döndü');
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
import test from 'node:test';
|
||||||
|
import assert from 'node:assert/strict';
|
||||||
|
import { fetchLiveTenders } from '../src/services/tenderApi.js';
|
||||||
|
|
||||||
|
test('live tender list distinguishes retryable source outage from an empty pool', async () => {
|
||||||
|
const original = globalThis.fetch;
|
||||||
|
try {
|
||||||
|
globalThis.fetch = async url => {
|
||||||
|
assert.equal(url, '/api/tenders');
|
||||||
|
return Response.json({ success: false, code: 'SOURCE_UNAVAILABLE', retryable: true, error: 'kaynak yok' }, { status: 502 });
|
||||||
|
};
|
||||||
|
await assert.rejects(() => fetchLiveTenders(), /geçici olarak erişilemiyor.*yeniden deneyin/);
|
||||||
|
globalThis.fetch = async () => Response.json({ success: true, tenders: [], totalCount: 0 });
|
||||||
|
assert.deepEqual((await fetchLiveTenders()).tenders, []);
|
||||||
|
} finally { globalThis.fetch = original; }
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user