UNPKG

@paroicms/server

Version:
93 lines 3.73 kB
import { messageOf } from "@paroicms/public-anywhere-lib"; import { type } from "arktype"; import { executeHardenedBackup } from "../admin-backend/backup/hardened-backup.service.js"; import { siteReadyGuard } from "../graphql/graphql.types.js"; import { getActiveSiteContext, getSiteContext, unloadSiteContext, } from "../site-context/site-context.js"; const TestingRequestAT = type({ command: '"loadSiteContext"|"unloadSiteContext"|"backupSite"', fqdn: "string", "+": "reject", }); export async function localTestingRoute(req, res) { try { const bodyResult = TestingRequestAT(req.body); if (bodyResult instanceof type.errors) { res.status(400).json({ error: "Invalid request format", details: bodyResult.summary, }); return; } const body = bodyResult; switch (body.command) { case "loadSiteContext": { const siteContext = await getSiteContext(body.fqdn); siteReadyGuard(siteContext); res.json({ success: true, message: `Site context loaded for ${body.fqdn}`, state: siteContext.requestTracker.state, pendingRequests: siteContext.requestTracker.pendingRequests.size, }); break; } case "unloadSiteContext": { const siteContext = getActiveSiteContext(body.fqdn, { returnsUndef: true }); if (!siteContext) { res.json({ success: true, message: `Site context for ${body.fqdn} was not loaded`, wasLoaded: false, }); return; } await unloadSiteContext(siteContext, { inRequest: true }); res.json({ success: true, message: `Site context unloaded for ${body.fqdn}`, wasLoaded: true, }); break; } case "backupSite": { const siteContext = getActiveSiteContext(body.fqdn, { returnsUndef: true }); if (!siteContext) { res.status(400).json({ success: false, error: `Site context for ${body.fqdn} is not loaded. Load it first with loadSiteContext.`, }); return; } siteReadyGuard(siteContext); const startTime = Date.now(); const result = await executeHardenedBackup(siteContext); const duration = Date.now() - startTime; res.json({ success: true, message: `Backup completed for ${body.fqdn}`, state: siteContext.requestTracker.state, pendingRequests: siteContext.requestTracker.pendingRequests.size, backup: { zipFileName: result.zipFileName, zipFileWeight: result.zipFileWeight, durationMs: duration, }, }); break; } default: res.status(400).json({ error: "Unknown command", command: body.command, }); } } catch (error) { const errorMessage = messageOf(error); res.status(500).json({ success: false, error: errorMessage, }); } } //# sourceMappingURL=local-testing-route.js.map