Files
ck_qr_nextjs_node_redis_pos…/api/server.js
T

105 lines
2.7 KiB
JavaScript

const express = require('express');
const cors = require('cors');
const { Pool } = require('pg');
const { createClient } = require('redis');
const cookieParser = require('cookie-parser');
const fs = require('fs');
const path = require('path');
require('dotenv').config();
const app = express();
const port = process.env.PORT || 4001;
app.use(cors({ origin: 'http://localhost:4000', credentials: true }));
app.use(express.json());
// Routes
const authRoutes = require('./routes/auth');
const qrRoutes = require('./routes/qr');
const redirectRoutes = require('./routes/redirect');
const analyticsRoutes = require('./routes/analytics');
const adminRoutes = require('./routes/admin');
const paymentsRoutes = require('./routes/payments');
app.use('/api/auth', authRoutes);
app.use('/api/qr', qrRoutes);
app.use('/api/analytics', analyticsRoutes);
app.use('/api/admin', adminRoutes);
app.use('/api/payments', paymentsRoutes);
// Support Traefik stripped prefixes
app.use('/auth', authRoutes);
app.use('/qr', qrRoutes);
app.use('/analytics', analyticsRoutes);
app.use('/admin', adminRoutes);
app.use('/payments', paymentsRoutes);
app.use('/l', redirectRoutes);
// Postgres setup
const pgPool = new Pool({
host: process.env.PGHOST || 'postgres',
port: process.env.PGPORT || 5432,
user: process.env.PGUSER || 'postgres',
password: process.env.PGPASSWORD || 'postgres',
database: process.env.PGDATABASE || 'ckqr',
});
// Initialize Database automatically
const initDb = async () => {
try {
const sql = fs.readFileSync(path.join(__dirname, 'db', 'init.sql'), 'utf8');
await pgPool.query(sql);
console.log('Database initialized successfully.');
} catch (err) {
console.error('Database initialization failed:', err);
}
};
initDb();
// Redis setup
const redisClient = createClient({
url: `redis://${process.env.REDIS_HOST || 'redis'}:${process.env.REDIS_PORT || 6379}`
});
redisClient.on('error', (err) => console.log('Redis Client Error', err));
const healthCheck = async (req, res) => {
let pgStatus = 'Unknown';
let redisStatus = 'Unknown';
try {
const pgRes = await pgPool.query('SELECT NOW()');
pgStatus = 'Connected';
} catch (err) {
pgStatus = `Error: ${err.message}`;
}
try {
if (!redisClient.isOpen) {
await redisClient.connect();
}
await redisClient.ping();
redisStatus = 'Connected';
} catch (err) {
redisStatus = `Error: ${err.message}`;
}
res.json({
status: 'ok',
services: {
api: 'Running',
postgres: pgStatus,
redis: redisStatus
}
});
};
app.get('/api/health', healthCheck);
app.get('/health', healthCheck);
app.listen(port, () => {
console.log(`CK-QR API listening on port ${port}`);
});