diff --git a/routes/admin/notification.ts b/routes/admin/notification.ts new file mode 100644 index 0000000..e95b988 --- /dev/null +++ b/routes/admin/notification.ts @@ -0,0 +1,31 @@ +import Logger from "@/log/logger"; +import Status from "@/models/status"; +import SocketIO from "@/socket/socket"; +import { NextFunction, Request, Response } from "express"; +import { z } from "zod"; + +const body = z.object({ + title: z.string(), + message: z.string(), + iconUrl: z.string().optional() +}); + +export default async function Route_Admin_Notification(req: Request, res: Response, next: NextFunction) { + const bodyPayload = body.safeParse(req.body); + + if (!bodyPayload.success) { + return Status.send(req, next, { + status: 400, + error: "errors.validation" + }); + } + + Logger.info( + `Route_Admin_Notification | Dispatching notification: ${bodyPayload.data.title} - ${bodyPayload.data.message}` + ); + SocketIO.sendRawNotification(bodyPayload.data.title, bodyPayload.data.message, bodyPayload.data.iconUrl); + + return Status.send(req, next, { + status: 204 + }); +} diff --git a/routes/admin/router.ts b/routes/admin/router.ts index a5db33b..32c5da9 100644 --- a/routes/admin/router.ts +++ b/routes/admin/router.ts @@ -4,6 +4,7 @@ import { Router } from "express"; import adminChallengesRouter from "./challenges/router"; import adminClubsRouter from "./clubs/router"; import adminGrantersRouter from "./granters/router"; +import Route_Admin_Notification from "./notification"; const adminRouter = Router(); @@ -13,4 +14,6 @@ adminRouter.use("/clubs", adminClubsRouter); adminRouter.use("/challenges", adminChallengesRouter); adminRouter.use("/granters", adminGrantersRouter); +adminRouter.post("/notification", Route_Admin_Notification); + export default adminRouter;