import { NextResponse } from "next/server"; import { prisma } from "@/lib/prisma"; import { hasRole } from "@/lib/permissions"; export async function PUT( request: Request, { params }: { params: { id: string } } ) { // Check permissions const permission = await hasRole("club_admin"); if (!permission.allowed) { return NextResponse.json( { error: permission.reason || "Unauthorized" }, { status: 403 } ); } try { const { id } = params; const body = await request.json(); const { email, name, role, playerId } = body; // Check if user exists const existingUser = await prisma.user.findUnique({ where: { id }, }); if (!existingUser) { return NextResponse.json( { error: "User not found" }, { status: 404 } ); } // Update the user const user = await prisma.user.update({ where: { id }, data: { email: email || existingUser.email, name: name !== undefined ? name : existingUser.name, role: role || existingUser.role, playerId: playerId ? parseInt(playerId) : null, }, }); // Update the player's user relation if needed if (playerId !== undefined) { // First, remove user from any existing player if (existingUser.playerId && existingUser.playerId !== parseInt(playerId)) { await prisma.player.update({ where: { id: existingUser.playerId }, data: { user: { disconnect: true } }, }); } // Then, connect user to the new player if (playerId) { await prisma.player.update({ where: { id: parseInt(playerId) }, data: { user: { connect: { id: user.id } } }, }); } } return NextResponse.json({ success: true, user: { id: user.id, email: user.email, name: user.name, role: user.role, playerId: user.playerId, }, }); } catch (error) { console.error("Error updating user:", error); return NextResponse.json( { error: "Failed to update user" }, { status: 500 } ); } } export async function DELETE( request: Request, { params }: { params: { id: string } } ) { // Check permissions - only site_admin can delete users const permission = await hasRole("site_admin"); if (!permission.allowed) { return NextResponse.json( { error: permission.reason || "Unauthorized" }, { status: 403 } ); } try { const { id } = params; // Check if user exists const existingUser = await prisma.user.findUnique({ where: { id }, }); if (!existingUser) { return NextResponse.json( { error: "User not found" }, { status: 404 } ); } // Cannot delete the last site_admin const siteAdminCount = await prisma.user.count({ where: { role: "site_admin" }, }); if (existingUser.role === "site_admin" && siteAdminCount <= 1) { return NextResponse.json( { error: "Cannot delete the last site_admin user" }, { status: 400 } ); } // Remove user from player if associated if (existingUser.playerId) { await prisma.player.update({ where: { id: existingUser.playerId }, data: { user: { disconnect: true } }, }); } // Delete the user await prisma.user.delete({ where: { id }, }); return NextResponse.json({ success: true, message: "User deleted successfully", }); } catch (error) { console.error("Error deleting user:", error); return NextResponse.json( { error: "Failed to delete user" }, { status: 500 } ); } } export async function GET( request: Request, { params }: { params: { id: string } } ) { // Check permissions const permission = await hasRole("club_admin"); if (!permission.allowed) { return NextResponse.json( { error: permission.reason || "Unauthorized" }, { status: 403 } ); } try { const { id } = params; const user = await prisma.user.findUnique({ where: { id }, include: { player: true, }, }); if (!user) { return NextResponse.json( { error: "User not found" }, { status: 404 } ); } return NextResponse.json({ user }); } catch (error) { console.error("Error fetching user:", error); return NextResponse.json( { error: "Failed to fetch user" }, { status: 500 } ); } }