fix: respect brief opt-out and report channel delivery failures
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
/** Delivery accounting shared by scheduled and administrator-triggered briefs. */
|
||||
export function createBriefSender({ store, buildBrief, text, html, telegramConfigured, sendTelegram, emailConfigured, sendEmail, warn = console.warn }) {
|
||||
return async function sendBrief(tenderGetir) {
|
||||
const tenders = await tenderGetir();
|
||||
const r = { kullanici:0, gonderilen:0, bos:0, hata:0, kapali:0, kanalsiz:0,
|
||||
kanallar:{ telegram:{denenen:0,kabul:0,hata:0}, email:{denenen:0,kabul:0,hata:0} } };
|
||||
for (const user of store.listUsers()) {
|
||||
r.kullanici++;
|
||||
let accepted = false, failed = false;
|
||||
try {
|
||||
// Manual runs must also honor the recipient's opt-out.
|
||||
if (store.getData(user.email, 'brief')?.kapali) { r.kapali++; continue; }
|
||||
const brief = buildBrief(user.email, tenders);
|
||||
if (brief.bos) { r.bos++; continue; }
|
||||
const channels = [];
|
||||
const telegram = store.getData(user.email, 'telegram');
|
||||
if (telegramConfigured() && telegram?.chatId) channels.push({
|
||||
name:'telegram', send:() => sendTelegram(telegram.chatId, text(brief).slice(0,3900)),
|
||||
valid:receipt => receipt === true,
|
||||
});
|
||||
if (emailConfigured()) channels.push({
|
||||
name:'email', send:() => sendEmail({ to:user.email, subject:`İhaleist — Haftalık Brief (${brief.hafta})`, html:html(brief), text:text(brief) }),
|
||||
valid:receipt => typeof receipt?.id === 'string' && Boolean(receipt.id.trim()),
|
||||
});
|
||||
if (!channels.length) r.kanalsiz++;
|
||||
for (const channel of channels) {
|
||||
// An earlier channel can await the network while the user disables briefs.
|
||||
if (store.getData(user.email, 'brief')?.kapali) { r.kapali++; break; }
|
||||
const counts = r.kanallar[channel.name];
|
||||
counts.denenen++;
|
||||
try {
|
||||
const receipt = await channel.send();
|
||||
if (!channel.valid(receipt)) throw new Error('Sağlayıcı gönderimi doğrulamadı.');
|
||||
counts.kabul++;
|
||||
accepted = true;
|
||||
} catch (error) {
|
||||
counts.hata++;
|
||||
failed = true;
|
||||
warn('[brief]', user.email, channel.name, error.message);
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
failed = true;
|
||||
warn('[brief]', user.email, error.message);
|
||||
}
|
||||
if (accepted) r.gonderilen++;
|
||||
if (failed) r.hata++;
|
||||
}
|
||||
return r;
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user