fix(auto-approve): публиковать черновики старше сегодняшних 07:00 МСК

Раньше правило было '< CURRENT_DATE' — черновики, созданные ночью после
полуночи, считались сегодняшними и ждали лишние сутки (не публиковались на
ближайшем 07:00). Теперь граница — сегодняшние 07:00 МСК: ночные и вечерние
(17:00) попадают, дневная свежая партия — нет. Также пофикшен catch-up:
вызывал несуществующий runAutoApprove() вместо runDraftAutoApprove().
This commit is contained in:
Alexey Pavlov
2026-06-30 08:31:18 +03:00
parent 01df5d4035
commit e19a8d630b
+10 -10
View File
@@ -43,16 +43,16 @@ async function getTodaySlots() {
async function runDraftAutoApprove() { async function runDraftAutoApprove() {
try { try {
// Берём самые СТАРЫЕ черновики, созданные НЕ сегодня (по МСК). // Берём черновики, созданные ДО сегодняшних 07:00 МСК (границы текущего цикла).
// Раньше окно было «строго вчера» + LIMIT 4 — поэтому всё, что не одобрили // Раньше было `< CURRENT_DATE` (строго прошлая календарная дата) — из-за этого
// на следующий день (дубли, излишки), оставалось в draft навсегда и копилось. // черновики, сгенерённые ночью ПОСЛЕ полуночи (напр. в 01:00), считались
// Теперь дренируем backlog по 4 старейших в день, при этом сегодняшнюю свежую // «сегодняшними» и ждали ещё сутки. Новое правило: всё, что старше сегодняшних
// партию не трогаем (она станет доступна завтра). В связке с дедупом автогена // 07:00, публикуется на этом тике; свежую партию (генерация в 17:00) не трогаем —
// (макс 4/день) это даёт устойчивое состояние без накопления. // она старше 07:00 уже на следующий день. Дренаж backlog по 4 старейших/день.
const { rows: drafts } = await query( const { rows: drafts } = await query(
`SELECT id, title, category, created_at FROM articles `SELECT id, title, category, created_at FROM articles
WHERE status='draft' WHERE status='draft'
AND created_at AT TIME ZONE 'Europe/Moscow' < CURRENT_DATE::date AND created_at < ((date_trunc('day', now() AT TIME ZONE 'Europe/Moscow') + INTERVAL '7 hours') AT TIME ZONE 'Europe/Moscow')
ORDER BY created_at ASC ORDER BY created_at ASC
LIMIT 4` LIMIT 4`
); );
@@ -125,11 +125,11 @@ function startDraftAutoApproveScheduler() {
const { rows: missed } = await query(` const { rows: missed } = await query(`
SELECT COUNT(*) AS cnt FROM articles SELECT COUNT(*) AS cnt FROM articles
WHERE status='draft' WHERE status='draft'
AND created_at AT TIME ZONE 'Europe/Moscow' < CURRENT_DATE::date AND created_at < ((date_trunc('day', now() AT TIME ZONE 'Europe/Moscow') + INTERVAL '7 hours') AT TIME ZONE 'Europe/Moscow')
`); `);
if (parseInt(missed[0]?.cnt, 10) > 0) { if (parseInt(missed[0]?.cnt, 10) > 0) {
console.log('[DraftApprove] catch-up при старте: найдены пропущенные вчерашние черновики (' + missed[0].cnt + ' шт)'); console.log('[DraftApprove] catch-up при старте: найдены пропущенные черновики (' + missed[0].cnt + ' шт)');
await runAutoApprove(); await runDraftAutoApprove();
} }
} catch (err) { console.error('[DraftApprove] catch-up error:', err.message); } } catch (err) { console.error('[DraftApprove] catch-up error:', err.message); }
} }