55 lines
1.3 KiB
TypeScript

import express from 'express';
import cors from 'cors';
import helmet from 'helmet';
import dotenv from 'dotenv';
dotenv.config();
const app = express();
const PORT = process.env.PORT || 4000;
// Middleware
app.use(helmet());
app.use(cors({
origin: process.env.FRONTEND_URLS?.split(',') || ['http://localhost:3000'],
credentials: true,
}));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// Health check
app.get('/health', (req, res) => {
res.json({ status: 'ok', timestamp: new Date().toISOString() });
});
// API Routes
app.get('/api/v1', (req, res) => {
res.json({
message: 'AvanzaCast Backend API',
version: '1.0.0',
endpoints: {
auth: '/api/v1/auth',
users: '/api/v1/users',
broadcasts: '/api/v1/broadcasts',
subscriptions: '/api/v1/subscriptions',
integrations: '/api/v1/integrations',
},
});
});
// 404 handler
app.use((req, res) => {
res.status(404).json({ error: 'Not found' });
});
// Error handler
app.use((err: Error, req: express.Request, res: express.Response, next: express.NextFunction) => {
console.error(err.stack);
res.status(500).json({ error: 'Internal server error' });
});
app.listen(PORT, () => {
console.log(`🚀 Backend API running on http://localhost:${PORT}`);
console.log(`📡 Environment: ${process.env.NODE_ENV}`);
});