mapDioErrorToSynquillStorageException method

  1. @protected
SynquillStorageException mapDioErrorToSynquillStorageException(
  1. DioException error
)

Maps a DioException to the appropriate SynquillStorageException.

Implementation

@protected
SynquillStorageException mapDioErrorToSynquillStorageException(
  DioException error,
) {
  logger.warning(
    'Mapping DioError: ${error.type}',
    error.error,
    error.stackTrace,
  );
  switch (error.type) {
    case DioExceptionType.connectionTimeout:
    case DioExceptionType.sendTimeout:
    case DioExceptionType.receiveTimeout:
      return NetworkException(
        'Connection timeout: ${error.message ?? "Unknown error"}',
        error.stackTrace,
      );
    case DioExceptionType.badResponse:
      final statusCode = error.response?.statusCode;
      final responseData = error.response?.data;
      final validationErrors = _extractValidationErrors(responseData);

      switch (statusCode) {
        case 400:
          if (validationErrors != null) {
            return ValidationException(
              'Validation failed',
              validationErrors,
              error.stackTrace,
            );
          }
          break;
        case 401:
          return AuthenticationException(
            'Authentication failed: '
            '${error.message ?? "Invalid credentials"}',
            error.stackTrace,
          );
        case 403:
          return AuthorizationException(
            'Authorization failed: '
            '${error.message ?? "Permission denied"}',
            error.stackTrace,
          );
        case 404:
          return ApiExceptionNotFound(
            error.requestOptions.path,
            stackTrace: error.stackTrace,
          );
        case 409:
          return ConflictException(
            'Conflict: ${error.message ?? "Resource conflict"}',
            error.stackTrace,
          );
        case 410:
          return ApiExceptionGone(
            error.requestOptions.path,
            stackTrace: error.stackTrace,
          );
        default:
          if (statusCode != null && statusCode >= 500) {
            return ServerException(
              'Server error: ${error.message ?? "Internal server error"}',
              error.stackTrace,
            );
          }
      }
      return ApiException(
        'API error: ${error.message ?? "Unknown API error"}',
        statusCode: statusCode,
        stackTrace: error.stackTrace,
      );
    case DioExceptionType.connectionError:
      return NetworkException(
        'Connection error: '
        '${error.message ?? "Failed to connect to the server"}',
        error.stackTrace,
      );
    case DioExceptionType.badCertificate:
      return NetworkException(
        'Bad certificate: ${error.message ?? "Invalid SSL certificate"}',
        error.stackTrace,
      );
    case DioExceptionType.cancel:
      return ApiException(
        'Request cancelled: ${error.message ?? "Request was cancelled"}',
        stackTrace: error.stackTrace,
      );
    case DioExceptionType.unknown:
      return ApiException(
        'Unknown API error: '
        '${error.message ?? "An unexpected error occurred"}',
        stackTrace: error.stackTrace,
      );
  }
}