diff --git a/.env.example b/.env.example index 937dd20..9b83aac 100644 --- a/.env.example +++ b/.env.example @@ -10,3 +10,9 @@ APOLLO_BACKEND_GRAPHQL_URL=http://apollo-backend:4000/graphql HATCHET_CLIENT_TOKEN= HATCHET_CLIENT_HOST_PORT=fregat-hatchet-engine:7070 HATCHET_WORKER_NAME=fregat-hatchet-worker + +CHAT_CRON_ENABLED=1 +CHAT_CRON_INTERVAL_SEC=300 + +TELEGRAM_BOT_TOKEN= +MAX_BOT_WEBHOOK_URL= diff --git a/src/chat-health-cron.js b/src/chat-health-cron.js new file mode 100644 index 0000000..126bb4c --- /dev/null +++ b/src/chat-health-cron.js @@ -0,0 +1,52 @@ +function isEnabled(value) { + return ['1', 'true', 'yes', 'on'].includes(String(value || '').toLowerCase()); +} + +async function checkBackendHealth() { + const url = process.env.APOLLO_BACKEND_GRAPHQL_URL; + if (!url) { + return 'backend_url_missing'; + } + + try { + const response = await fetch(url, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + body: JSON.stringify({ query: 'query Healthcheck { healthcheck }' }), + }); + + if (!response.ok) { + return `backend_http_${response.status}`; + } + + const payload = await response.json(); + if (payload.errors?.length) { + return `backend_graphql_error:${payload.errors[0].message}`; + } + + return 'backend_ok'; + } catch (error) { + return `backend_unreachable:${error.message}`; + } +} + +async function runHealthTick() { + const telegram = process.env.TELEGRAM_BOT_TOKEN ? 'configured' : 'missing'; + const max = process.env.MAX_BOT_WEBHOOK_URL ? 'configured' : 'missing'; + const backend = await checkBackendHealth(); + + console.log(`[chat-cron] telegram=${telegram} max=${max} backend=${backend}`); +} + +export function startChatHealthCron() { + if (!isEnabled(process.env.CHAT_CRON_ENABLED ?? '1')) { + return; + } + + const intervalSec = Number(process.env.CHAT_CRON_INTERVAL_SEC ?? 300); + const safeIntervalSec = Number.isFinite(intervalSec) && intervalSec > 0 ? intervalSec : 300; + + runHealthTick(); + const timer = setInterval(runHealthTick, safeIntervalSec * 1000); + timer.unref(); +} diff --git a/src/worker.js b/src/worker.js index 832cb38..8117ad6 100644 --- a/src/worker.js +++ b/src/worker.js @@ -1,5 +1,6 @@ import 'dotenv/config'; +import { startChatHealthCron } from './chat-health-cron.js'; import { hatchet } from './hatchet-client.js'; import { orderStatusNotifier } from './workflows/order-status-notifier.js'; import { referralBalanceSync } from './workflows/referral-balance-sync.js'; @@ -7,6 +8,8 @@ import { referralBalanceSync } from './workflows/referral-balance-sync.js'; const workerName = process.env.HATCHET_WORKER_NAME || 'fregat-hatchet-worker'; async function main() { + startChatHealthCron(); + const worker = await hatchet.worker(workerName, { workflows: [orderStatusNotifier, referralBalanceSync], slots: 10,