diff --git a/lib/helpers/services/tenant_service.dart b/lib/helpers/services/tenant_service.dart index 7e98512..83acfc6 100644 --- a/lib/helpers/services/tenant_service.dart +++ b/lib/helpers/services/tenant_service.dart @@ -1,5 +1,7 @@ import 'dart:convert'; import 'package:http/http.dart' as http; +import 'package:get/get.dart'; +import 'package:marco/controller/project_controller.dart'; import 'package:marco/helpers/services/api_endpoints.dart'; import 'package:marco/helpers/services/storage/local_storage.dart'; @@ -7,7 +9,6 @@ import 'package:marco/helpers/services/app_logger.dart'; import 'package:marco/helpers/services/auth_service.dart'; import 'package:marco/model/tenant/tenant_list_model.dart'; - /// Abstract interface for tenant service functionality abstract class ITenantService { Future>?> getTenants({bool hasRetried = false}); @@ -29,8 +30,6 @@ class TenantService implements ITenantService { currentTenant = tenant; } - - /// Check if tenant is selected static bool get isTenantSelected => currentTenant != null; @@ -44,27 +43,36 @@ class TenantService implements ITenantService { } /// Handle API errors - static void _handleApiError(http.Response response, dynamic data, String context) { + static void _handleApiError( + http.Response response, dynamic data, String context) { final message = data['message'] ?? 'Unknown error'; - final level = response.statusCode >= 500 ? LogLevel.error : LogLevel.warning; - logSafe("❌ $context failed: $message [Status: ${response.statusCode}]", level: level); + final level = + response.statusCode >= 500 ? LogLevel.error : LogLevel.warning; + logSafe("❌ $context failed: $message [Status: ${response.statusCode}]", + level: level); } /// Log exceptions static void _logException(dynamic e, dynamic st, String context) { - logSafe("❌ $context exception", level: LogLevel.error, error: e, stackTrace: st); + logSafe("❌ $context exception", + level: LogLevel.error, error: e, stackTrace: st); } @override - Future>?> getTenants({bool hasRetried = false}) async { + Future>?> getTenants( + {bool hasRetried = false}) async { try { final headers = await _authorizedHeaders(); - logSafe("➡️ GET $_baseUrl/auth/get/user/tenants\nHeaders: $headers", level: LogLevel.info); + logSafe("➡️ GET $_baseUrl/auth/get/user/tenants\nHeaders: $headers", + level: LogLevel.info); - final response = await http.get(Uri.parse("$_baseUrl/auth/get/user/tenants"), headers: headers); + final response = await http + .get(Uri.parse("$_baseUrl/auth/get/user/tenants"), headers: headers); final data = jsonDecode(response.body); - logSafe("⬅️ Response: ${jsonEncode(data)} [Status: ${response.statusCode}]", level: LogLevel.info); + logSafe( + "⬅️ Response: ${jsonEncode(data)} [Status: ${response.statusCode}]", + level: LogLevel.info); if (response.statusCode == 200 && data['success'] == true) { logSafe("✅ Tenants fetched successfully."); @@ -72,10 +80,12 @@ class TenantService implements ITenantService { } if (response.statusCode == 401 && !hasRetried) { - logSafe("⚠️ Unauthorized while fetching tenants. Refreshing token...", level: LogLevel.warning); + logSafe("⚠️ Unauthorized while fetching tenants. Refreshing token...", + level: LogLevel.warning); final refreshed = await AuthService.refreshToken(); if (refreshed) return getTenants(hasRetried: true); - logSafe("❌ Token refresh failed while fetching tenants.", level: LogLevel.error); + logSafe("❌ Token refresh failed while fetching tenants.", + level: LogLevel.error); return null; } @@ -91,7 +101,9 @@ class TenantService implements ITenantService { Future selectTenant(String tenantId, {bool hasRetried = false}) async { try { final headers = await _authorizedHeaders(); - logSafe("➡️ POST $_baseUrl/auth/select-tenant/$tenantId\nHeaders: $headers", level: LogLevel.info); + logSafe( + "➡️ POST $_baseUrl/auth/select-tenant/$tenantId\nHeaders: $headers", + level: LogLevel.info); final response = await http.post( Uri.parse("$_baseUrl/auth/select-tenant/$tenantId"), @@ -99,20 +111,34 @@ class TenantService implements ITenantService { ); final data = jsonDecode(response.body); - logSafe("⬅️ Response: ${jsonEncode(data)} [Status: ${response.statusCode}]", level: LogLevel.info); + logSafe( + "⬅️ Response: ${jsonEncode(data)} [Status: ${response.statusCode}]", + level: LogLevel.info); if (response.statusCode == 200 && data['success'] == true) { await LocalStorage.setJwtToken(data['data']['token']); await LocalStorage.setRefreshToken(data['data']['refreshToken']); logSafe("✅ Tenant selected successfully. Tokens updated."); + + // 🔥 Refresh projects when tenant changes + try { + final projectController = Get.find(); + projectController.clearProjects(); + projectController.fetchProjects(); + } catch (_) { + logSafe("⚠️ ProjectController not found while refreshing projects"); + } + return true; } if (response.statusCode == 401 && !hasRetried) { - logSafe("⚠️ Unauthorized while selecting tenant. Refreshing token...", level: LogLevel.warning); + logSafe("⚠️ Unauthorized while selecting tenant. Refreshing token...", + level: LogLevel.warning); final refreshed = await AuthService.refreshToken(); if (refreshed) return selectTenant(tenantId, hasRetried: true); - logSafe("❌ Token refresh failed while selecting tenant.", level: LogLevel.error); + logSafe("❌ Token refresh failed while selecting tenant.", + level: LogLevel.error); return false; }