refactor: use services in routes plz

This commit is contained in:
Julien Froidefond
2025-08-25 08:38:56 +02:00
parent dc06f00342
commit a5e5a75561
8 changed files with 757 additions and 412 deletions

View File

@@ -186,6 +186,99 @@ export class UserService {
client.release();
}
}
/**
* Delete user for admin
*/
static async deleteUserForAdmin(
userId: string
): Promise<{ firstName: string; lastName: string }> {
const pool = getPool();
const client = await pool.connect();
try {
await client.query("BEGIN");
// Vérifier que l'utilisateur existe
const userCheck = await client.query(
"SELECT uuid_id, first_name, last_name, team_id FROM users WHERE uuid_id = $1",
[userId]
);
if (userCheck.rows.length === 0) {
throw new Error("Utilisateur non trouvé");
}
const user = userCheck.rows[0];
// Vérifier que l'utilisateur n'est pas dans une équipe
if (user.team_id) {
throw new Error(
"Impossible de supprimer un utilisateur qui appartient à une équipe. Retirez-le d'abord de son équipe."
);
}
// Supprimer l'utilisateur (les évaluations par skills seront supprimées automatiquement grâce aux contraintes CASCADE)
await client.query("DELETE FROM users WHERE uuid_id = $1", [userId]);
await client.query("COMMIT");
return {
firstName: user.first_name,
lastName: user.last_name,
};
} catch (error) {
await client.query("ROLLBACK");
throw error;
} finally {
client.release();
}
}
/**
* Get all users with team info and evaluations status for admin
*/
static async getAllUsersForAdmin(): Promise<
Array<{
uuid: string;
firstName: string;
lastName: string;
teamName: string | null;
hasEvaluations: boolean;
}>
> {
const pool = getPool();
const query = `
SELECT
u.uuid_id,
u.first_name,
u.last_name,
t.name as team_name,
CASE
WHEN ue.id IS NOT NULL THEN true
ELSE false
END as has_evaluations
FROM users u
LEFT JOIN teams t ON u.team_id = t.id
LEFT JOIN user_evaluations ue ON u.uuid_id = ue.user_uuid
ORDER BY u.first_name, u.last_name
`;
try {
const result = await pool.query(query);
return result.rows.map((row) => ({
uuid: row.uuid_id,
firstName: row.first_name,
lastName: row.last_name,
teamName: row.team_name,
hasEvaluations: row.has_evaluations,
}));
} catch (error) {
console.error("Error fetching users:", error);
throw new Error("Failed to fetch users");
}
}
}
// Instance singleton