Persist observed tender source revisions and expose paginated history

This commit is contained in:
2026-09-06 10:49:30 +03:00
parent a0f4824c7e
commit 68fe84e9c7
9 changed files with 166 additions and 0 deletions
+18
View File
@@ -1,3 +1,4 @@
import { observeTenders, tenderHistory } from './tender-history.mjs';
import { requestLifetime } from './request-lifetime.mjs';
import {documentReview,saveDocumentReview,reviewedAnalysisSource} from './document-review.mjs';
import { documentMetadataPatch, decodeDocumentUpload } from './document-metadata.mjs';
@@ -582,6 +583,11 @@ async function getDetail(ilanId) {
const raw = await ilanDetail(ilanId);
const text = htmlToText(raw.content || '');
const detail = { ...announcementFields(text), adNo: raw.adNo || null };
const sourceTender=cache.tenders.find(t=>t.id===`ilan-${ilanId}`);
if(sourceTender) {
try { observeTenders([{...sourceTender,...detail,id:`ilan-${ilanId}:detail`}]); }
catch { detail.sourceWarning='İlan alındı ancak kaynak geçmişi kaydedilemedi.'; }
}
cache.detail.set(ilanId, detail);
if (cache.detail.size > 500) cache.detail.delete(cache.detail.keys().next().value);
return detail;
@@ -661,6 +667,8 @@ async function tendersPayload(force = false) {
}
const combined = uniqueTenders([...dt.tenders, ...c.tenders, ...hist.tenders]);
let historyWarning=null;
try { observeTenders(combined); } catch { historyWarning='Kaynak geçmişi kaydedilemedi; değişiklik arşivi eksik olabilir.'; };
return {
success: true,
source: sources.join(' + '),
@@ -669,6 +677,7 @@ async function tendersPayload(force = false) {
ilanCount: c.totalCount,
todayCount: bugunEklenenSayisi(combined),
loadedUniqueCount: combined.length,
historyWarning,
dtCount: dt.totalCount,
historyCount: hist.totalCount,
tenders: combined,
@@ -1476,6 +1485,15 @@ const server = http.createServer(async (req, res) => {
} finally { lifetime.dispose(); }
}
if (url.pathname === '/api/tenders/source-history') {
if (!userFromAuthHeader(req.headers.authorization)) return json(res,401,{success:false,error:'Oturum gerekli.'});
if (req.method !== 'GET') return json(res,405,{success:false,error:'Desteklenmeyen metot.'});
const before=url.searchParams.get('before');
if(before && (!/^\d+$/.test(before) || !Number.isSafeInteger(Number(before)))) return json(res,400,{success:false,error:'Geçersiz sayfa.'});
try { return json(res,200,{success:true,...tenderHistory({ikn:url.searchParams.get('ikn'),kurum:url.searchParams.get('kurum')},{before:before?Number(before):null})}); }
catch { return json(res,503,{success:false,error:'Kaynak geçmişi alınamadı. Yeniden deneyin.'}); }
}
if (url.pathname === '/api/tenders') {
const out = await tendersPayload(url.searchParams.get('refresh') === '1');
return json(res, 200, out);