import 'dotenv/config'; import express from 'express'; import cors from 'cors'; import { bankingWebhookRawRouter, paymentsRouter } from './routes/bankingWebhook'; import { cockpitRouter } from './routes/cockpit'; import { authRouter } from './routes/auth'; import { invitationsRouter } from './routes/invitations'; import { ticketsRouter } from './routes/tickets'; import { cleaningTasksRouter } from './routes/cleaningTasks'; import { expensesRouter } from './routes/expenses'; import { inventoryRouter } from './routes/inventory'; import { handoverProtocolsRouter } from './routes/handoverProtocols'; import { accessCodesRouter } from './routes/accessCodes'; import { announcementsRouter } from './routes/announcements'; import { storageRouter } from './routes/storage'; import { documentsRouter } from './routes/documents'; import { contractsRouter } from './routes/contracts'; import { utilityStatementsRouter } from './routes/utilityStatements'; import { craftsmenRouter } from './routes/craftsmen'; import { ratingsRouter } from './routes/ratings'; import { smartLockRouter } from './routes/smartLock'; export function createApp() { const app = express(); // Webhook-Router zuerst: hat seinen eigenen express.raw()-Parser pro Route // (siehe routes/bankingWebhook.ts) und läuft daher unabhängig vom globalen // JSON-Parser unten. app.use('/v1', bankingWebhookRawRouter); // CORS: erlaubt dem lokal geöffneten Web-Dashboard (file:// oder // localhost-Server), auf die API zuzugreifen. Für den Testbetrieb offen // konfiguriert (origin: true spiegelt den anfragenden Origin) — für einen // echten Produktivbetrieb sollte hier eine feste Allowlist stehen. app.use(cors({ origin: true })); // Alle übrigen Routen bekommen normal geparstes JSON. Limit angehoben, da // Inventarfotos, Vertragsdokumente und beim Einladung-Annehmen bis zu drei // Dateien (Ausweis vorne/hinten, optional Schufa) als Data-URLs im Body // versendet werden (keine separate Objekt-Storage-Anbindung in diesem // Demo-Stand). 10mb reichte für einzelne Fotos, war aber zu knapp für drei // hochauflösende Handyfotos in einem Request (HTTP 413). app.use(express.json({ limit: '50mb' })); app.use('/v1', paymentsRouter); app.use('/v1', cockpitRouter); app.use('/v1', authRouter); app.use('/v1', invitationsRouter); app.use('/v1', ticketsRouter); app.use('/v1', cleaningTasksRouter); app.use('/v1', expensesRouter); app.use('/v1', inventoryRouter); app.use('/v1', handoverProtocolsRouter); app.use('/v1', accessCodesRouter); app.use('/v1', announcementsRouter); app.use('/v1', storageRouter); app.use('/v1', documentsRouter); app.use('/v1', contractsRouter); app.use('/v1', utilityStatementsRouter); app.use('/v1', craftsmenRouter); app.use('/v1', ratingsRouter); app.use('/v1', smartLockRouter); app.get('/health', (_req, res) => res.status(200).json({ ok: true })); return app; } if (require.main === module) { const app = createApp(); const port = process.env.PORT ? Number(process.env.PORT) : 3000; app.listen(port, () => console.log(`Backend läuft auf Port ${port}`)); }