request method

Future request({
  1. required String endpoint,
  2. required RequestMethod method,
  3. Map<String, dynamic>? params,
  4. Object? data,
  5. Map<String, String>? headers,
  6. String? contentType,
  7. Duration? cacheDuration,
  8. bool forceRefresh = false,
  9. bool isThirdParty = false,
  10. String? thirdPartyBaseUrl,
  11. String clientName = 'default',
})

General API request handler

Implementation

Future<dynamic> request({
  required String endpoint,
  required RequestMethod method,
  Map<String, dynamic>? params,

  /// either a [Map<String, dynamic>] or a [FormData] instance
  Object? data,
  Map<String, String>? headers,
  String? contentType,
  Duration? cacheDuration,
  bool forceRefresh = false,
  bool isThirdParty = false,
  String? thirdPartyBaseUrl,
  String clientName = 'default',
}) async {
  // Ensure 'data' is either a [Map<String, dynamic>] or a [FormData] instance
  assert(
    data == null || data is Map<String, dynamic> || data is FormData,
    'data must be either Map<String, dynamic> or FormData',
  );
  final String cacheKey = _generateCacheKey(endpoint, params);

  // Use cached data if available
  if (!forceRefresh) {
    var cachedData = _cacheService.getData(cacheKey);
    if (cachedData != null) return cachedData;
  }

  final CancelToken? cancelToken = kIsWeb ? null : CancelToken();
  if (cancelToken != null) {
    _cancelTokens[cacheKey] = cancelToken;
  }

  Dio apiDio;
  if (isThirdParty && thirdPartyBaseUrl != null) {
    apiDio =
        ApiRequest().getThirdPartyDio(thirdPartyBaseUrl, headers: headers);
  } else {
    apiDio = ApiRequest().getNamedDio(clientName);
  }

  try {
    Response response = await _makeRequest(
      apiDio,
      endpoint,
      method,
      params,
      data,
      headers,
      contentType,
      cancelToken,
    );

    dynamic parsedResponse = response.data;
    // dynamic parsedResponse = ApiParser.parseResponse(response);

    // Cache successful response
    if (cacheDuration != null) {
      await _cacheService.storeData(cacheKey, parsedResponse, cacheDuration);
    }

    return parsedResponse;
  } on DioException catch (e) {
    return _handleNetworkError(e);
  } finally {
    if (cancelToken != null) {
      _cancelTokens.remove(cacheKey);
    }
  }
}