96 lines
2.8 KiB
TypeScript
96 lines
2.8 KiB
TypeScript
// src/app/api/user/route.ts
|
|
import { NextResponse, type NextRequest } from 'next/server'
|
|
import { getServerSession } from 'next-auth'
|
|
import { authOptions } from '@/app/lib/auth'
|
|
import { prisma } from '@/app/lib/prisma'
|
|
|
|
export async function GET(req: NextRequest) {
|
|
const session = await getServerSession(authOptions(req))
|
|
const steamId = session?.user?.steamId
|
|
|
|
if (!steamId) {
|
|
return NextResponse.json({ error: 'Nicht eingeloggt' }, { status: 401 })
|
|
}
|
|
|
|
// 1) User + Team (nur skalare Felder + Leader-Relation laden)
|
|
const userRaw = await prisma.user.findUnique({
|
|
where: { steamId },
|
|
select: {
|
|
name: true,
|
|
steamId: true,
|
|
avatar: true,
|
|
premierRank: true,
|
|
isAdmin: true,
|
|
status: true,
|
|
team: {
|
|
select: {
|
|
id: true,
|
|
name: true,
|
|
logo: true,
|
|
leaderId: true,
|
|
leader: {
|
|
select: {
|
|
steamId: true,
|
|
name: true,
|
|
avatar: true,
|
|
},
|
|
},
|
|
activePlayers: true,
|
|
inactivePlayers: true,
|
|
},
|
|
},
|
|
},
|
|
})
|
|
|
|
if (!userRaw) {
|
|
return NextResponse.json({ error: 'User nicht gefunden' }, { status: 404 })
|
|
}
|
|
|
|
// 2) Falls Team vorhanden: active/inactive IDs in User-Objekte auflösen
|
|
let teamResolved: any = null
|
|
if (userRaw.team) {
|
|
const activeIds = userRaw.team.activePlayers ?? []
|
|
const inactiveIds = userRaw.team.inactivePlayers ?? []
|
|
|
|
// findMany mit leeren Arrays ist ok und liefert []
|
|
const [activeUsers, inactiveUsers] = await Promise.all([
|
|
prisma.user.findMany({
|
|
where: { steamId: { in: activeIds } },
|
|
select: { steamId: true, name: true, avatar: true, premierRank: true },
|
|
}),
|
|
prisma.user.findMany({
|
|
where: { steamId: { in: inactiveIds } },
|
|
select: { steamId: true, name: true, avatar: true, premierRank: true },
|
|
}),
|
|
])
|
|
|
|
// Optional: Reihenfolge gemäß IDs beibehalten
|
|
const byId = (ids: string[], users: any[]) => {
|
|
const map = new Map(users.map((u) => [u.steamId, u]))
|
|
return ids.map((id) => map.get(id)).filter(Boolean)
|
|
}
|
|
|
|
teamResolved = {
|
|
id: userRaw.team.id,
|
|
name: userRaw.team.name,
|
|
logo: userRaw.team.logo,
|
|
leader: userRaw.team.leader ?? null,
|
|
activePlayers: byId(activeIds, activeUsers),
|
|
inactivePlayers: byId(inactiveIds, inactiveUsers),
|
|
}
|
|
}
|
|
|
|
// 3) Antwort formen (Team ersetzt durch aufgelöste Struktur)
|
|
const response = {
|
|
name: userRaw.name,
|
|
steamId: userRaw.steamId,
|
|
avatar: userRaw.avatar,
|
|
premierRank: userRaw.premierRank,
|
|
isAdmin: userRaw.isAdmin,
|
|
status: userRaw.status ?? 'offline',
|
|
team: teamResolved,
|
|
}
|
|
|
|
return NextResponse.json(response, { headers: { 'Cache-Control': 'no-store' } })
|
|
}
|