@paroicms/server
Version:
The ParoiCMS server
45 lines • 2.19 kB
JavaScript
import { checkBackupFileName } from "../../connector/site-backup/backup.helper.js";
import { deleteBackupFile, listBackups } from "../../connector/site-backup/backup.js";
import { siteReadyGuard } from "../../graphql/graphql.types.js";
import { permissionGuard } from "../auth/authorization.helper.js";
import { createPresignedLink } from "./backup.helper.js";
import { executeHardenedBackup } from "./hardened-backup.service.js";
export const backupResolvers = {
Query: {
backups: async (_parent, { offset, limit }, { siteContext, httpContext }) => {
siteReadyGuard(siteContext);
await permissionGuard(siteContext, httpContext, "site.backup");
return listBackups(siteContext, { offset: offset ?? 0, limit: limit ?? 10 });
},
},
Mutation: {
initializeBackup: async (_parent, _values, { siteContext, httpContext }) => {
siteReadyGuard(siteContext);
await permissionGuard(siteContext, httpContext, "site.backup");
const { zipFileWeight, zipFileName } = await executeHardenedBackup(siteContext);
return {
fileName: zipFileName,
fileWeight: zipFileWeight,
};
},
generateBackupDownloadLink: async (_parent, { fileName }, { siteContext, httpContext }) => {
siteReadyGuard(siteContext);
await permissionGuard(siteContext, httpContext, "site.backup");
if (!checkBackupFileName({ fqdn: siteContext.fqdn }, fileName)) {
throw new Error("Invalid backup filename");
}
const accessToken = createPresignedLink({
backupFile: fileName,
contentType: "application/zip",
});
return `/adm/backend/backup/${fileName}/?t=${accessToken}`;
},
deleteBackup: async (_parent, { fileName }, { siteContext, httpContext }) => {
siteReadyGuard(siteContext);
await permissionGuard(siteContext, httpContext, "site.backup");
await deleteBackupFile(siteContext, fileName);
return true;
},
},
};
//# sourceMappingURL=backup.resolver.js.map