- 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.
111 lines
2.9 KiB
TypeScript
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 }
|
|
);
|
|
}
|
|
}
|