diff --git a/apps/dispatch-server/modules/mission.ts b/apps/dispatch-server/modules/mission.ts index d74ba882..d17a5c3d 100644 --- a/apps/dispatch-server/modules/mission.ts +++ b/apps/dispatch-server/modules/mission.ts @@ -1,4 +1,4 @@ -import { ConnectedAircraft, Mission, prisma } from "@repo/db"; +import { ConnectedAircraft, getPublicUser, Mission, prisma, User } from "@repo/db"; import { io } from "index"; import { sendNtfyMission } from "modules/ntfy"; @@ -9,6 +9,7 @@ export const sendAlert = async ( }: { stationId?: number; }, + user: User, ): Promise<{ connectedAircrafts: ConnectedAircraft[]; mission: Mission; @@ -44,7 +45,6 @@ export const sendAlert = async ( }); for (const aircraft of connectedAircrafts) { - console.log(`Sending mission to: station:${aircraft.stationId}`); io.to(`station:${aircraft.stationId}`).emit("mission-alert", { ...mission, Stations, @@ -54,21 +54,15 @@ export const sendAlert = async ( }); if (!user) continue; if (user.settingsNtfyRoom) { - await sendNtfyMission( - mission, - Stations, - aircraft.Station, - user.settingsNtfyRoom, - ); + await sendNtfyMission(mission, Stations, aircraft.Station, user.settingsNtfyRoom); } - const existingMissionOnStationUser = - await prisma.missionOnStationUsers.findFirst({ - where: { - missionId: mission.id, - userId: aircraft.userId, - stationId: aircraft.stationId, - }, - }); + const existingMissionOnStationUser = await prisma.missionOnStationUsers.findFirst({ + where: { + missionId: mission.id, + userId: aircraft.userId, + stationId: aircraft.stationId, + }, + }); if (!existingMissionOnStationUser) await prisma.missionOnStationUsers.create({ data: { @@ -95,6 +89,17 @@ export const sendAlert = async ( where: { id: Number(id) }, data: { state: "running", + missionLog: { + push: { + type: "alert-log", + auto: false, + timeStamp: new Date().toISOString(), + data: { + stationId: stationId, + user: getPublicUser(user, { ignorePrivacy: true }), + }, + } as any, + }, }, }); return { connectedAircrafts, mission }; diff --git a/apps/dispatch-server/routes/mission.ts b/apps/dispatch-server/routes/mission.ts index 11785685..00198812 100644 --- a/apps/dispatch-server/routes/mission.ts +++ b/apps/dispatch-server/routes/mission.ts @@ -1,5 +1,7 @@ import { + getPublicUser, HpgValidationState, + MissionAlertLog, MissionSdsLog, MissionStationLog, NotificationPayload, @@ -119,6 +121,11 @@ router.post("/:id/send-alert", async (req, res) => { vehicleName?: "ambulance" | "police" | "firebrigade"; }; + if (!req.user) { + res.status(401).json({ error: "Unauthorized" }); + return; + } + try { if (vehicleName) { const hpgAircrafts = await prisma.connectedAircraft.findMany({ @@ -137,6 +144,17 @@ router.post("/:id/send-alert", async (req, res) => { hpgAmbulanceState: vehicleName === "ambulance" ? "DISPATCHED" : undefined, hpgFireEngineState: vehicleName === "firebrigade" ? "DISPATCHED" : undefined, hpgPoliceState: vehicleName === "police" ? "DISPATCHED" : undefined, + missionLog: { + push: { + type: "alert-log", + auto: false, + timeStamp: new Date().toISOString(), + data: { + vehicle: vehicleName, + user: getPublicUser(req.user as User), + }, + } as any, + }, }, }); hpgAircrafts.forEach((aircraft) => { @@ -156,9 +174,13 @@ router.post("/:id/send-alert", async (req, res) => { io.to("dispatchers").emit("update-mission", newMission); return; } - const { connectedAircrafts, mission } = await sendAlert(Number(id), { - stationId, - }); + const { connectedAircrafts, mission } = await sendAlert( + Number(id), + { + stationId, + }, + req.user, + ); res.status(200).json({ message: `Einsatz gesendet (${connectedAircrafts.length} Nutzer) `, @@ -231,7 +253,7 @@ router.post("/:id/validate-hpg", async (req, res) => { return; } res.json({ - message: "HPG validation started", + message: "HPG validierung gestartet", }); io.to(`desktop:${activeAircraftinMission}`).emit( @@ -265,7 +287,8 @@ router.post("/:id/validate-hpg", async (req, res) => { message: `HPG Validierung erfolgreich`, } as NotificationPayload); if (config?.alertWhenValid) { - sendAlert(Number(id), {}); + if (!req.user) return; + sendAlert(Number(id), {}, req.user); } } else { io.to(`user:${req.user?.id}`).emit("notification", { @@ -276,25 +299,6 @@ router.post("/:id/validate-hpg", async (req, res) => { } }, ); - // TODO: remove this after testing - setTimeout(() => { - io.to(`user:${req.user?.id}`).emit("notification", { - type: "hpg-validation", - status: "success", - message: "HPG_BUSY", - data: { - mission, - }, - } as NotificationPayload); - io.to(`user:${req.user?.id}`).emit("notification", { - type: "hpg-validation", - status: "failed", - message: `HPG Validation fehlgeschlagen`, - data: { - mission, - }, - } as NotificationPayload); - }, 5000); } catch (error) { console.error(error); res.json({ error: (error as Error).message || "Failed to validate HPG" }); diff --git a/apps/dispatch/app/_components/map/_components/MissionMarkerTabs.tsx b/apps/dispatch/app/_components/map/_components/MissionMarkerTabs.tsx index 8cd9d939..3219f03a 100644 --- a/apps/dispatch/app/_components/map/_components/MissionMarkerTabs.tsx +++ b/apps/dispatch/app/_components/map/_components/MissionMarkerTabs.tsx @@ -24,6 +24,8 @@ import { HpgState, HpgValidationState, Mission, + MissionAlertLog, + MissionCompletedLog, MissionLog, MissionMessageLog, Prisma, @@ -47,6 +49,7 @@ const Einsatzdetails = ({ mission: Mission; hpgNeedsAttention?: boolean; }) => { + const session = useSession(); const queryClient = useQueryClient(); const deleteMissionMutation = useMutation({ mutationKey: ["missions"], @@ -127,10 +130,21 @@ const Einsatzdetails = ({