diff --git a/apps/mobile/packages/core/lib/core.dart b/apps/mobile/packages/core/lib/core.dart index 317bfcb7..45c7da3f 100644 --- a/apps/mobile/packages/core/lib/core.dart +++ b/apps/mobile/packages/core/lib/core.dart @@ -8,4 +8,4 @@ export 'src/presentation/mixins/bloc_error_handler.dart'; export 'src/presentation/observers/core_bloc_observer.dart'; export 'src/config/app_config.dart'; export 'src/routing/routing.dart'; -export 'src/services/api_service.dart'; +export 'src/services/api_service/api_service.dart'; diff --git a/apps/mobile/packages/core/lib/src/services/api_service.dart b/apps/mobile/packages/core/lib/src/services/api_service/api_service.dart similarity index 97% rename from apps/mobile/packages/core/lib/src/services/api_service.dart rename to apps/mobile/packages/core/lib/src/services/api_service/api_service.dart index 5608b500..5edff474 100644 --- a/apps/mobile/packages/core/lib/src/services/api_service.dart +++ b/apps/mobile/packages/core/lib/src/services/api_service/api_service.dart @@ -5,7 +5,7 @@ import 'package:krow_domain/krow_domain.dart'; /// /// This class provides a wrapper around [Dio]'s methods to handle /// response parsing and error handling in a consistent way. -class ApiService { +class ApiService implements BaseApiService { /// Creates an [ApiService] with the given [Dio] instance. ApiService(this._dio); @@ -13,6 +13,7 @@ class ApiService { final Dio _dio; /// Performs a GET request to the specified [endpoint]. + @override Future get( String endpoint, { Map? params, @@ -29,6 +30,7 @@ class ApiService { } /// Performs a POST request to the specified [endpoint]. + @override Future post( String endpoint, { dynamic data, @@ -47,6 +49,7 @@ class ApiService { } /// Performs a PUT request to the specified [endpoint]. + @override Future put( String endpoint, { dynamic data, @@ -65,6 +68,7 @@ class ApiService { } /// Performs a PATCH request to the specified [endpoint]. + @override Future patch( String endpoint, { dynamic data, diff --git a/apps/mobile/packages/domain/lib/krow_domain.dart b/apps/mobile/packages/domain/lib/krow_domain.dart index ba7940b2..85e5ea91 100644 --- a/apps/mobile/packages/domain/lib/krow_domain.dart +++ b/apps/mobile/packages/domain/lib/krow_domain.dart @@ -7,7 +7,9 @@ library; // Core -export 'src/entities/core/services/api_service/api_response.dart'; +export 'src/core/services/api_services/api_response.dart'; +export 'src/core/services/api_services/base_api_service.dart'; +export 'src/core/services/api_services/base_core_service.dart'; // Users & Membership export 'src/entities/users/user.dart'; diff --git a/apps/mobile/packages/domain/lib/src/entities/core/services/api_service/api_response.dart b/apps/mobile/packages/domain/lib/src/core/services/api_services/api_response.dart similarity index 93% rename from apps/mobile/packages/domain/lib/src/entities/core/services/api_service/api_response.dart rename to apps/mobile/packages/domain/lib/src/core/services/api_services/api_response.dart index ee3ee6f1..3e6a5435 100644 --- a/apps/mobile/packages/domain/lib/src/entities/core/services/api_service/api_response.dart +++ b/apps/mobile/packages/domain/lib/src/core/services/api_services/api_response.dart @@ -18,5 +18,5 @@ class ApiResponse { final dynamic data; /// A map of field-specific error messages, if any. - final Map errors; + final Map errors; } diff --git a/apps/mobile/packages/domain/lib/src/core/services/api_services/base_api_service.dart b/apps/mobile/packages/domain/lib/src/core/services/api_services/base_api_service.dart new file mode 100644 index 00000000..ef9ccef6 --- /dev/null +++ b/apps/mobile/packages/domain/lib/src/core/services/api_services/base_api_service.dart @@ -0,0 +1,30 @@ +import 'api_response.dart'; + +/// Abstract base class for API services. +/// +/// This defines the contract for making HTTP requests. +abstract class BaseApiService { + /// Performs a GET request to the specified [endpoint]. + Future get(String endpoint, {Map? params}); + + /// Performs a POST request to the specified [endpoint]. + Future post( + String endpoint, { + dynamic data, + Map? params, + }); + + /// Performs a PUT request to the specified [endpoint]. + Future put( + String endpoint, { + dynamic data, + Map? params, + }); + + /// Performs a PATCH request to the specified [endpoint]. + Future patch( + String endpoint, { + dynamic data, + Map? params, + }); +} diff --git a/apps/mobile/packages/domain/lib/src/core/services/api_services/base_core_service.dart b/apps/mobile/packages/domain/lib/src/core/services/api_services/base_core_service.dart new file mode 100644 index 00000000..1acda2e3 --- /dev/null +++ b/apps/mobile/packages/domain/lib/src/core/services/api_services/base_core_service.dart @@ -0,0 +1,29 @@ +import 'api_response.dart'; +import 'base_api_service.dart'; + +/// Abstract base class for core business services. +/// +/// This provides a common [action] wrapper for standardized execution +/// and error catching across all core service implementations. +abstract class BaseCoreService { + /// Creates a [BaseCoreService] with the given [api] client. + const BaseCoreService(this.api); + + /// The API client used to perform requests. + final BaseApiService api; + + /// Standardized wrapper to execute API actions. + /// + /// This handles generic error normalization for unexpected non-HTTP errors. + Future action(Future Function() execution) async { + try { + return await execution(); + } catch (e) { + return ApiResponse( + code: 'CORE_INTERNAL_ERROR', + message: e.toString(), + errors: {'exception': e.runtimeType.toString()}, + ); + } + } +}