From ee49bdde89b75bdca62d0d7e4c430041e638c79d Mon Sep 17 00:00:00 2001 From: PxlLoewe <72106766+PxlLoewe@users.noreply.github.com> Date: Tue, 29 Apr 2025 21:35:27 -0700 Subject: [PATCH] dev --- .../socket-events/connect-dispatch.ts | 41 +++++++++++-------- .../_store/{chatStore.ts => leftMenuStore.ts} | 8 +++- apps/dispatch/app/api/mission/route.ts | 24 ----------- .../app/dispatch/_components/left/Chat.tsx | 24 +++++++---- .../app/dispatch/_components/left/Report.tsx | 39 +++++++++++------- .../app/pilot/_components/navbar/Chat.tsx | 4 +- apps/hub-server/routes/mail.ts | 1 - apps/hub/app/(app)/admin/report/actions.ts | 6 +-- ...atch.prisma => connectedDispatcher.prisma} | 2 +- packages/database/prisma/schema/report.prisma | 14 +++++++ .../prisma/schema/reportMessage.prisma | 12 ------ packages/database/prisma/schema/user.prisma | 10 ++--- 12 files changed, 93 insertions(+), 92 deletions(-) rename apps/dispatch/app/_store/{chatStore.ts => leftMenuStore.ts} (90%) delete mode 100644 apps/dispatch/app/api/mission/route.ts rename packages/database/prisma/schema/{connectedDispatch.prisma => connectedDispatcher.prisma} (92%) create mode 100644 packages/database/prisma/schema/report.prisma delete mode 100644 packages/database/prisma/schema/reportMessage.prisma diff --git a/apps/dispatch-server/socket-events/connect-dispatch.ts b/apps/dispatch-server/socket-events/connect-dispatch.ts index ffbda74a..8c5b7b81 100644 --- a/apps/dispatch-server/socket-events/connect-dispatch.ts +++ b/apps/dispatch-server/socket-events/connect-dispatch.ts @@ -1,3 +1,4 @@ +import { prisma } from "@repo/db"; import { pubClient } from "modules/redis"; import { Server, Socket } from "socket.io"; @@ -11,15 +12,20 @@ export const handleConnectDispatch = selectedZone: string; }) => { const userId = socket.data.user.id; // User ID aus dem JWT-Token - const name = `${socket.data.user.firstname} ${socket.data.user.lastname[0]}. - ${socket.data.user.publicId}`; console.log("User connected to dispatch server"); - await pubClient.json.set(`Dispatcher:${userId}`, "$", { - logoffTime, - name, - loginTime: new Date().toISOString(), - lastSeen: new Date().toISOString(), - selectedZone, - socketId: socket.id, + const user = await prisma.user.findUnique({ + where: { + id: userId, + }, + }); + const connectedDispatcherEntry = await prisma.connectedDispatcher.create({ + data: { + publicUser: {}, + esimatedLogoutTime: logoffTime, + lastHeartbeat: new Date(), + userId: userId, + loginTime: new Date().toISOString(), + }, }); socket.join("dispatchers"); // Dem Dispatcher-Raum beitreten @@ -31,20 +37,21 @@ export const handleConnectDispatch = return await pubClient.json.get(key); }), ); */ + io.to("dispatchers").emit("dispatcher-update"); + io.to("pilots").emit("dispatcher-update"); socket.on("disconnect", async () => { console.log("Disconnected from dispatch server"); - await pubClient.json.del(`Dispatcher:${userId}`); + await prisma.connectedDispatcher.update({ + where: { + id: connectedDispatcherEntry.id, + }, + data: { + logoutTime: new Date().toISOString(), + }, + }); }); socket.on("reconnect", async () => { console.log("Reconnected to dispatch server"); - await pubClient.json.set(`Dispatcher:${userId}`, "$", { - logoffTime, - loginTime: new Date().toISOString(), - lastSeen: new Date().toISOString(), - name, - selectedZone, - socketId: socket.id, - }); }); }; diff --git a/apps/dispatch/app/_store/chatStore.ts b/apps/dispatch/app/_store/leftMenuStore.ts similarity index 90% rename from apps/dispatch/app/_store/chatStore.ts rename to apps/dispatch/app/_store/leftMenuStore.ts index 38a3619a..e3174638 100644 --- a/apps/dispatch/app/_store/chatStore.ts +++ b/apps/dispatch/app/_store/leftMenuStore.ts @@ -3,6 +3,8 @@ import { ChatMessage } from "@repo/db"; import { socket } from "dispatch/socket"; interface ChatStore { + reportTabOpen: boolean; + setReportTabOpen: (open: boolean) => void; ownId: null | string; selectedChat: string | null; chatOpen: boolean; @@ -19,7 +21,9 @@ interface ChatStore { addMessage: (userId: string, message: ChatMessage) => void; } -export const useChatStore = create((set, get) => ({ +export const useLeftMenuStore = create((set, get) => ({ + reportTabOpen: false, + setReportTabOpen: (open: boolean) => set({ reportTabOpen: open }), ownId: null, chatOpen: false, selectedChat: null, @@ -95,7 +99,7 @@ export const useChatStore = create((set, get) => ({ socket.on( "chat-message", ({ userId, message }: { userId: string; message: ChatMessage }) => { - const store = useChatStore.getState(); + const store = useLeftMenuStore.getState(); console.log("chat-message", userId, message); // Update the chat store with the new message store.addMessage(userId, message); diff --git a/apps/dispatch/app/api/mission/route.ts b/apps/dispatch/app/api/mission/route.ts deleted file mode 100644 index 5059e8af..00000000 --- a/apps/dispatch/app/api/mission/route.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Prisma, prisma } from "@repo/db"; -import { NextRequest, NextResponse } from "next/server"; - -export const POST = async (req: NextRequest) => { - console.log(req.body); - const body = await req.json(); - console.log(body); - - const missions = await prisma.mission.findMany({ - where: (body.filter as Prisma.MissionWhereInput) || {}, - }); - - return NextResponse.json(missions); -}; - -export const PUT = async (req: NextRequest) => { - const body = await req.json(); - - const newMission = await prisma.mission.create({ - data: body, - }); - - return NextResponse.json(newMission); -}; diff --git a/apps/dispatch/app/dispatch/_components/left/Chat.tsx b/apps/dispatch/app/dispatch/_components/left/Chat.tsx index 15dd0f62..07c307bb 100644 --- a/apps/dispatch/app/dispatch/_components/left/Chat.tsx +++ b/apps/dispatch/app/dispatch/_components/left/Chat.tsx @@ -1,14 +1,17 @@ "use client"; import { ChatBubbleIcon, PaperPlaneIcon } from "@radix-ui/react-icons"; -import { useChatStore } from "_store/chatStore"; +import { useLeftMenuStore } from "_store/leftMenuStore"; import { useSession } from "next-auth/react"; import { Fragment, useEffect, useRef, useState } from "react"; -import { - Dispatcher, - getDispatcher, -} from "dispatch/_components/navbar/_components/action"; +import { Dispatcher } from "dispatch/_components/navbar/_components/action"; import { cn } from "helpers/cn"; import { useReportStore } from "_store/reportStore"; +import { serverApi } from "helpers/axios"; + +export const getDispatcher = async () => { + const res = await serverApi.get(`/dispatcher`); + return res.data; +}; export const Chat = () => { const { setReportOpen } = useReportStore(); @@ -22,7 +25,7 @@ export const Chat = () => { selectedChat, setSelectedChat, setChatNotification, - } = useChatStore(); + } = useLeftMenuStore(); const [sending, setSending] = useState(false); const session = useSession(); const [addTabValue, setAddTabValue] = useState(""); @@ -33,7 +36,7 @@ export const Chat = () => { useEffect(() => { if (!session.data?.user.id) return; setOwnId(session.data.user.id); - }, [session]); + }, [session, setOwnId]); useEffect(() => { const fetchDispatcher = async () => { @@ -52,7 +55,7 @@ export const Chat = () => { timeout.current = setInterval(() => { fetchDispatcher(); - }, 1000000); + }, 1000); fetchDispatcher(); return () => { @@ -89,6 +92,9 @@ export const Chat = () => { className="dropdown-content card bg-base-200 w-150 shadow-md z-[1100] ml-2 border-1 border-primary" >
+

+ Chat +

{ e.preventDefault(); if (message.length < 1 || !selectedPlayer) return; setSending(true); - sendReport(selectedPlayer, message) + serverApi("/report", { + method: "POST", + data: { + message, + to: selectedPlayer, + }, + }) .then(() => { setMessage(""); setSending(false); diff --git a/apps/dispatch/app/pilot/_components/navbar/Chat.tsx b/apps/dispatch/app/pilot/_components/navbar/Chat.tsx index bf833c60..8d26c9a3 100644 --- a/apps/dispatch/app/pilot/_components/navbar/Chat.tsx +++ b/apps/dispatch/app/pilot/_components/navbar/Chat.tsx @@ -1,6 +1,6 @@ "use client"; import { ChatBubbleIcon, PaperPlaneIcon } from "@radix-ui/react-icons"; -import { useChatStore } from "_store/chatStore"; +import { leftMenuStore } from "_store/leftMenuStore"; import { useSession } from "next-auth/react"; import { Fragment, useEffect, useRef, useState } from "react"; import { @@ -20,7 +20,7 @@ export const Chat = () => { selectedChat, setSelectedChat, setChatNotification, - } = useChatStore(); + } = leftMenuStore(); const [sending, setSending] = useState(false); const session = useSession(); const [addTabValue, setAddTabValue] = useState(""); diff --git a/apps/hub-server/routes/mail.ts b/apps/hub-server/routes/mail.ts index f8a4cb54..2ef4c4b1 100644 --- a/apps/hub-server/routes/mail.ts +++ b/apps/hub-server/routes/mail.ts @@ -5,7 +5,6 @@ import { sendPasswordChanged, sendCourseCompletedEmail } from "modules/mail"; const router = Router(); router.post("/send", async (req, res) => { - console.log(req.body); const { to, subject, html } = req.body; try { diff --git a/apps/hub/app/(app)/admin/report/actions.ts b/apps/hub/app/(app)/admin/report/actions.ts index e4fcc03c..d8aa90ec 100644 --- a/apps/hub/app/(app)/admin/report/actions.ts +++ b/apps/hub/app/(app)/admin/report/actions.ts @@ -2,7 +2,7 @@ import { prisma } from "@repo/db"; export const markAsResolved = async (id: number) => { - await prisma.reportMessage.update({ + await prisma.report.update({ where: { id: id }, data: { erledigt: true }, }); @@ -20,7 +20,7 @@ export const handleMarkAsResolved = async (id: number) => { }; export const getReports = async () => { - return prisma.reportMessage.findMany({ + return prisma.report.findMany({ include: { sender: true, reported: true, @@ -29,7 +29,7 @@ export const getReports = async () => { }; export const fetchReportDetails = async (id: number) => { - return prisma.reportMessage.findUnique({ + return prisma.report.findUnique({ where: { id }, include: { sender: true, reported: true }, }); diff --git a/packages/database/prisma/schema/connectedDispatch.prisma b/packages/database/prisma/schema/connectedDispatcher.prisma similarity index 92% rename from packages/database/prisma/schema/connectedDispatch.prisma rename to packages/database/prisma/schema/connectedDispatcher.prisma index 6e372217..374517f5 100644 --- a/packages/database/prisma/schema/connectedDispatch.prisma +++ b/packages/database/prisma/schema/connectedDispatcher.prisma @@ -1,4 +1,4 @@ -model ConnectedDispatch { +model ConnectedDispatcher { id Int @id @default(autoincrement()) userId String publicUser Json diff --git a/packages/database/prisma/schema/report.prisma b/packages/database/prisma/schema/report.prisma new file mode 100644 index 00000000..01495806 --- /dev/null +++ b/packages/database/prisma/schema/report.prisma @@ -0,0 +1,14 @@ +model Report { + id Int @id @default(autoincrement()) + text String + senderUserId String + reportedUserId String + timestamp DateTime @default(now()) + reviewed Boolean @default(false) + reviewerUserId String? + + // relations: + sender User @relation("SentReports", fields: [senderUserId], references: [id]) + reported User @relation("ReceivedReports", fields: [reportedUserId], references: [id]) + reviewer User? @relation("ReviewedReports", fields: [reviewerUserId], references: [id]) +} diff --git a/packages/database/prisma/schema/reportMessage.prisma b/packages/database/prisma/schema/reportMessage.prisma deleted file mode 100644 index 4564b2e7..00000000 --- a/packages/database/prisma/schema/reportMessage.prisma +++ /dev/null @@ -1,12 +0,0 @@ -model ReportMessage { - id Int @id @default(autoincrement()) - text String - senderId String - reportedId String - timestamp DateTime @default(now()) - erledigt Boolean @default(false) - - // relations: - sender User @relation("SentReports", fields: [senderId], references: [id]) - reported User @relation("ReceivedReports", fields: [reportedId], references: [id]) -} diff --git a/packages/database/prisma/schema/user.prisma b/packages/database/prisma/schema/user.prisma index d9b7e357..270b38cd 100644 --- a/packages/database/prisma/schema/user.prisma +++ b/packages/database/prisma/schema/user.prisma @@ -43,14 +43,12 @@ model User { EventAppointment EventAppointment[] SentMessages ChatMessage[] @relation("SentMessages") ReceivedMessages ChatMessage[] @relation("ReceivedMessages") - SentReports ReportMessage[] @relation("SentReports") - ReceivedReports ReportMessage[] @relation("ReceivedReports") - /** - * Missions Mission[] - */ + SentReports Report[] @relation("SentReports") + ReceivedReports Report[] @relation("ReceivedReports") + ReviewedReports Report[] @relation("ReviewedReports") Mission Mission[] MissionOnStationUsers MissionOnStationUsers[] - ConnectedDispatch ConnectedDispatch[] + ConnectedDispatcher ConnectedDispatcher[] connectedAircraft connectedAircraft[] PositionLog PositionLog[]