Reject malformed notification feeds before state changes
This commit is contained in:
+19
-3
@@ -10,12 +10,28 @@ import {deadlineInfo} from '../src/services/tenderCalendar.js';
|
||||
*/
|
||||
|
||||
import { list, markBaseline, reserveDelivery, acceptDelivery, failDelivery, available } from './notify-store.mjs';
|
||||
import { emailConfigured, emailFrom, sendEmail, tenderDigestHtml } from './email.mjs';
|
||||
import { emailConfigured, emailFrom, sendEmail, tenderDigestHtml, escapeHtml } from './email.mjs';
|
||||
import { telegramConfigured, sendTelegram, tgKacir } from './telegram.mjs';
|
||||
import { getData } from './user-store.mjs';
|
||||
|
||||
const norm = (v) => String(v || '').trim().toLocaleUpperCase('tr-TR');
|
||||
|
||||
/** Reject an unreadable feed before baseline or outbox mutations. */
|
||||
export function notificationSource(payload) {
|
||||
const invalid = () => { throw new Error('İhale bildirim kaynağı geçersiz; abonelik geçmişi değiştirilmedi.'); };
|
||||
if (!payload || typeof payload !== 'object' || payload.success === false || !Array.isArray(payload.tenders)) invalid();
|
||||
const ids = new Set();
|
||||
for (const tender of payload.tenders) {
|
||||
if (!tender || typeof tender !== 'object' || Array.isArray(tender)
|
||||
|| typeof tender.id !== 'string' || !tender.id.trim() || ids.has(tender.id)
|
||||
|| typeof tender.baslik !== 'string' || !tender.baslik.trim()) invalid();
|
||||
ids.add(tender.id);
|
||||
if (tender.items != null && (!Array.isArray(tender.items) || tender.items.some(item =>
|
||||
!item || typeof item !== 'object' || Array.isArray(item) || (item.ad != null && typeof item.ad !== 'string')))) invalid();
|
||||
}
|
||||
return payload.tenders;
|
||||
}
|
||||
|
||||
/** Bir ihale, aboneliğin kriterlerine uyuyor mu? */
|
||||
export function eslesiyorMu(t, a) {
|
||||
if (a.sehir && norm(t.sehir) !== norm(a.sehir)) return false;
|
||||
@@ -65,7 +81,7 @@ export async function bildirimleriIsle(tenderGetir, { zorla = false } = {}, depe
|
||||
if (!abonelikler.length) return { abonelik: 0 };
|
||||
|
||||
const veri = await tenderGetir();
|
||||
const tumu = (veri.tenders || []).filter(t=>bildirilebilir(t,now()));
|
||||
const tumu = notificationSource(veri).filter(t=>bildirilebilir(t,now()));
|
||||
const requested=Number(process.env.NOTIFY_MAX || 25);
|
||||
const maxAdet=Number.isInteger(requested)&&requested>0?Math.min(requested,200):25;
|
||||
|
||||
@@ -98,7 +114,7 @@ export async function bildirimleriIsle(tenderGetir, { zorla = false } = {}, depe
|
||||
|
||||
const html = tenderDigestHtml({ name: a.ad || a.email, tenders: gonderilecek.slice(0, maxAdet) })
|
||||
+ `<p style="font-family:Arial,sans-serif;font-size:11px;color:#8b93a4;max-width:640px;margin:12px auto 0">
|
||||
Kriteriniz: ${kriterMetni} — toplam ${gonderilecek.length} ihale.
|
||||
Kriteriniz: ${escapeHtml(kriterMetni)} — toplam ${gonderilecek.length} ihale.
|
||||
Bu bildirimi uygulamadaki Mobil PWA → E-posta Bildirimi bölümünden kapatabilirsiniz.
|
||||
</p>`;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user