mirror of
https://github.com/nicotsx/ironmount.git
synced 2025-12-10 12:10:51 +01:00
* feat: notifications backend & creation * feat: assign notification to backup schedule * refactor: status dot one component * chore(notification-details): remove refetchInterval
252 lines
6.4 KiB
TypeScript
252 lines
6.4 KiB
TypeScript
import { type } from "arktype";
|
|
import { describeRoute, resolver } from "hono-openapi";
|
|
import { NOTIFICATION_TYPES, notificationConfigSchema } from "~/schemas/notifications";
|
|
|
|
/**
|
|
* Notification Destination Schema
|
|
*/
|
|
export const notificationDestinationSchema = type({
|
|
id: "number",
|
|
name: "string",
|
|
enabled: "boolean",
|
|
type: type.valueOf(NOTIFICATION_TYPES),
|
|
config: notificationConfigSchema,
|
|
createdAt: "number",
|
|
updatedAt: "number",
|
|
});
|
|
|
|
export type NotificationDestinationDto = typeof notificationDestinationSchema.infer;
|
|
|
|
/**
|
|
* List all notification destinations
|
|
*/
|
|
export const listDestinationsResponse = notificationDestinationSchema.array();
|
|
export type ListDestinationsDto = typeof listDestinationsResponse.infer;
|
|
|
|
export const listDestinationsDto = describeRoute({
|
|
description: "List all notification destinations",
|
|
tags: ["Notifications"],
|
|
operationId: "listNotificationDestinations",
|
|
responses: {
|
|
200: {
|
|
description: "A list of notification destinations",
|
|
content: {
|
|
"application/json": {
|
|
schema: resolver(listDestinationsResponse),
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
/**
|
|
* Create a new notification destination
|
|
*/
|
|
export const createDestinationBody = type({
|
|
name: "string",
|
|
config: notificationConfigSchema,
|
|
});
|
|
|
|
export const createDestinationResponse = notificationDestinationSchema;
|
|
export type CreateDestinationDto = typeof createDestinationResponse.infer;
|
|
|
|
export const createDestinationDto = describeRoute({
|
|
description: "Create a new notification destination",
|
|
operationId: "createNotificationDestination",
|
|
tags: ["Notifications"],
|
|
responses: {
|
|
201: {
|
|
description: "Notification destination created successfully",
|
|
content: {
|
|
"application/json": {
|
|
schema: resolver(createDestinationResponse),
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
/**
|
|
* Get a single notification destination
|
|
*/
|
|
export const getDestinationResponse = notificationDestinationSchema;
|
|
export type GetDestinationDto = typeof getDestinationResponse.infer;
|
|
|
|
export const getDestinationDto = describeRoute({
|
|
description: "Get a notification destination by ID",
|
|
operationId: "getNotificationDestination",
|
|
tags: ["Notifications"],
|
|
responses: {
|
|
200: {
|
|
description: "Notification destination details",
|
|
content: {
|
|
"application/json": {
|
|
schema: resolver(getDestinationResponse),
|
|
},
|
|
},
|
|
},
|
|
404: {
|
|
description: "Notification destination not found",
|
|
},
|
|
},
|
|
});
|
|
|
|
/**
|
|
* Update a notification destination
|
|
*/
|
|
export const updateDestinationBody = type({
|
|
"name?": "string",
|
|
"enabled?": "boolean",
|
|
"config?": notificationConfigSchema,
|
|
});
|
|
|
|
export const updateDestinationResponse = notificationDestinationSchema;
|
|
export type UpdateDestinationDto = typeof updateDestinationResponse.infer;
|
|
|
|
export const updateDestinationDto = describeRoute({
|
|
description: "Update a notification destination",
|
|
operationId: "updateNotificationDestination",
|
|
tags: ["Notifications"],
|
|
responses: {
|
|
200: {
|
|
description: "Notification destination updated successfully",
|
|
content: {
|
|
"application/json": {
|
|
schema: resolver(updateDestinationResponse),
|
|
},
|
|
},
|
|
},
|
|
404: {
|
|
description: "Notification destination not found",
|
|
},
|
|
},
|
|
});
|
|
|
|
/**
|
|
* Delete a notification destination
|
|
*/
|
|
export const deleteDestinationResponse = type({
|
|
message: "string",
|
|
});
|
|
export type DeleteDestinationDto = typeof deleteDestinationResponse.infer;
|
|
|
|
export const deleteDestinationDto = describeRoute({
|
|
description: "Delete a notification destination",
|
|
operationId: "deleteNotificationDestination",
|
|
tags: ["Notifications"],
|
|
responses: {
|
|
200: {
|
|
description: "Notification destination deleted successfully",
|
|
content: {
|
|
"application/json": {
|
|
schema: resolver(deleteDestinationResponse),
|
|
},
|
|
},
|
|
},
|
|
404: {
|
|
description: "Notification destination not found",
|
|
},
|
|
},
|
|
});
|
|
|
|
/**
|
|
* Test a notification destination
|
|
*/
|
|
export const testDestinationResponse = type({
|
|
success: "boolean",
|
|
});
|
|
export type TestDestinationDto = typeof testDestinationResponse.infer;
|
|
|
|
export const testDestinationDto = describeRoute({
|
|
description: "Test a notification destination by sending a test message",
|
|
operationId: "testNotificationDestination",
|
|
tags: ["Notifications"],
|
|
responses: {
|
|
200: {
|
|
description: "Test notification sent successfully",
|
|
content: {
|
|
"application/json": {
|
|
schema: resolver(testDestinationResponse),
|
|
},
|
|
},
|
|
},
|
|
404: {
|
|
description: "Notification destination not found",
|
|
},
|
|
409: {
|
|
description: "Cannot test disabled destination",
|
|
},
|
|
500: {
|
|
description: "Failed to send test notification",
|
|
},
|
|
},
|
|
});
|
|
|
|
/**
|
|
* Backup Schedule Notification Assignment Schema
|
|
*/
|
|
export const scheduleNotificationAssignmentSchema = type({
|
|
scheduleId: "number",
|
|
destinationId: "number",
|
|
notifyOnStart: "boolean",
|
|
notifyOnSuccess: "boolean",
|
|
notifyOnFailure: "boolean",
|
|
createdAt: "number",
|
|
destination: notificationDestinationSchema,
|
|
});
|
|
|
|
export type ScheduleNotificationAssignmentDto = typeof scheduleNotificationAssignmentSchema.infer;
|
|
|
|
/**
|
|
* Get notifications for a backup schedule
|
|
*/
|
|
export const getScheduleNotificationsResponse = scheduleNotificationAssignmentSchema.array();
|
|
export type GetScheduleNotificationsDto = typeof getScheduleNotificationsResponse.infer;
|
|
|
|
export const getScheduleNotificationsDto = describeRoute({
|
|
description: "Get notification assignments for a backup schedule",
|
|
operationId: "getScheduleNotifications",
|
|
tags: ["Backups", "Notifications"],
|
|
responses: {
|
|
200: {
|
|
description: "List of notification assignments for the schedule",
|
|
content: {
|
|
"application/json": {
|
|
schema: resolver(getScheduleNotificationsResponse),
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|
|
|
|
/**
|
|
* Update notifications for a backup schedule
|
|
*/
|
|
export const updateScheduleNotificationsBody = type({
|
|
assignments: type({
|
|
destinationId: "number",
|
|
notifyOnStart: "boolean",
|
|
notifyOnSuccess: "boolean",
|
|
notifyOnFailure: "boolean",
|
|
}).array(),
|
|
});
|
|
|
|
export const updateScheduleNotificationsResponse = scheduleNotificationAssignmentSchema.array();
|
|
export type UpdateScheduleNotificationsDto = typeof updateScheduleNotificationsResponse.infer;
|
|
|
|
export const updateScheduleNotificationsDto = describeRoute({
|
|
description: "Update notification assignments for a backup schedule",
|
|
operationId: "updateScheduleNotifications",
|
|
tags: ["Backups", "Notifications"],
|
|
responses: {
|
|
200: {
|
|
description: "Notification assignments updated successfully",
|
|
content: {
|
|
"application/json": {
|
|
schema: resolver(updateScheduleNotificationsResponse),
|
|
},
|
|
},
|
|
},
|
|
},
|
|
});
|