diff --git a/backend/bun.lock b/backend/bun.lock index e722e1a..8c2a12b 100644 --- a/backend/bun.lock +++ b/backend/bun.lock @@ -8,6 +8,7 @@ "cors": "^2.8.5", "dotenv": "^17.2.0", "express": "^5.1.0", + "node-cron": "^4.5.0", }, "devDependencies": { "@types/cors": "^2.8.19", @@ -126,6 +127,8 @@ "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + "node-cron": ["node-cron@4.5.0", "", {}, "sha512-4Trh+kjvbXokyJkwQumvD5YAgeJfgHLR/sKyu71uSmxfCR5QMO1hldpvmFZOICN5pLgNY+J5Y8+ar3XKo5/4tQ=="], + "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], diff --git a/backend/package.json b/backend/package.json index ff65b52..bd49e07 100644 --- a/backend/package.json +++ b/backend/package.json @@ -11,7 +11,8 @@ "dependencies": { "cors": "^2.8.5", "dotenv": "^17.2.0", - "express": "^5.1.0" + "express": "^5.1.0", + "node-cron": "^4.5.0" }, "devDependencies": { "@types/cors": "^2.8.19", diff --git a/backend/src/index.ts b/backend/src/index.ts index 8fd6617..3aceaa3 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -18,6 +18,21 @@ const apiRoot = config.apiPrefix || '/'; app.use(apiRoot, createHealthRouter(config)); app.use(apiRoot, createTodosRouter(config, db)); + +// 10-second health check logger +setInterval(() => { + console.log('[Health Check] Sandbox is healthy at ' + new Date().toISOString()); +}, 10000); + +app.post('/_cron/tick', (req, res) => { + const authHeader = req.headers.authorization; + if (!authHeader || authHeader !== 'Bearer ' + process.env.CRON_TOKEN) { + return res.status(401).json({ success: false, error: 'Unauthorized' }); + } + console.log('[Tick] Cloud Run cron tick triggered.'); + res.status(200).json({ success: true }); +}); + app.use((_req, res) => { res.status(404).json({ success: false, error: 'Not found' }); });