import { apiService } from './api'; import type { User, UserRole } from '../types/auth'; interface CreateUserRequest { email: string; nom: string; prenom: string; role: UserRole; entreprise?: string; siret?: string; secteurActivite?: string; } interface UpdateUserRequest { nom?: string; prenom?: string; entreprise?: string; siret?: string; secteurActivite?: string; actif?: boolean; } interface UserStats { totalUsers: number; activeUsers: number; pendingUsers: number; usersByRole: Record; recentActivity: UserActivity[]; } interface UserActivity { userId: string; userName: string; action: string; timestamp: string; details?: string; } class UserService { /** * Récupérer tous les utilisateurs */ async getAllUsers(): Promise { try { const response = await apiService.api.get('/users'); return response.data; } catch (error) { console.error('Erreur lors de la récupération des utilisateurs:', error); // Retourner des données mockées en attendant l'API return this.getMockUsers(); } } /** * Récupérer un utilisateur par ID */ async getUserById(id: string): Promise { try { const response = await apiService.api.get(`/users/${id}`); return response.data; } catch (error) { console.error('Erreur lors de la récupération de l\'utilisateur:', error); throw error; } } /** * Créer un nouvel utilisateur */ async createUser(userData: CreateUserRequest): Promise { try { const response = await apiService.api.post('/users', userData); return response.data; } catch (error) { console.error('Erreur lors de la création de l\'utilisateur:', error); throw error; } } /** * Mettre à jour un utilisateur */ async updateUser(id: string, userData: UpdateUserRequest): Promise { try { const response = await apiService.api.put(`/users/${id}`, userData); return response.data; } catch (error) { console.error('Erreur lors de la mise à jour de l\'utilisateur:', error); throw error; } } /** * Supprimer un utilisateur */ async deleteUser(id: string): Promise { try { await apiService.api.delete(`/users/${id}`); } catch (error) { console.error('Erreur lors de la suppression de l\'utilisateur:', error); throw error; } } /** * Récupérer les gestionnaires de projet */ async getGestionnaires(): Promise { try { const response = await apiService.api.get('/users/gestionnaires'); return response.data; } catch (error) { console.error('Erreur lors de la récupération des gestionnaires:', error); // Retourner des données mockées return this.getMockGestionnaires(); } } /** * Récupérer les statistiques utilisateurs */ async getUserStats(): Promise { try { const response = await apiService.api.get('/users/stats'); return response.data; } catch (error) { console.error('Erreur lors de la récupération des statistiques:', error); return this.getMockUserStats(); } } /** * Récupérer l'activité récente des utilisateurs */ async getUserActivity(): Promise { try { const response = await apiService.api.get('/users/activity'); return response.data; } catch (error) { console.error('Erreur lors de la récupération de l\'activité:', error); return this.getMockUserActivity(); } } /** * Données mockées pour les utilisateurs */ private getMockUsers(): User[] { return [ { id: 'admin-1', email: 'admin@btpxpress.com', nom: 'Administrateur', prenom: 'Système', role: UserRole.ADMIN, actif: true, status: 'APPROVED' as any, entreprise: 'BTP Xpress', dateCreation: '2024-01-01T00:00:00Z' }, { id: 'manager-1', email: 'manager@btpxpress.com', nom: 'Dupont', prenom: 'Jean', role: UserRole.MANAGER, actif: true, status: 'APPROVED' as any, entreprise: 'BTP Xpress', dateCreation: '2024-01-15T00:00:00Z' }, { id: 'gest-1', email: 'john.doe@btpxpress.com', nom: 'Doe', prenom: 'John', role: UserRole.GESTIONNAIRE_PROJET, actif: true, status: 'APPROVED' as any, entreprise: 'BTP Xpress', dateCreation: '2024-02-01T00:00:00Z', clientsAttribues: ['client-1', 'client-2'] }, { id: 'gest-2', email: 'marie.martin@btpxpress.com', nom: 'Martin', prenom: 'Marie', role: UserRole.GESTIONNAIRE_PROJET, actif: true, status: 'APPROVED' as any, entreprise: 'BTP Xpress', dateCreation: '2024-02-15T00:00:00Z', clientsAttribues: ['client-3'] }, { id: 'client-1', email: 'client1@example.com', nom: 'Dupont', prenom: 'Pierre', role: UserRole.CLIENT, actif: true, status: 'APPROVED' as any, dateCreation: '2024-03-01T00:00:00Z', clientId: 'client-1' } ]; } /** * Données mockées pour les gestionnaires */ private getMockGestionnaires(): User[] { return this.getMockUsers().filter(user => user.role === UserRole.GESTIONNAIRE_PROJET); } /** * Statistiques mockées */ private getMockUserStats(): UserStats { const users = this.getMockUsers(); return { totalUsers: users.length, activeUsers: users.filter(u => u.actif).length, pendingUsers: users.filter(u => u.status === 'PENDING').length, usersByRole: { [UserRole.ADMIN]: users.filter(u => u.role === UserRole.ADMIN).length, [UserRole.MANAGER]: users.filter(u => u.role === UserRole.MANAGER).length, [UserRole.GESTIONNAIRE_PROJET]: users.filter(u => u.role === UserRole.GESTIONNAIRE_PROJET).length, [UserRole.CHEF_CHANTIER]: users.filter(u => u.role === UserRole.CHEF_CHANTIER).length, [UserRole.OUVRIER]: users.filter(u => u.role === UserRole.OUVRIER).length, [UserRole.COMPTABLE]: users.filter(u => u.role === UserRole.COMPTABLE).length, [UserRole.CLIENT]: users.filter(u => u.role === UserRole.CLIENT).length }, recentActivity: this.getMockUserActivity() }; } /** * Activité mockée */ private getMockUserActivity(): UserActivity[] { return [ { userId: 'gest-1', userName: 'John Doe', action: 'Connexion', timestamp: new Date(Date.now() - 1000 * 60 * 30).toISOString(), details: 'Dashboard gestionnaire' }, { userId: 'client-1', userName: 'Pierre Dupont', action: 'Consultation projet', timestamp: new Date(Date.now() - 1000 * 60 * 60).toISOString(), details: 'Extension maison individuelle' }, { userId: 'manager-1', userName: 'Jean Dupont', action: 'Attribution client', timestamp: new Date(Date.now() - 1000 * 60 * 60 * 2).toISOString(), details: 'Client attribué à Marie Martin' } ]; } } export default new UserService();