From 214bf307c7dd5eb96c81a7eaed5ac8a58ab6d58b Mon Sep 17 00:00:00 2001 From: Aleksei Pavlov Date: Sun, 21 Jun 2026 16:42:37 +0300 Subject: [PATCH] =?UTF-8?q?fix(draftAutoApprove):=20=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=B2=D1=87=D0=B5=D1=80=D0=B0=D1=88=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=87=D0=B5=D1=80=D0=BD=D0=BE=D0=B2=D0=B8=D0=BA?= =?UTF-8?q?=D0=B8,=20LIMIT=204,=20=D0=BD=D0=B5=20=D0=B1=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D1=88=D0=B5=20=D1=81=D0=BB=D0=BE=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проблема: брали черновики за 36ч → при нескольких деплоях за день или при накоплении старых черновиков draftAutoApprove раскладывал их все по слотам подряд → очередь на несколько дней вместо 1. Исправления: - WHERE created_at AT TIME ZONE 'Europe/Moscow' вчерашний день (00:00-23:59) - LIMIT 4 — не больше количества слотов в день - раскладываем только min(drafts, freeSlots) черновиков, лишние остаются draft - если черновиков > слотов — пишем в лог предупреждение --- draftAutoApprove.js | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/draftAutoApprove.js b/draftAutoApprove.js index b533f2f..a531515 100644 --- a/draftAutoApprove.js +++ b/draftAutoApprove.js @@ -43,13 +43,16 @@ async function getTodaySlots() { async function runDraftAutoApprove() { try { - // Берём только черновики созданные ВЧЕРА (между 00:00 и 23:59 вчера МСК) - // Это именно те, что сгенерировались накануне и ждут одобрения + // Берём черновики созданные ВЧЕРА по МСК (между 00:00 и 23:59 вчера). + // Строго только вчерашние — чтобы при повторном деплое/рестарте не захватить + // старые черновики и не создать очередь на несколько дней. const { rows: drafts } = await query( `SELECT id, title, category, created_at FROM articles WHERE status='draft' - AND created_at >= NOW() - INTERVAL '36 hours' - ORDER BY created_at ASC` + AND created_at AT TIME ZONE 'Europe/Moscow' >= (CURRENT_DATE - INTERVAL '1 day')::date + AND created_at AT TIME ZONE 'Europe/Moscow' < CURRENT_DATE::date + ORDER BY created_at ASC + LIMIT 4` ); if (!drafts.length) { @@ -80,10 +83,14 @@ async function runDraftAutoApprove() { return; } - // Раскладываем черновики по свободным слотам (1 к 1) - for (let i = 0; i < drafts.length; i++) { + if (drafts.length > freeSlots.length) { + console.log(`[DraftApprove] черновиков ${drafts.length} > свободных слотов ${freeSlots.length} — лишние останутся в draft`); + } + + // Раскладываем черновики по свободным слотам (1 к 1, не больше числа слотов) + for (let i = 0; i < Math.min(drafts.length, freeSlots.length); i++) { const draft = drafts[i]; - const slot = freeSlots[i] || freeSlots[freeSlots.length - 1]; // если черновиков больше слотов — ставим в последний + const slot = freeSlots[i]; await query( `UPDATE articles SET status='published', published_at=$2 WHERE id=$1`,