Shaheer Sarfaraz 16a8f1d15a
Use logger! add shim to convert backend responses to same format (#84)
* chore(orchestrator): add @infra import alias

* feat(server): add error/http/context/logger/sanitize infrastructure

* refactor(core): propagate request context, structured logs, and sanitization

* test/docs: update API contract assertions and contributor standards

* all pages working

* normalizing
2026-02-04 23:07:24 +00:00

95 lines
2.4 KiB
TypeScript

import { logger } from "@infra/logger";
import {
createBackup,
deleteBackup,
getNextBackupTime,
listBackups,
} from "@server/services/backup/index";
import { type Request, type Response, Router } from "express";
export const backupRouter = Router();
/**
* GET /api/backups - List all backups with metadata
*/
backupRouter.get("/", async (_req: Request, res: Response) => {
try {
const backups = await listBackups();
const nextScheduled = getNextBackupTime();
res.json({
success: true,
data: {
backups,
nextScheduled,
},
});
} catch (error) {
const message = error instanceof Error ? error.message : "Unknown error";
logger.error("Failed to list backups", error);
res.status(500).json({ success: false, error: message });
}
});
/**
* POST /api/backups - Create a manual backup
*/
backupRouter.post("/", async (_req: Request, res: Response) => {
try {
const filename = await createBackup("manual");
const backups = await listBackups();
const backup = backups.find((b) => b.filename === filename);
if (!backup) {
throw new Error("Backup was created but not found in list");
}
res.json({
success: true,
data: backup,
});
} catch (error) {
const message = error instanceof Error ? error.message : "Unknown error";
logger.error("Failed to create backup", error);
res.status(500).json({ success: false, error: message });
}
});
/**
* DELETE /api/backups/:filename - Delete a specific backup
*/
backupRouter.delete("/:filename", async (req: Request, res: Response) => {
try {
const { filename } = req.params;
if (!filename) {
res.status(400).json({
success: false,
error: "Filename is required",
});
return;
}
await deleteBackup(filename);
res.json({
success: true,
message: `Backup ${filename} deleted successfully`,
});
} catch (error) {
const message = error instanceof Error ? error.message : "Unknown error";
logger.error("Failed to delete backup", {
filename: req.params.filename,
error,
});
if (message.includes("not found")) {
res.status(404).json({ success: false, error: message });
} else if (message.includes("Invalid")) {
res.status(400).json({ success: false, error: message });
} else {
res.status(500).json({ success: false, error: message });
}
}
});