UNPKG

@paroicms/server

Version:
33 lines 1.49 kB
import { ApiError } from "@paroicms/public-server-lib"; import { type } from "arktype"; import { checkBackupFileName } from "../../connector/site-backup/backup.helper.js"; import { getBackup } from "../../connector/site-backup/backup.js"; import { getRouteParameter } from "../../express/http-helpers.js"; import { verifyPresignedLink } from "./backup.helper.js"; const BackupUrlQueryAT = type({ "t?": "string|undefined", "+": "reject", }); export async function downloadBackupController(siteContext, httpContext, routeParams) { const { req, res } = httpContext; const backupName = getRouteParameter(routeParams, "backupName"); const validated = BackupUrlQueryAT.assert(req.query); const token = validated.t; if (!token) throw new Error("missing user token"); const { backupFile, contentType } = verifyPresignedLink(token); if (!checkBackupFileName({ fqdn: req.hostname }, backupName)) { throw new ApiError("Invalid payload", 404); } if (backupFile !== backupName) { throw new ApiError("invalid token provided", 400); } const { fileStream, fileWeight } = await getBackup(siteContext, backupName); res.status(200); res.append("Cache-Control", "no-store"); res.append("Content-Type", contentType); res.append("Content-Length", fileWeight.toString()); res.append("Content-Disposition", `attachment; filename=${backupName}`); res.send(fileStream); } //# sourceMappingURL=backup.controller.js.map