import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:get/get.dart'; import 'package:logger/logger.dart'; import 'package:marco/model/user_permission.dart'; import 'package:marco/model/employee_info.dart'; import 'package:marco/model/projects_model.dart'; import 'package:marco/helpers/services/storage/local_storage.dart'; import 'package:marco/helpers/services/auth_service.dart'; final Logger logger = Logger(); class PermissionService { static final Map> _userDataCache = {}; static Future> fetchAllUserData(String token, {bool hasRetried = false}) async { // Return from cache if available if (_userDataCache.containsKey(token)) { return _userDataCache[token]!; } try { final response = await http.get( Uri.parse('https://stageapi.marcoaiot.com/api/user/profile'), headers: {'Authorization': 'Bearer $token'}, ); if (response.statusCode == 200) { final data = json.decode(response.body)['data']; final result = { 'permissions': _parsePermissions(data['featurePermissions']), 'employeeInfo': _parseEmployeeInfo(data['employeeInfo']), 'projects': _parseProjectsInfo(data['projects']), }; _userDataCache[token] = result; return result; } if (response.statusCode == 401 && !hasRetried) { final refreshed = await AuthService.refreshToken(); if (refreshed) { final newToken = await LocalStorage.getJwtToken(); if (newToken != null) { return fetchAllUserData(newToken, hasRetried: true); } } await _handleUnauthorized(); throw Exception('Unauthorized. Token refresh failed.'); } final errorMessage = json.decode(response.body)['message'] ?? 'Unknown error'; throw Exception('Failed to load data: $errorMessage'); } catch (e) { logger.e('Error fetching user data: $e'); rethrow; } } static Future _handleUnauthorized() async { await LocalStorage.removeToken('jwt_token'); await LocalStorage.removeToken('refresh_token'); await LocalStorage.setLoggedInUser(false); Get.offAllNamed('/auth/login'); } static List _parsePermissions( List featurePermissions) => featurePermissions .map((id) => UserPermission.fromJson({'id': id})) .toList(); static EmployeeInfo _parseEmployeeInfo(Map employeeData) => EmployeeInfo.fromJson(employeeData); static List _parseProjectsInfo(List projects) => projects.map((proj) => ProjectInfo.fromJson(proj)).toList(); }