import express from "express"; import cors from "cors"; import { fileURLToPath } from 'url'; import { dirname, join } from 'path'; import http from "http"; import dotenv from "dotenv"; // import listingRoutes from "./routes/listingRoutes.js"; import locationRoutes from "./routes/locationRoutes.js"; import chatRoutes from "./routes/chatRoutes.js"; import userRoutes from "./routes/userRoutes.js"; import { initSocket } from "./socket.js"; import { startExpirationJob } from "./jobs/expirationJob.js"; // Import middleware (in correct order) import requestContext from "./middleware/requestContext.js"; import { auditLoggerMiddleware } from "./services/auditLogger.js"; import registerListingsApi from "./routes/listings.route.js"; import CommonApiBuilder from "./core/builders/CommonApiBuilder.js"; // import JwtAuthMiddleware from "./core/middleware/JwtAuthMiddleware.js"; // import RateLimiterMiddleware from "./core/middleware/RateLimiterMiddleware.js"; import dbClient from "./core/db/client.js"; // Load environment variables dotenv.config(); const app = express(); // Trust proxy for correct IP addresses (important for rate limiting) if (process.env.TRUST_PROXY === 'true' || process.env.TRUST_PROXY === '1') { app.set('trust proxy', true); } app.use(cors()); app.use(express.json()); // ===================================================== // MIDDLEWARE CHAIN (IMPORTANT ORDER) // ===================================================== // 1. Request Context (FIRST - extracts IP, user agent, etc.) app.use(requestContext); // 2. Audit Logger (attach logger to request) app.use(auditLoggerMiddleware); // Serve static files from public directory const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); app.use(express.static(join(__dirname, 'public'))); const PORT = process.env.PORT || 3200; const common = new CommonApiBuilder(app) // .use(new JwtAuthMiddleware()) // .use(new RateLimiterMiddleware(rateLimiterRead)) // .use(new CoarseAuthMiddleware(['USER', 'ADMIN'])) .build(); // register ALL listing APIs registerListingsApi("/listings", common, dbClient); // Add routes here app.use("/locations", locationRoutes); app.use("/chat", chatRoutes); app.use("/users", userRoutes); const server = http.createServer(app); initSocket(server); // Start Background Jobs startExpirationJob(); server.listen(PORT, () => { console.log(`BuySellService is running on port ${PORT}`); });