Files
bodyshop-media-server/server.ts
2024-07-23 09:49:47 -07:00

145 lines
4.6 KiB
TypeScript

import bodyParser from "body-parser";
import dotenv from "dotenv";
import express, { Express } from "express";
import winston from "winston";
import path, { resolve } from "path";
import JobRequestValidator from "./jobs/jobRequestValidator";
import { JobsListMedia } from "./jobs/jobsListMedia";
import { JobsMoveMedia } from "./jobs/jobsMoveMedia";
import { JobMediaUploadMulter, jobsUploadMedia } from "./jobs/jobsUploadMedia";
import InitServer, { FolderPaths } from "./util/serverInit";
import DailyRotateFile from "winston-daily-rotate-file";
import morgan from "morgan";
import { BillsListMedia } from "./bills/billsListMedia";
import BillRequestValidator from "./bills/billRequestValidator";
import cors from "cors";
import helmet from "helmet";
import responseTime from "response-time";
import nocache from "nocache";
import { BillsMediaUploadMulter, BillsUploadMedia } from "./bills/billsUploadMedia";
import ValidateImsToken from "./util/validateToken";
import { jobsDownloadMedia } from "./jobs/jobsDownloadMedia";
import { JobsDeleteMedia } from "./jobs/jobsDeleteMedia";
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: "14d"
}),
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: "14d"
}),
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: "14d",
level: "error"
}),
new DailyRotateFile({
filename: path.join(FolderPaths.Root, "logs", "debug-%DATE%.log"),
datePattern: "YYYY-MM-DD-HH",
zippedArchive: true,
maxSize: "20m",
maxFiles: "14d",
level: "debug"
}),
new DailyRotateFile({
filename: path.join(FolderPaths.Root, "logs", "ALL-%DATE%.log"),
datePattern: "YYYY-MM-DD-HH",
zippedArchive: true,
maxSize: "20m",
maxFiles: "14d"
})
]
});
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, JobRequestValidator, JobsListMedia);
app.post("/jobs/upload", ValidateImsToken, JobMediaUploadMulter.array("file"), JobRequestValidator, jobsUploadMedia);
app.post("/jobs/download", ValidateImsToken, JobRequestValidator, 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}`);
});