hAPI_face2 / src /server.ts
deploy's picture
Deploy hAPI-face2 mediator 2025-10-07T05:24:34Z
5816640
import 'dotenv/config';
import express from 'express';
import helmet from 'helmet';
import compression from 'compression';
import cors from 'cors';
import morgan from 'morgan';
import { z } from 'zod';
import { registerRiverRoutes } from './routes/river.js';
import { registerFlowRoutes } from './routes/flows.js';
import { registerMoneyRoutes } from './routes/money.js';
import { registerBookEmpireRoutes } from './routes/bookEmpire.js';
const app = express();
const PORT = Number(process.env.PORT || process.env.HTTP_PORT || 7860);
const AIS3_API_KEY = process.env.AIS3_API_KEY;
const requiredEnvSchema = z.object({
SUPABASE_URL: z.string().url(),
SUPABASE_SERVICE_ROLE_KEY: z.string().min(10),
});
requiredEnvSchema.parse({
SUPABASE_URL: process.env.SUPABASE_URL,
SUPABASE_SERVICE_ROLE_KEY: process.env.SUPABASE_SERVICE_ROLE_KEY,
});
app.use(helmet());
app.use(cors());
app.use(express.json({ limit: '2mb' }));
app.use(express.urlencoded({ extended: true }));
app.use(compression());
app.use(morgan('combined'));
// Health endpoint (no auth)
app.get('/health', (_req, res) => {
res.json({
status: 'ok',
service: 'hAPI-face2',
timestamp: new Date().toISOString(),
});
});
// Simple Bearer auth for everything else
app.use((req, res, next) => {
if (!AIS3_API_KEY) {
return next(); // auth disabled when key missing
}
const header = req.get('authorization');
if (!header || !header.toLowerCase().startsWith('bearer ')) {
return res.status(401).json({ error: 'Unauthorized' });
}
const token = header.slice(7);
if (token !== AIS3_API_KEY) {
return res.status(403).json({ error: 'Forbidden' });
}
next();
});
// Register API routes under /api
const apiRouter = express.Router();
registerRiverRoutes(apiRouter);
registerFlowRoutes(apiRouter);
registerMoneyRoutes(apiRouter);
registerBookEmpireRoutes(apiRouter);
app.use('/api', apiRouter);
// Error handler
// eslint-disable-next-line @typescript-eslint/no-unused-vars
app.use((error: any, _req: express.Request, res: express.Response, _next: express.NextFunction) => {
console.error('API error:', error);
res.status(500).json({
error: 'Internal Server Error',
message: error?.message ?? 'Unknown error',
});
});
app.listen(PORT, '0.0.0.0', () => {
console.log(`hAPI-face2 mediator listening on port ${PORT}`);
});