diff --git a/apps/discord-server/routes/report.ts b/apps/discord-server/routes/report.ts new file mode 100644 index 00000000..18a53c45 --- /dev/null +++ b/apps/discord-server/routes/report.ts @@ -0,0 +1,67 @@ +import { prisma } from "@repo/db"; +import { Embed, EmbedBuilder } from "discord.js"; +import { Router } from "express"; +import client from "modules/discord"; + +if (!process.env.DISCORD_REPORT_CHANNEL) + throw new Error("DISCORD_REPORT_CHANNEL environment variable is not set."); + +const router: Router = Router(); + +router.post("/admin-embed", async (req, res) => { + const { reportId } = req.body; + if (!reportId) { + res.status(400).json({ error: "reportId is required" }); + return; + } + const report = await prisma.report.findUnique({ + where: { + id: Number(reportId), + }, + include: { + Reported: true, + Sender: true, + }, + }); + + if (!report) { + res.status(404).json({ error: "Report not found" }); + return; + } + + const embed = new EmbedBuilder() + .setTitle(`Report #${report.id}`) + .setURL(`${process.env.NEXT_PUBLIC_HUB_URL}/admin/report/${report.id}`) + .setDescription(report.text) + .addFields( + { + name: "gemeldeter Nutzer", + value: `${report.Reported?.firstname} ${report.Reported?.lastname} (${report.Reported?.publicId})`, + inline: true, + }, + { name: "angemeldet als", value: report.reportedUserRole, inline: true }, + { + name: "gemeldet von", + value: `${report.Sender?.firstname} ${report.Sender?.lastname} (${report.Sender?.publicId})`, + }, + ) + .setFooter({ + text: "", + }) + .setTimestamp(new Date(report.timestamp)) + .setColor("DarkRed"); + + const reportsChannel = await client.channels.fetch(process.env.DISCORD_REPORT_CHANNEL!); + if (!reportsChannel || !reportsChannel.isSendable()) { + res.status(500).json({ error: "Reports channel not found or is not a text channel" }); + return; + } + const message = await reportsChannel.send({ embeds: [embed] }); + message.react("🫡").catch(console.error); + message.react("✅").catch(console.error); + res.json({ + message: "Report embed sent to Discord channel", + }); +}); + +export default router; diff --git a/apps/discord-server/routes/router.ts b/apps/discord-server/routes/router.ts index ea5ee59b..fe42e391 100644 --- a/apps/discord-server/routes/router.ts +++ b/apps/discord-server/routes/router.ts @@ -1,10 +1,12 @@ import { Router } from "express"; import memberRouter from "./member"; import helperRouter from "./helper"; +import reportRouter from "./report"; const router: Router = Router(); router.use("/member", memberRouter); router.use("/helper", helperRouter); +router.use("/report", reportRouter); export default router; diff --git a/apps/dispatch-server/modules/discord.ts b/apps/dispatch-server/modules/discord.ts index 94317358..335d594f 100644 --- a/apps/dispatch-server/modules/discord.ts +++ b/apps/dispatch-server/modules/discord.ts @@ -36,3 +36,13 @@ export const removeRolesFromMember = async (memberId: string, roleIds: string[]) console.error("Error removing roles from member:", error); }); }; + +export const sendReportEmbed = async (reportId: number) => { + discordAxiosClient + .post("/report/admin-embed", { + reportId, + }) + .catch((error) => { + console.error("Error removing roles from member:", error); + }); +}; diff --git a/apps/dispatch-server/routes/report.ts b/apps/dispatch-server/routes/report.ts index 325ffb92..a5861506 100644 --- a/apps/dispatch-server/routes/report.ts +++ b/apps/dispatch-server/routes/report.ts @@ -1,6 +1,7 @@ import { Router } from "express"; import { prisma } from "@repo/db"; +import { sendReportEmbed } from "modules/discord"; const router: Router = Router(); @@ -11,6 +12,9 @@ router.put("/", async (req, res) => { }); // TODO: send link to report on admin page to user + sendReportEmbed(report.id).catch((error) => { + console.error("Error sending report embed to Discord:", error); + }); res.json(report); } catch (error) { diff --git a/apps/dispatch/app/_components/left/Report.tsx b/apps/dispatch/app/_components/left/Report.tsx index 8c62845c..fbc6c793 100644 --- a/apps/dispatch/app/_components/left/Report.tsx +++ b/apps/dispatch/app/_components/left/Report.tsx @@ -109,12 +109,16 @@ export const Report = () => { onClick={(e) => { e.preventDefault(); if (message.length < 1 || !selectedPlayer) return; - const dispatcher = filteredDispatcher?.find((d) => d.userId === selectedPlayer) - ? "Disponent" - : null; - const pilot = filteredAircrafts?.find((a) => a.userId === selectedPlayer) - ? "Pilot" - : null; + const selectedDispatcher = filteredDispatcher?.find( + (d) => d.userId === selectedPlayer, + ); + const dispatcher = selectedDispatcher ? selectedDispatcher.zone : null; + + const selectedAircraft = filteredAircrafts?.find( + (a) => a.userId === selectedPlayer, + ); + const pilot = selectedAircraft ? selectedAircraft.Station.bosCallsignShort : null; + setSending(true); sendReportAPI({ text: message, diff --git a/apps/docs/src/allgemein/var-systeme/v2-changes.md b/apps/docs/src/allgemein/var-systeme/v2-changes.md index c2b78547..e5258d48 100644 --- a/apps/docs/src/allgemein/var-systeme/v2-changes.md +++ b/apps/docs/src/allgemein/var-systeme/v2-changes.md @@ -3,7 +3,7 @@ Was ist neu? Quasi alles. Nicht nur die Leitstelle erhält eine V2, nahezu alle Systeme und Vorgänge wurden überarbeitet. -In diesem Beitrag gehen wir auf die wchtigsten einzelheiten ein. +In diesem Beitrag gehen wir auf die wichtigsten einzelheiten ein. ### Das neue HUB diff --git a/apps/hub/app/(app)/admin/report/_components/form.tsx b/apps/hub/app/(app)/admin/report/_components/form.tsx index 657f4a94..8e5b81f5 100644 --- a/apps/hub/app/(app)/admin/report/_components/form.tsx +++ b/apps/hub/app/(app)/admin/report/_components/form.tsx @@ -25,7 +25,8 @@ export const ReportSenderInfo = ({ return (
- {Reported?.firstname} {Reported?.lastname} ({Reported?.publicId}) + {Reported?.firstname} {Reported?.lastname} ({Reported?.publicId}) als{" "} + {report.reportedUserRole}
{report.text}
{ + const role = row.getValue("reportedUserRole") as string | undefined; + const Icon = role ? (role.startsWith("LST") ? Workflow : Plane) : ShieldQuestion; + return ( + + + {role || "Unbekannt"} + + ); + }, + }, { accessorKey: "Reported", header: "Reported", diff --git a/apps/hub/app/(auth)/passwort-reset/_components/PasswortReset.tsx b/apps/hub/app/(auth)/passwort-reset/_components/PasswortReset.tsx index 2409bf9d..b578310a 100644 --- a/apps/hub/app/(auth)/passwort-reset/_components/PasswortReset.tsx +++ b/apps/hub/app/(auth)/passwort-reset/_components/PasswortReset.tsx @@ -74,8 +74,8 @@ export const PasswortReset = () => { : ""}

- - neues Passwort anfordern + + zum Login