import Fastify from "fastify"; import swaggerPlugin from "./plugins/swagger" import supabasePlugin from "./plugins/supabase"; import dayjsPlugin from "./plugins/dayjs"; import healthRoutes from "./routes/health"; import meRoutes from "./routes/auth/me"; import tenantRoutes from "./routes/tenant"; import tenantPlugin from "./plugins/tenant"; import authRoutes from "./routes/auth/auth"; import authRoutesAuthenticated from "./routes/auth/auth-authenticated"; import authPlugin from "./plugins/auth"; import adminRoutes from "./routes/admin"; import corsPlugin from "./plugins/cors"; import queryConfigPlugin from "./plugins/queryconfig"; import dbPlugin from "./plugins/db"; import resourceRoutesSpecial from "./routes/resourcesSpecial"; import fastifyCookie from "@fastify/cookie"; import historyRoutes from "./routes/history"; import fileRoutes from "./routes/files"; import functionRoutes from "./routes/functions"; import bankingRoutes from "./routes/banking"; import exportRoutes from "./routes/exports" import emailAsUserRoutes from "./routes/emailAsUser"; import authProfilesRoutes from "./routes/profiles"; import helpdeskRoutes from "./routes/helpdesk"; import helpdeskInboundRoutes from "./routes/helpdesk.inbound"; import notificationsRoutes from "./routes/notifications"; import staffTimeRoutes from "./routes/staff/time"; import staffTimeConnectRoutes from "./routes/staff/timeconnects"; import userRoutes from "./routes/auth/user"; import publiclinksAuthenticatedRoutes from "./routes/publiclinks/publiclinks-authenticated"; //Public Links import publiclinksNonAuthenticatedRoutes from "./routes/publiclinks/publiclinks-non-authenticated"; //Resources import resourceRoutes from "./routes/resources/main"; //M2M import authM2m from "./plugins/auth.m2m"; import helpdeskInboundEmailRoutes from "./routes/helpdesk.inbound.email"; import deviceRoutes from "./routes/internal/devices"; import tenantRoutesInternal from "./routes/internal/tenant"; import staffTimeRoutesInternal from "./routes/internal/time"; //Devices import devicesRFIDRoutes from "./routes/devices/rfid"; import devicesManagementRoutes from "./routes/devices/management"; import {sendMail} from "./utils/mailer"; import {loadSecrets, secrets} from "./utils/secrets"; import {initMailer} from "./utils/mailer" import {initS3} from "./utils/s3"; //Services import servicesPlugin from "./plugins/services"; async function main() { const app = Fastify({ logger: false }); await loadSecrets(); await initMailer(); await initS3(); /*app.addHook("onRequest", (req, reply, done) => { console.log("Incoming:", req.method, req.url, "Headers:", req.headers) done() })*/ // Plugins Global verfügbar await app.register(swaggerPlugin); await app.register(supabasePlugin); await app.register(tenantPlugin); await app.register(dayjsPlugin); await app.register(dbPlugin); await app.register(servicesPlugin); app.addHook('preHandler', (req, reply, done) => { console.log(req.method) console.log('Matched path:', req.routeOptions.url) console.log('Exact URL:', req.url) done() }) app.get('/health', async (req, res) => { return res.send({ status: 'ok' }) }) //Plugin nur auf bestimmten Routes await app.register(queryConfigPlugin, { routes: ['/api/resource/:resource/paginated'] }) app.register(fastifyCookie, { secret: secrets.COOKIE_SECRET, }) // Öffentliche Routes await app.register(authRoutes); await app.register(healthRoutes); await app.register(helpdeskInboundRoutes); await app.register(publiclinksNonAuthenticatedRoutes) await app.register(async (m2mApp) => { await m2mApp.register(authM2m) await m2mApp.register(helpdeskInboundEmailRoutes) await m2mApp.register(deviceRoutes) await m2mApp.register(tenantRoutesInternal) await m2mApp.register(staffTimeRoutesInternal) },{prefix: "/internal"}) await app.register(async (devicesApp) => { await devicesApp.register(devicesRFIDRoutes) await devicesApp.register(devicesManagementRoutes) },{prefix: "/devices"}) await app.register(corsPlugin); //Geschützte Routes await app.register(async (subApp) => { await subApp.register(authPlugin); await subApp.register(authRoutesAuthenticated); await subApp.register(meRoutes); await subApp.register(tenantRoutes); await subApp.register(adminRoutes); await subApp.register(resourceRoutesSpecial); await subApp.register(historyRoutes); await subApp.register(fileRoutes); await subApp.register(functionRoutes); await subApp.register(bankingRoutes); await subApp.register(exportRoutes); await subApp.register(emailAsUserRoutes); await subApp.register(authProfilesRoutes); await subApp.register(helpdeskRoutes); await subApp.register(notificationsRoutes); await subApp.register(staffTimeRoutes); await subApp.register(staffTimeConnectRoutes); await subApp.register(userRoutes); await subApp.register(publiclinksAuthenticatedRoutes); await subApp.register(resourceRoutes); },{prefix: "/api"}) app.ready(async () => { try { console.log("Testing DB Connection:") const result = await app.db.execute("SELECT NOW()"); console.log("✓ DB connection OK: " + JSON.stringify(result.rows[0])); } catch (err) { console.log("❌ DB connection failed:", err); } }); // Start try { await app.listen({ port: secrets.PORT, host: secrets.HOST }); console.log(`🚀 Server läuft auf http://${secrets.HOST}:${secrets.PORT}`); } catch (err) { app.log.error(err); process.exit(1); } } main();