Neue Ankündigungen (z. B. Schornsteinfeger, Handwerkertermin), nur vom Vermieter anlegbar, für alle sichtbar. Zusätzlich eine gebündelte 'Für dich diese Woche'-Übersicht für Mieter mit fälligem Putzplan, fälliger Miete, anstehendem Mülltermin und Ankündigungen der nächsten 7 Tage.
73 lines
3.1 KiB
TypeScript
73 lines
3.1 KiB
TypeScript
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}`));
|
|
}
|