callApi<T> method

Future<ApiResponse<T>> callApi<T>(
  1. String endPoint,
  2. ApiMethod method, {
  3. Object? body,
  4. String? token,
  5. Map<String, String>? additionalHeaders,
  6. Map<String, String>? queryParams,
})

Implementation

Future<ApiResponse<T>> callApi<T>(
  String endPoint,
  ApiMethod method, {
  Object? body,
  String? token,
  Map<String, String>? additionalHeaders,
  Map<String, String>? queryParams,
}) async {
  Uri parsedEndpoint = Uri.parse(endPoint);

  if (queryParams != null) {
    parsedEndpoint = parsedEndpoint.replace(
      queryParameters: {...parsedEndpoint.queryParameters, ...queryParams},
    );
  }

  Map<String, String> headers = _defaultHeaders(token);
  if (additionalHeaders != null) {
    headers.addAll(additionalHeaders);
  }

  try {
    late http.Response response;

    _logger.info("Request: $method $parsedEndpoint");
    _logger.info("Headers: $headers");
    if (body != null) {
      _logger.info("Request Body: ${jsonEncode(body)}");
    }

    switch (method) {
      case ApiMethod.get:
        response = await _secureClient.get(parsedEndpoint, headers: headers);
        break;
      case ApiMethod.post:
        response = await _secureClient.post(
          parsedEndpoint,
          body: jsonEncode(body),
          headers: headers,
        );
        break;
      case ApiMethod.put:
        response = await _secureClient.put(
          parsedEndpoint,
          body: jsonEncode(body),
          headers: headers,
        );
        break;
      case ApiMethod.patch:
        response = await _secureClient.patch(
          parsedEndpoint,
          body: jsonEncode(body),
          headers: headers,
        );
        break;
      case ApiMethod.delete:
        response = await _secureClient.delete(
          parsedEndpoint,
          body: jsonEncode(body),
          headers: headers,
        );
        break;
    }

    _logger.info("Response Status: ${response.statusCode}");
    _logger.info("Response Body: ${response.body}");

    var decoded = customJsonDecode<T>(response);
    return ApiResponse.fromJson(decoded, response.statusCode);
  } catch (err) {
    _logger.severe("API call failed: $err");
    return ApiResponse(data: err.toString() as T);
  }
}