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.
This commit is contained in:
110
app/api/admin/teams/[teamId]/members/route.ts
Normal file
110
app/api/admin/teams/[teamId]/members/route.ts
Normal file
@@ -0,0 +1,110 @@
|
||||
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 }
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user