aboutsummaryrefslogtreecommitdiffstats
path: root/packages/trpc/routers/backups.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/trpc/routers/backups.ts')
-rw-r--r--packages/trpc/routers/backups.ts54
1 files changed, 54 insertions, 0 deletions
diff --git a/packages/trpc/routers/backups.ts b/packages/trpc/routers/backups.ts
new file mode 100644
index 00000000..7a7a9896
--- /dev/null
+++ b/packages/trpc/routers/backups.ts
@@ -0,0 +1,54 @@
+import { z } from "zod";
+
+import { zBackupSchema } from "@karakeep/shared/types/backups";
+
+import { authedProcedure, createRateLimitMiddleware, router } from "../index";
+import { Backup } from "../models/backups";
+
+export const backupsAppRouter = router({
+ list: authedProcedure
+ .output(z.object({ backups: z.array(zBackupSchema) }))
+ .query(async ({ ctx }) => {
+ const backups = await Backup.getAll(ctx);
+ return { backups: backups.map((b) => b.asPublic()) };
+ }),
+
+ get: authedProcedure
+ .input(
+ z.object({
+ backupId: z.string(),
+ }),
+ )
+ .output(zBackupSchema)
+ .query(async ({ ctx, input }) => {
+ const backup = await Backup.fromId(ctx, input.backupId);
+ return backup.asPublic();
+ }),
+
+ delete: authedProcedure
+ .input(
+ z.object({
+ backupId: z.string(),
+ }),
+ )
+ .mutation(async ({ input, ctx }) => {
+ const backup = await Backup.fromId(ctx, input.backupId);
+ await backup.delete();
+ }),
+
+ triggerBackup: authedProcedure
+ .use(
+ createRateLimitMiddleware({
+ name: "backups.triggerBackup",
+ windowMs: 60 * 60 * 1000, // 1 hour window
+ maxRequests: 5, // Max 5 backup triggers per hour
+ }),
+ )
+ .output(zBackupSchema)
+ .mutation(async ({ ctx }) => {
+ const backup = await Backup.create(ctx);
+ await backup.triggerBackgroundJob();
+
+ return backup.asPublic();
+ }),
+});