import bodyParser from "body-parser"; import cors from "cors"; import dotenv from "dotenv"; import express, { Express } from "express"; import helmet from "helmet"; import morgan from "morgan"; import nocache from "nocache"; import path, { resolve } from "path"; import responseTime from "response-time"; import winston from "winston"; import DailyRotateFile from "winston-daily-rotate-file"; import BillRequestValidator from "./bills/billRequestValidator.js"; import { BillsListMedia } from "./bills/billsListMedia.js"; import { BillsMediaUploadMulter, BillsUploadMedia } from "./bills/billsUploadMedia.js"; import validateJobRequest from "./jobs/jobRequestValidator.js"; import { JobsDeleteMedia } from "./jobs/jobsDeleteMedia.js"; import { jobsDownloadMedia } from "./jobs/jobsDownloadMedia.js"; import { JobsListMedia } from "./jobs/jobsListMedia.js"; import { JobsMoveMedia } from "./jobs/jobsMoveMedia.js"; import { JobMediaUploadMulter, jobsUploadMedia } from "./jobs/jobsUploadMedia.js"; import InitServer, { FolderPaths } from "./util/serverInit.js"; import ValidateImsToken from "./util/validateToken.js"; dotenv.config({ path: resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`) }); export const logger = winston.createLogger({ format: winston.format.combine(winston.format.timestamp(), winston.format.json(), winston.format.prettyPrint()), level: "http", levels: { ...winston.config.syslog.levels, http: 8 }, exceptionHandlers: [ new DailyRotateFile({ filename: path.join(FolderPaths.Root, "logs", "exceptions-%DATE%.log"), datePattern: "YYYY-MM-DD-HH", zippedArchive: true, maxSize: "20m", maxFiles: "14" }), new winston.transports.Console({ format: winston.format.combine(winston.format.colorize(), winston.format.simple()) }) ], rejectionHandlers: [ new DailyRotateFile({ filename: path.join(FolderPaths.Root, "logs", "rejections-%DATE%.log"), datePattern: "YYYY-MM-DD-HH", zippedArchive: true, maxSize: "20m", maxFiles: "14" }), new winston.transports.Console({ format: winston.format.combine(winston.format.colorize(), winston.format.simple()) }) ], transports: [ new DailyRotateFile({ filename: path.join(FolderPaths.Root, "logs", "errors-%DATE%.log"), datePattern: "YYYY-MM-DD-HH", zippedArchive: true, maxSize: "20m", maxFiles: "14", level: "error" }), new DailyRotateFile({ filename: path.join(FolderPaths.Root, "logs", "debug-%DATE%.log"), datePattern: "YYYY-MM-DD-HH", zippedArchive: true, maxSize: "20m", maxFiles: "14", level: "debug" }), new DailyRotateFile({ filename: path.join(FolderPaths.Root, "logs", "ALL-%DATE%.log"), datePattern: "YYYY-MM-DD-HH", zippedArchive: true, maxSize: "20m", maxFiles: "14" }) ] }); if (process.env.NODE_ENV !== "production") { logger.add( new winston.transports.Console({ format: winston.format.combine(winston.format.colorize(), winston.format.simple()) }) ); } const app: Express = express(); const port = process.env.PORT; app.set("etag", false); app.use(nocache()); app.use(bodyParser.json({ limit: "1000mb" })); app.use(bodyParser.urlencoded({ limit: "1000mb", extended: true })); app.use(responseTime()); app.use(cors()); const morganMiddleware = morgan( "combined", //":method :url :status :res[content-length] - :response-time ms" { stream: { write: (message) => logger.http(message.trim()) } } ); app.use(morganMiddleware); app.use(helmet({ crossOriginResourcePolicy: { policy: "cross-origin" } })); app.post("/jobs/list", ValidateImsToken, validateJobRequest, JobsListMedia); app.post("/jobs/upload", ValidateImsToken, JobMediaUploadMulter.array("file"), validateJobRequest, jobsUploadMedia); app.post("/jobs/download", ValidateImsToken, validateJobRequest, jobsDownloadMedia); app.post( "/jobs/move", //JobRequestValidator, ValidateImsToken, JobsMoveMedia ); app.post( "/jobs/delete", //JobRequestValidator, ValidateImsToken, JobsDeleteMedia ); app.post("/bills/list", BillRequestValidator, BillsListMedia); app.post( "/bills/upload", ValidateImsToken, BillsMediaUploadMulter.array("file"), BillRequestValidator, BillsUploadMedia ); app.get("/", ValidateImsToken, (req: express.Request, res: express.Response) => { res.send("IMS running."); }); InitServer(); app.use(FolderPaths.StaticPath, express.static(FolderPaths.Root, { etag: false, maxAge: 30 * 1000 })); app.use("/assets", express.static("./assets", { etag: false, maxAge: 30 * 1000 })); app.listen(port, () => { logger.info(`ImEX Media Server is running at http://localhost:${port}`); });