fix(draftAutoApprove): строго вчерашние черновики, LIMIT 4, не больше слотов

Проблема: брали черновики за 36ч → при нескольких деплоях за день или при
накоплении старых черновиков draftAutoApprove раскладывал их все по слотам
подряд → очередь на несколько дней вместо 1.

Исправления:
  - WHERE created_at AT TIME ZONE 'Europe/Moscow' вчерашний день (00:00-23:59)
  - LIMIT 4 — не больше количества слотов в день
  - раскладываем только min(drafts, freeSlots) черновиков, лишние остаются draft
  - если черновиков > слотов — пишем в лог предупреждение
This commit is contained in:
Aleksei Pavlov
2026-06-21 16:42:37 +03:00
parent 799816f66a
commit 214bf307c7
+14 -7
View File
@@ -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`,