import fs from 'fs'; import path from 'path'; import express from 'express'; import cookieParser from 'cookie-parser'; import cors from 'cors'; import { config } from './config'; import { runMigrations } from './db/migrate'; import { requireAuth } from './middleware/auth'; const pkg = JSON.parse( fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf-8'), ) as { version: string }; import authRouter from './routes/auth'; import importRouter from './routes/import'; import importsRouter from './routes/imports'; import transactionsRouter from './routes/transactions'; import accountsRouter from './routes/accounts'; import categoriesRouter from './routes/categories'; import categoryRulesRouter from './routes/categoryRules'; import analyticsRouter from './routes/analytics'; const app = express(); app.set('trust proxy', 1); app.use(express.json({ limit: '10mb' })); app.use(cookieParser()); app.use(cors({ origin: true, credentials: true })); // Auth routes (login is public; me/logout apply auth internally) app.use('/api/auth', authRouter); app.get('/api/version', (_req, res) => { res.json({ version: pkg.version }); }); // All remaining /api routes require authentication app.use('/api', requireAuth); app.use('/api/import', importRouter); app.use('/api/imports', importsRouter); app.use('/api/transactions', transactionsRouter); app.use('/api/accounts', accountsRouter); app.use('/api/categories', categoriesRouter); app.use('/api/category-rules', categoryRulesRouter); app.use('/api/analytics', analyticsRouter); app.use( ( err: Error, _req: express.Request, res: express.Response, _next: express.NextFunction, ) => { console.error(err); res.status(500).json({ error: 'INTERNAL_ERROR', message: 'Internal server error' }); }, ); async function start() { await runMigrations(); app.listen(config.port, () => { console.log(`Backend listening on port ${config.port}`); }); } start().catch((err) => { console.error('Failed to start:', err); process.exit(1); });