fix: preserve bid drafts and align tender source data
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
export const RATE_SOURCE = 'https://www.tcmb.gov.tr/kurlar/today.xml';
|
||||
export function parseRates(xml) {
|
||||
const bulletinDate = /<Tarih_Date\b[^>]*\bTarih="([^"]+)"/.exec(xml)?.[1];
|
||||
if (!bulletinDate) throw new Error('TCMB bülten tarihi okunamadı.');
|
||||
const rates={};
|
||||
for (const code of ['USD','EUR']) {
|
||||
const block=new RegExp(`<Currency\\b[^>]*CurrencyCode="${code}"[^>]*>([\\s\\S]*?)</Currency>`).exec(xml)?.[1];
|
||||
const unit=Number(/<Unit>([^<]+)<\/Unit>/.exec(block || '')?.[1]);
|
||||
const selling=Number(/<ForexSelling>([^<]+)<\/ForexSelling>/.exec(block || '')?.[1]);
|
||||
if (!(unit>0) || !(selling>0)) throw new Error(`${code} döviz satış kuru okunamadı.`);
|
||||
rates[code]=selling/unit;
|
||||
}
|
||||
return {bulletinDate,rates,type:'Döviz satış',source:RATE_SOURCE};
|
||||
}
|
||||
let cache;
|
||||
export async function exchangeRates() {
|
||||
if (cache && Date.now()-cache.at<15*60*1000) return {...cache.value,cached:true};
|
||||
try {
|
||||
const response=await fetch(RATE_SOURCE,{signal:AbortSignal.timeout(10000)});
|
||||
if (!response.ok) throw new Error('TCMB kaynağına ulaşılamadı.');
|
||||
const value={...parseRates(await response.text()),fetchedAt:new Date().toISOString()};
|
||||
cache={at:Date.now(),value};return {...value,cached:false};
|
||||
} catch(error) {
|
||||
if(cache) return {...cache.value,cached:true,refreshError:'Güncelleme alınamadı; gösterilen bülten tarihini kontrol edin.'};
|
||||
throw new Error('Kur alınamadı. Daha sonra yeniden deneyin.');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user