feat: add getUserById endpoint for admin user details

Added GET /api/admin/users/:id endpoint to retrieve detailed user
information including contact info, personal data, and ticket statistics.
This enables the admin interface to display comprehensive user details
when clicking the "Détails" button.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
soufiane 2025-11-19 15:07:28 +01:00
parent e72923ec86
commit 86ccc3ef4f
2 changed files with 44 additions and 0 deletions

View File

@ -450,6 +450,48 @@ export const createEmployee = asyncHandler(async (req, res, next) => {
}); });
}); });
/**
* Récupérer un utilisateur par ID
* GET /api/admin/users/:id
*/
export const getUserById = asyncHandler(async (req, res, next) => {
const { id } = req.params;
const result = await pool.query(
`SELECT
u.id,
u.email,
u.first_name,
u.last_name,
u.phone,
u.address,
u.city,
u.postal_code,
u.role,
u.is_verified,
u.created_at,
u.date_of_birth,
u.gender,
COUNT(t.id) as tickets_count,
COUNT(CASE WHEN t.status = 'PENDING' THEN 1 END) as pending_tickets,
COUNT(CASE WHEN t.status = 'CLAIMED' THEN 1 END) as claimed_tickets
FROM users u
LEFT JOIN tickets t ON u.id = t.user_id
WHERE u.id = $1
GROUP BY u.id`,
[id]
);
if (result.rows.length === 0) {
return next(new AppError('Utilisateur non trouvé', 404));
}
res.json({
success: true,
data: result.rows[0],
});
});
/** /**
* Mettre à jour un utilisateur * Mettre à jour un utilisateur
* PUT /api/admin/users/:id * PUT /api/admin/users/:id
@ -812,6 +854,7 @@ export default {
updatePrize, updatePrize,
deletePrize, deletePrize,
getAllUsers, getAllUsers,
getUserById,
createEmployee, createEmployee,
updateUser, updateUser,
deleteUser, deleteUser,

View File

@ -32,6 +32,7 @@ router.delete('/prizes/:id', validate(deletePrizeSchema), adminController.delete
// Gestion des utilisateurs // Gestion des utilisateurs
router.get('/users', validate(paginationSchema), adminController.getAllUsers); router.get('/users', validate(paginationSchema), adminController.getAllUsers);
router.get('/users/:id', adminController.getUserById);
router.post('/employees', validate(createEmployeeSchema), adminController.createEmployee); router.post('/employees', validate(createEmployeeSchema), adminController.createEmployee);
router.put('/users/:id', validate(updateUserSchema), adminController.updateUser); router.put('/users/:id', validate(updateUserSchema), adminController.updateUser);
router.delete('/users/:id', adminController.deleteUser); router.delete('/users/:id', adminController.deleteUser);