102 lines
2.1 KiB
TypeScript
102 lines
2.1 KiB
TypeScript
import { ConnectedAircraft, Mission, prisma } from "@repo/db";
|
|
import { io } from "index";
|
|
import { sendNtfyMission } from "modules/ntfy";
|
|
|
|
export const sendAlert = async (
|
|
id: number,
|
|
{
|
|
stationId,
|
|
}: {
|
|
stationId?: number;
|
|
},
|
|
): Promise<{
|
|
connectedAircrafts: ConnectedAircraft[];
|
|
mission: Mission;
|
|
}> => {
|
|
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) {
|
|
console.log(`Sending mission to: station:${aircraft.stationId}`);
|
|
io.to(`station:${aircraft.stationId}`).emit("mission-alert", {
|
|
...mission,
|
|
Stations,
|
|
});
|
|
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,
|
|
userId: aircraft.userId,
|
|
stationId: aircraft.stationId,
|
|
},
|
|
});
|
|
if (!existingMissionOnStationUser)
|
|
await prisma.missionOnStationUsers.create({
|
|
data: {
|
|
missionId: mission.id,
|
|
userId: aircraft.userId,
|
|
stationId: aircraft.stationId,
|
|
},
|
|
});
|
|
}
|
|
|
|
// for statistics only
|
|
await prisma.missionsOnStations
|
|
.createMany({
|
|
data: mission.missionStationIds.map((stationId) => ({
|
|
missionId: mission.id,
|
|
stationId,
|
|
})),
|
|
})
|
|
.catch(() => {
|
|
// Ignore if the entry already exists
|
|
});
|
|
|
|
await prisma.mission.update({
|
|
where: { id: Number(id) },
|
|
data: {
|
|
state: "running",
|
|
},
|
|
});
|
|
return { connectedAircrafts, mission };
|
|
};
|