import { Hono } from "hono"; import { validator } from "hono-openapi"; import { createBackupScheduleBody, createBackupScheduleDto, deleteBackupScheduleDto, getBackupScheduleDto, getBackupScheduleForVolumeDto, listBackupSchedulesDto, runBackupNowDto, runForgetDto, stopBackupDto, updateBackupScheduleDto, updateBackupScheduleBody, type CreateBackupScheduleDto, type DeleteBackupScheduleDto, type GetBackupScheduleDto, type GetBackupScheduleForVolumeResponseDto, type ListBackupSchedulesResponseDto, type RunBackupNowDto, type RunForgetDto, type StopBackupDto, type UpdateBackupScheduleDto, } from "./backups.dto"; import { backupsService } from "./backups.service"; import { getScheduleNotificationsDto, updateScheduleNotificationsBody, updateScheduleNotificationsDto, type GetScheduleNotificationsDto, type UpdateScheduleNotificationsDto, } from "../notifications/notifications.dto"; import { notificationsService } from "../notifications/notifications.service"; export const backupScheduleController = new Hono() .get("/", listBackupSchedulesDto, async (c) => { const schedules = await backupsService.listSchedules(); return c.json(schedules, 200); }) .get("/:scheduleId", getBackupScheduleDto, async (c) => { const scheduleId = c.req.param("scheduleId"); const schedule = await backupsService.getSchedule(Number(scheduleId)); return c.json(schedule, 200); }) .get("/volume/:volumeId", getBackupScheduleForVolumeDto, async (c) => { const volumeId = c.req.param("volumeId"); const schedule = await backupsService.getScheduleForVolume(Number(volumeId)); return c.json(schedule, 200); }) .post("/", createBackupScheduleDto, validator("json", createBackupScheduleBody), async (c) => { const body = c.req.valid("json"); const schedule = await backupsService.createSchedule(body); return c.json(schedule, 201); }) .patch("/:scheduleId", updateBackupScheduleDto, validator("json", updateBackupScheduleBody), async (c) => { const scheduleId = c.req.param("scheduleId"); const body = c.req.valid("json"); const schedule = await backupsService.updateSchedule(Number(scheduleId), body); return c.json(schedule, 200); }) .delete("/:scheduleId", deleteBackupScheduleDto, async (c) => { const scheduleId = c.req.param("scheduleId"); await backupsService.deleteSchedule(Number(scheduleId)); return c.json({ success: true }, 200); }) .post("/:scheduleId/run", runBackupNowDto, async (c) => { const scheduleId = c.req.param("scheduleId"); backupsService.executeBackup(Number(scheduleId), true).catch((error) => { console.error("Backup execution failed:", error); }); return c.json({ success: true }, 200); }) .post("/:scheduleId/stop", stopBackupDto, async (c) => { const scheduleId = c.req.param("scheduleId"); await backupsService.stopBackup(Number(scheduleId)); return c.json({ success: true }, 200); }) .post("/:scheduleId/forget", runForgetDto, async (c) => { const scheduleId = c.req.param("scheduleId"); await backupsService.runForget(Number(scheduleId)); return c.json({ success: true }, 200); }) .get("/:scheduleId/notifications", getScheduleNotificationsDto, async (c) => { const scheduleId = Number.parseInt(c.req.param("scheduleId"), 10); const assignments = await notificationsService.getScheduleNotifications(scheduleId); return c.json(assignments, 200); }) .put( "/:scheduleId/notifications", updateScheduleNotificationsDto, validator("json", updateScheduleNotificationsBody), async (c) => { const scheduleId = Number.parseInt(c.req.param("scheduleId"), 10); const body = c.req.valid("json"); const assignments = await notificationsService.updateScheduleNotifications(scheduleId, body.assignments); return c.json(assignments, 200); }, );