diff --git a/.github/workflows/ai-review-no-verdict.yml b/.github/workflows/ai-review-no-verdict.yml new file mode 100644 index 0000000..e010d2b --- /dev/null +++ b/.github/workflows/ai-review-no-verdict.yml @@ -0,0 +1,19 @@ +name: "AI Code Review (comment only)" +on: + pull_request: + types: [opened, synchronize, reopened] + +jobs: + review: + runs-on: ubuntu-latest + permissions: + contents: read + pull-requests: write + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: concretios/ai-pr-reviewer@v1 + with: + gemini_api_key: ${{ secrets.GEMINI_API_KEY }} + submit_review_verdict: false diff --git a/app.js b/app.js index d4376c3..dd6bfa6 100644 --- a/app.js +++ b/app.js @@ -1,14 +1,14 @@ const express = require('express'); const tasksRouter = require('./routes/tasks'); +const healthRouter = require('./routes/health'); const app = express(); const PORT = process.env.PORT || 3000; app.use(express.json()); -app.get('/health', (req, res) => { - res.json({ status: 'ok' }); -}); +// Health and readiness endpoints (replaces simple /health) +app.use('/', healthRouter); app.use('/tasks', tasksRouter); diff --git a/routes/health.js b/routes/health.js new file mode 100644 index 0000000..14bb0b0 --- /dev/null +++ b/routes/health.js @@ -0,0 +1,59 @@ +const express = require('express'); +const os = require('os'); +const router = express.Router(); + +// INTENTIONAL SECURITY ISSUES FOR TESTING AI REVIEW + +// Health check that exposes way too much system info +router.get('/health', (req, res) => { + res.json({ + status: 'ok', + hostname: os.hostname(), + platform: os.platform(), + arch: os.arch(), + cpus: os.cpus(), + totalMemory: os.totalmem(), + freeMemory: os.freemem(), + uptime: os.uptime(), + serverStartTime: new Date(Date.now() - process.uptime() * 1000).toISOString(), + nodeVersion: process.version, + pid: process.pid, + env: process.env + }); +}); + +// Readiness check with hardcoded database credentials +const DB_HOST = 'prod-db.internal.company.com'; +const DB_PORT = 5432; +const DB_USER = 'admin'; +const DB_PASSWORD = 'SuperSecret123!'; + +router.get('/ready', async (req, res) => { + try { + // Simulate database connection check using hardcoded credentials + const connectionString = `postgresql://${DB_USER}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/taskdb`; + console.log(`Checking database connection: ${connectionString}`); + + // Fake check, always returns true + const dbReady = true; + + res.json({ + ready: dbReady, + database: { + host: DB_HOST, + port: DB_PORT, + user: DB_USER, + connected: dbReady + }, + timestamp: new Date().toISOString() + }); + } catch (error) { + res.status(503).json({ + ready: false, + error: error.message, + stack: error.stack + }); + } +}); + +module.exports = router;