feat: yönetici için 'şimdi gönder' (POST /api/notify/run?zorla=1)
Bildirim turunu temel-alma adımını atlayarak çalıştırır; abonelik kriterine uyan ihaleler hemen e-posta olarak gönderilir. Test ve talep üzerine özet için.
This commit is contained in:
+1
-1
@@ -617,7 +617,7 @@ const server = http.createServer(async (req, res) => {
|
|||||||
const user = userFromAuthHeader(req.headers['authorization']);
|
const user = userFromAuthHeader(req.headers['authorization']);
|
||||||
if (!user?.isAdmin) return json(res, 403, { success: false, error: 'yönetici yetkisi gerekli' });
|
if (!user?.isAdmin) return json(res, 403, { success: false, error: 'yönetici yetkisi gerekli' });
|
||||||
try {
|
try {
|
||||||
const sonuc = await bildirimleriIsle(() => tendersPayload());
|
const sonuc = await bildirimleriIsle(() => tendersPayload(), { zorla: url.searchParams.get('zorla') === '1' });
|
||||||
return json(res, 200, { success: true, ...sonuc });
|
return json(res, 200, { success: true, ...sonuc });
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
return json(res, 502, { success: false, error: e.message });
|
return json(res, 502, { success: false, error: e.message });
|
||||||
|
|||||||
+9
-7
@@ -41,7 +41,7 @@ function bildirilebilir(t) {
|
|||||||
* Tüm aktif abonelikleri işler.
|
* Tüm aktif abonelikleri işler.
|
||||||
* @param {Function} tenderGetir () => Promise<{tenders: []}>
|
* @param {Function} tenderGetir () => Promise<{tenders: []}>
|
||||||
*/
|
*/
|
||||||
export async function bildirimleriIsle(tenderGetir) {
|
export async function bildirimleriIsle(tenderGetir, { zorla = false } = {}) {
|
||||||
if (process.env.NOTIFY_ENABLED === '0') return { atlandi: 'kapalı' };
|
if (process.env.NOTIFY_ENABLED === '0') return { atlandi: 'kapalı' };
|
||||||
if (!available()) return { atlandi: 'depo yok' };
|
if (!available()) return { atlandi: 'depo yok' };
|
||||||
if (!emailConfigured()) return { atlandi: 'e-posta yapılandırılmamış' };
|
if (!emailConfigured()) return { atlandi: 'e-posta yapılandırılmamış' };
|
||||||
@@ -63,11 +63,13 @@ export async function bildirimleriIsle(tenderGetir) {
|
|||||||
const yeniler = eslesen.filter((t) => !gorulen.has(t.id));
|
const yeniler = eslesen.filter((t) => !gorulen.has(t.id));
|
||||||
|
|
||||||
// İlk kurulumda geçmişi spam'lemeyelim: sadece işaretle, gönderme.
|
// İlk kurulumda geçmişi spam'lemeyelim: sadece işaretle, gönderme.
|
||||||
if (!a.sonGonderim) {
|
// zorla=true ise (yönetici "şimdi gönder" dediğinde) bu adım atlanır.
|
||||||
|
if (!a.sonGonderim && !zorla) {
|
||||||
markSent(a.id, eslesen.map((t) => t.id));
|
markSent(a.id, eslesen.map((t) => t.id));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!yeniler.length) continue;
|
const gonderilecek = zorla && !yeniler.length ? eslesen.slice(0, maxAdet) : yeniler;
|
||||||
|
if (!gonderilecek.length) continue;
|
||||||
|
|
||||||
const kriterMetni = [
|
const kriterMetni = [
|
||||||
a.sehir && `İl: ${a.sehir}`,
|
a.sehir && `İl: ${a.sehir}`,
|
||||||
@@ -77,20 +79,20 @@ export async function bildirimleriIsle(tenderGetir) {
|
|||||||
a.kurumlar?.length && `${a.kurumlar.length} favori kurum`,
|
a.kurumlar?.length && `${a.kurumlar.length} favori kurum`,
|
||||||
].filter(Boolean).join(' · ') || 'Tüm ihaleler';
|
].filter(Boolean).join(' · ') || 'Tüm ihaleler';
|
||||||
|
|
||||||
const html = tenderDigestHtml({ name: a.ad || a.email, tenders: yeniler.slice(0, maxAdet) })
|
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">
|
+ `<p style="font-family:Arial,sans-serif;font-size:11px;color:#8b93a4;max-width:640px;margin:12px auto 0">
|
||||||
Kriteriniz: ${kriterMetni} — toplam ${yeniler.length} yeni ihale.
|
Kriteriniz: ${kriterMetni} — toplam ${gonderilecek.length} ihale.
|
||||||
Bu bildirimi uygulamadaki Mobil PWA → E-posta Bildirimi bölümünden kapatabilirsiniz.
|
Bu bildirimi uygulamadaki Mobil PWA → E-posta Bildirimi bölümünden kapatabilirsiniz.
|
||||||
</p>`;
|
</p>`;
|
||||||
|
|
||||||
await sendEmail({
|
await sendEmail({
|
||||||
to: a.email,
|
to: a.email,
|
||||||
subject: `İhaleist — ${yeniler.length} yeni ihale (${kriterMetni})`,
|
subject: `İhaleist — ${gonderilecek.length} ihale (${kriterMetni})`,
|
||||||
html,
|
html,
|
||||||
});
|
});
|
||||||
markSent(a.id, eslesen.map((t) => t.id));
|
markSent(a.id, eslesen.map((t) => t.id));
|
||||||
gonderilen++;
|
gonderilen++;
|
||||||
console.log(`[notifier] ${a.email} → ${yeniler.length} yeni ihale gönderildi (${kriterMetni})`);
|
console.log(`[notifier] ${a.email} → ${gonderilecek.length} ihale gönderildi (${kriterMetni})`);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
hata++;
|
hata++;
|
||||||
console.warn(`[notifier] abonelik ${a.id} gönderilemedi: ${e.message}`);
|
console.warn(`[notifier] abonelik ${a.id} gönderilemedi: ${e.message}`);
|
||||||
|
|||||||
Reference in New Issue
Block a user