65 lines
1.7 KiB
TypeScript
65 lines
1.7 KiB
TypeScript
import { Router } from "express";
|
|
import { Machine } from "external/db/entity/allnet";
|
|
import { EventLog } from "external/db/entity/base";
|
|
import CreateLogCtx from "lib/logger/logger";
|
|
import { Config } from "lib/setup/config";
|
|
import { DownloadReportSchema } from "servers/allnet/types/download-report";
|
|
import { fromZodError } from "zod-validation-error";
|
|
|
|
const logger = CreateLogCtx(__filename);
|
|
|
|
const router: Router = Router({ mergeParams: true });
|
|
|
|
router.post("/", async (req, res) => {
|
|
const parseResult = DownloadReportSchema.safeParse(req.safeBody);
|
|
|
|
if (!parseResult.success) {
|
|
logger.error("Invalid download progress report.", {
|
|
err: fromZodError(parseResult.error).message,
|
|
});
|
|
return res.status(200).send("NG");
|
|
}
|
|
|
|
const reportData = parseResult.data.appimage ?? parseResult.data.optimage;
|
|
|
|
if (!reportData) {
|
|
logger.error(
|
|
"Invalid download progress report. Neither appimage nor optimage was available."
|
|
);
|
|
return res.status(200).send("NG");
|
|
}
|
|
|
|
if (!Config.ALLNET_CONFIG.ALLOW_UNREGISTERED_SERIALS) {
|
|
const machine = await Machine.findOne({
|
|
where: {
|
|
serial: reportData.serial,
|
|
},
|
|
});
|
|
|
|
if (!machine) {
|
|
logger.error("Rejected download progress report from unknown serial.", { reportData });
|
|
return res.status(200).send("NG");
|
|
}
|
|
}
|
|
|
|
const message = `${reportData.serial} reported download state for ${reportData.gd} v${
|
|
reportData.dav
|
|
}: ${reportData.tdsc}/${reportData.tsc} segments downloaded for working files ${
|
|
reportData.wfl
|
|
} with ${reportData.dfl ?? "none"} complete.`;
|
|
|
|
const eventLog = EventLog.construct({
|
|
system: "allnet",
|
|
type: "DOWNLOAD_REPORT",
|
|
severity: "info",
|
|
message,
|
|
details: reportData,
|
|
});
|
|
|
|
await eventLog.save();
|
|
|
|
return res.status(200).send("OK");
|
|
});
|
|
|
|
export default router;
|