var createError = require("http-errors"); var express = require("express"); var path = require("path"); var cookieParser = require("cookie-parser"); var logger = require("morgan"); var swaggerJsdoc = require("swagger-jsdoc"); var swaggerUi = require("swagger-ui-express"); var indexRouter = require("./routes/index"); var usersRouter = require("./routes/users"); var shippingDockRouter = require("./routes/shipping_dock"); var orderRouter = require("./routes/order"); var transactionRouter = require("./routes/transaction"); const db = require("./models"); var cors = require("cors"); // Swagger configuration const swaggerOptions = { definition: { openapi: "3.0.0", info: { title: "Day 1 API Documentation", version: "1.0.0", description: "API documentation for Shipping Dock, Order, and Transaction management", }, servers: [ { url: "http://localhost:3000", description: "Development server", }, ], components: { schemas: { ShippingDock: { type: "object", properties: { id: { type: "integer", description: "Auto-generated ID", }, name: { type: "string", description: "Name of the shipping dock", }, status: { type: "integer", description: "Status: 1 = active, 0 = inactive", enum: [0, 1], }, created_at: { type: "string", format: "date-time" }, updated_at: { type: "string", format: "date-time" }, }, }, Order: { type: "object", properties: { id: { type: "integer", description: "Auto-generated ID", }, user_id: { type: "integer", description: "User ID" }, amount: { type: "number", format: "decimal", description: "Order amount", }, tax: { type: "number", format: "decimal", description: "Tax amount", }, notes: { type: "string", description: "Additional notes", }, status: { type: "integer", description: "Status: 1 = paid, 0 = not paid", enum: [0, 1], }, created_at: { type: "string", format: "date-time" }, updated_at: { type: "string", format: "date-time" }, }, }, Transaction: { type: "object", properties: { id: { type: "integer", description: "Auto-generated ID", }, order_id: { type: "integer", description: "Order ID" }, user_id: { type: "integer", description: "User ID" }, shipping_dock_id: { type: "integer", description: "Shipping Dock ID", }, amount: { type: "number", format: "decimal", description: "Transaction amount", }, notes: { type: "string", description: "Additional notes", }, created_at: { type: "string", format: "date-time" }, updated_at: { type: "string", format: "date-time" }, }, }, }, }, }, apis: ["./routes/*.js"], }; const swaggerSpec = swaggerJsdoc(swaggerOptions); var app = express(); app.set("db", db); // view engine setup app.set("views", path.join(__dirname, "views")); app.set("view engine", "jade"); app.use(cors()); app.use(logger("dev")); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, "public"))); // Swagger docs route app.use("/docs", swaggerUi.serve, swaggerUi.setup(swaggerSpec)); app.use("/", indexRouter); app.use("/users", usersRouter); app.use("/api/v1/shipping_dock", shippingDockRouter); app.use("/api/v1/order", orderRouter); app.use("/api/v1/transaction", transactionRouter); // catch 404 and forward to error handler app.use(function (req, res, next) { next(createError(404)); }); // error handler app.use(function (err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get("env") === "development" ? err : {}; // render the error page res.status(err.status || 500); res.render("error"); }); module.exports = app;