This commit is contained in:
PxlLoewe
2025-07-25 10:04:44 -07:00
parent 54e0bc0b12
commit 1b23aede89
3 changed files with 115 additions and 105 deletions

View File

@@ -14,113 +14,118 @@ export const sendAlert = async (
connectedAircrafts: ConnectedAircraft[]; connectedAircrafts: ConnectedAircraft[];
mission: Mission; mission: Mission;
}> => { }> => {
const mission = await prisma.mission.findUnique({ try {
where: { id: id }, const mission = await prisma.mission.findUnique({
}); where: { id: id },
const Stations = await prisma.station.findMany({
where: {
id: {
in: mission?.missionStationIds,
},
},
});
if (!mission) {
throw new Error("Mission not found");
}
// connectedAircrafts the alert is sent to
const connectedAircrafts = await prisma.connectedAircraft.findMany({
where: {
stationId: stationId
? stationId
: {
in: mission.missionStationIds,
},
logoutTime: null,
},
include: {
Station: true,
},
});
for (const aircraft of connectedAircrafts) {
io.to(`station:${aircraft.stationId}`).emit("mission-alert", {
...mission,
Stations,
}); });
io.to(`desktop:${aircraft.userId}`).emit("mission-alert", { const Stations = await prisma.station.findMany({
missionId: mission.id,
});
const user = await prisma.user.findUnique({
where: { id: aircraft.userId },
});
if (!user) continue;
if (user.settingsNtfyRoom) {
await sendNtfyMission(mission, Stations, aircraft.Station, user.settingsNtfyRoom);
}
const existingMissionOnStationUser = await prisma.missionOnStationUsers.findFirst({
where: { where: {
missionId: mission.id, id: {
userId: aircraft.userId, in: mission?.missionStationIds,
stationId: aircraft.stationId, },
}, },
}); });
if (!existingMissionOnStationUser) if (!mission) {
await prisma.missionOnStationUsers.create({ throw new Error("Mission not found");
data: { }
// connectedAircrafts the alert is sent to
const connectedAircrafts = await prisma.connectedAircraft.findMany({
where: {
stationId: stationId
? stationId
: {
in: mission.missionStationIds,
},
logoutTime: null,
},
include: {
Station: true,
},
});
for (const aircraft of connectedAircrafts) {
io.to(`station:${aircraft.stationId}`).emit("mission-alert", {
...mission,
Stations,
});
io.to(`desktop:${aircraft.userId}`).emit("mission-alert", {
missionId: mission.id,
});
const user = await prisma.user.findUnique({
where: { id: aircraft.userId },
});
if (!user) continue;
if (user.settingsNtfyRoom) {
await sendNtfyMission(mission, Stations, aircraft.Station, user.settingsNtfyRoom);
}
const existingMissionOnStationUser = await prisma.missionOnStationUsers.findFirst({
where: {
missionId: mission.id, missionId: mission.id,
userId: aircraft.userId, userId: aircraft.userId,
stationId: aircraft.stationId, stationId: aircraft.stationId,
}, },
}); });
}
// for statistics only if (!existingMissionOnStationUser)
await prisma.missionsOnStations await prisma.missionOnStationUsers.create({
.createMany({ data: {
data: mission.missionStationIds.map((stationId) => ({ missionId: mission.id,
missionId: mission.id, userId: aircraft.userId,
stationId, stationId: aircraft.stationId,
})), },
}) });
.catch((err) => { }
// Ignore if the entry already exists
}); // for statistics only
if (user === "HPG") { await prisma.missionsOnStations
await prisma.mission.update({ .createMany({
where: { id: Number(id) }, data: mission.missionStationIds.map((stationId) => ({
data: { missionId: mission.id,
state: "running", stationId,
missionLog: { })),
push: { })
type: "alert-log", .catch((err) => {
auto: true, // Ignore if the entry already exists
timeStamp: new Date().toISOString(), });
} as any, if (user === "HPG") {
await prisma.mission.update({
where: { id: Number(id) },
data: {
state: "running",
missionLog: {
push: {
type: "alert-log",
auto: true,
timeStamp: new Date().toISOString(),
} as any,
},
}, },
}, });
}); } else {
} else { await prisma.mission.update({
await prisma.mission.update({ where: { id: Number(id) },
where: { id: Number(id) }, data: {
data: { state: "running",
state: "running", missionLog: {
missionLog: { push: {
push: { type: "alert-log",
type: "alert-log", auto: false,
auto: false, timeStamp: new Date().toISOString(),
timeStamp: new Date().toISOString(), data: {
data: { stationId: stationId,
stationId: stationId, user: getPublicUser(user, { ignorePrivacy: true }),
user: getPublicUser(user, { ignorePrivacy: true }), },
}, } as any,
} as any, },
}, },
}, });
}); }
return { connectedAircrafts, mission };
} catch (error) {
console.error("Error sending mission alert:", error);
throw new Error("Ein Fehler ist aufgetreten. Bitte melde den Fehler als Bug");
} }
return { connectedAircrafts, mission };
}; };

View File

@@ -50,10 +50,7 @@ const getRthCallsigns = (mission: Mission, stations: Station[]) => {
return `🚁 RTH${callsigns.length > 1 ? "s" : ""}: ${callsigns.join(" / ")} `; return `🚁 RTH${callsigns.length > 1 ? "s" : ""}: ${callsigns.join(" / ")} `;
}; };
const getNtfyHeader = ( const getNtfyHeader = (mission: Mission, clientStation: Station): NtfyHeader => ({
mission: Mission,
clientStation: Station,
): NtfyHeader => ({
headers: { headers: {
Title: `${clientStation.bosCallsignShort} / ${mission.missionKeywordAbbreviation} / ${mission.missionKeywordCategory}`, Title: `${clientStation.bosCallsignShort} / ${mission.missionKeywordAbbreviation} / ${mission.missionKeywordCategory}`,
Tags: "pager", Tags: "pager",
@@ -76,9 +73,13 @@ export const sendNtfyMission = async (
clientStation: Station, clientStation: Station,
ntfyRoom: string, ntfyRoom: string,
) => { ) => {
axios.post( try {
`https://ntfy.sh/${ntfyRoom}`, await axios.post(
getNtfyData(mission, stations), `https://ntfy.sh/${ntfyRoom}`,
getNtfyHeader(mission, clientStation), getNtfyData(mission, stations),
); getNtfyHeader(mission, clientStation),
);
} catch (error) {
console.error("Error sending Ntfy mission:", error);
}
}; };

View File

@@ -189,7 +189,11 @@ router.post("/:id/send-alert", async (req, res) => {
return; return;
} catch (error) { } catch (error) {
console.error(error); console.error(error);
res.status(500).json({ error: "Failed to send mission" }); res
.status(500)
.json({
error: `Ein Fehler ist aufgetreten. Bitte melde den Fehler als Bug (${(error as Error).message})`,
});
return; return;
} }
}); });