Files
peakskills/app/api/admin/teams/[teamId]/members/route.ts
Julien Froidefond c0e2b9533b feat: add team members functionality and modal
- Introduced `onViewMembers` prop in `TreeItemRow` to handle viewing team members.
- Added `TeamMembersModal` to display members of a selected team.
- Implemented state management for team members in `TeamsManagement`, including fetching and updating stats.
- Enhanced `AdminManagementService` with methods to fetch and remove team members.
2025-08-22 09:28:52 +02:00

111 lines
2.9 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server";
import { getPool } from "@/services/database";
import { isUserAuthenticated } from "@/lib/server-auth";
// GET - Récupérer les membres d'une équipe
export async function GET(
request: NextRequest,
{ params }: { params: Promise<{ teamId: string }> }
) {
try {
// Vérifier l'authentification
const isAuthenticated = await isUserAuthenticated();
if (!isAuthenticated) {
return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
}
const { teamId } = await params;
if (!teamId) {
return NextResponse.json(
{ error: "L'ID de l'équipe est requis" },
{ status: 400 }
);
}
const pool = getPool();
const query = `
SELECT
u.uuid_id,
u.first_name,
u.last_name,
u.created_at
FROM users u
WHERE u.team_id = $1
ORDER BY u.last_name, u.first_name
`;
const result = await pool.query(query, [teamId]);
const members = result.rows.map((row) => ({
id: row.uuid_id,
firstName: row.first_name,
lastName: row.last_name,
fullName: `${row.first_name} ${row.last_name}`,
joinedAt: row.created_at,
}));
return NextResponse.json(members);
} catch (error) {
console.error("Error fetching team members:", error);
return NextResponse.json(
{ error: "Erreur lors de la récupération des membres" },
{ status: 500 }
);
}
}
// DELETE - Supprimer un membre d'une équipe
export async function DELETE(
request: NextRequest,
{ params }: { params: Promise<{ teamId: string }> }
) {
try {
// Vérifier l'authentification
const isAuthenticated = await isUserAuthenticated();
if (!isAuthenticated) {
return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
}
const { teamId } = await params;
const { memberId } = await request.json();
if (!teamId || !memberId) {
return NextResponse.json(
{ error: "L'ID de l'équipe et l'ID du membre sont requis" },
{ status: 400 }
);
}
const pool = getPool();
// Vérifier que le membre appartient bien à cette équipe
const memberCheck = await pool.query(
"SELECT uuid_id FROM users WHERE uuid_id = $1 AND team_id = $2",
[memberId, teamId]
);
if (memberCheck.rows.length === 0) {
return NextResponse.json(
{ error: "Membre non trouvé dans cette équipe" },
{ status: 404 }
);
}
// Supprimer le membre (mettre team_id à NULL au lieu de supprimer l'utilisateur)
await pool.query("UPDATE users SET team_id = NULL WHERE uuid_id = $1", [
memberId,
]);
return NextResponse.json({
message: "Membre supprimé de l'équipe avec succès",
});
} catch (error) {
console.error("Error removing team member:", error);
return NextResponse.json(
{ error: "Erreur lors de la suppression du membre" },
{ status: 500 }
);
}
}