kozukata-toa/src/servers/allnet/router/report-api/Report/router.ts

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;