import { PositionLog, prisma, User } from "@repo/db"; import { getServerSession } from "api/auth/[...nextauth]/auth"; import { verify } from "jsonwebtoken"; export const PUT = async (req: Request) => { try { const session = await getServerSession(); const token = req.headers.get("authorization")?.split(" ")[1]; if (!token) return Response.json({ message: "Missing token" }, { status: 401 }); const payload = await new Promise((resolve, reject) => { verify(token, process.env.AUTH_HUB_SECRET as string, (err, decoded) => { if (err) { reject(err); } else { resolve(decoded as User); } }); }); if (!session && !payload) return Response.json({ message: "Unauthorized" }, { status: 401 }); const userId = session?.user.id || payload.id; const { position, h145 } = (await req.json()) as { position: PositionLog; h145: boolean; }; if (!position) { return Response.json({ message: "Missing id or position" }); } const activeAircraft = await prisma.connectedAircraft.findFirst({ where: { userId, logoutTime: null, }, orderBy: { loginTime: "desc", }, select: { id: true, posLat: true, posLng: true, }, }); if (!activeAircraft) { return Response.json({ message: "No active aircraft found" }, { status: 200 }); } await prisma.connectedAircraft.update({ where: { id: activeAircraft?.id, }, data: { userId, lastHeartbeat: new Date(), posAlt: position.alt, posLat: position.lat, posLng: position.lng, posHeading: position.heading, posSpeed: position.speed, posH145active: h145, }, }); if (activeAircraft.posLat === position.lat && activeAircraft.posLng === position.lng) { return Response.json({ message: "Position has not changed" }, { status: 200 }); } const positionLog = await prisma.positionLog.create({ data: { ...position, connectedAircraftId: activeAircraft.id, userId, }, }); return Response.json(positionLog); } catch (error) { console.error("Error in PUT /api/position-log:", error); return Response.json({ message: "Internal Server Error" }, { status: 500 }); } };