callApi method

Future<Response> callApi({
  1. required String? endpoint,
  2. required String? method,
  3. Map<String, dynamic> body = const {},
  4. File? file,
  5. int? page,
  6. int? perPage,
  7. bool? isSinaAPI = false,
})

Implementation

Future<http.Response> callApi(
    {required String? endpoint,
    required String? method,
    Map<String, dynamic> body = const {},
    File? file,
    int? page,
    int? perPage,
    bool? isSinaAPI = false}) async {
  final token = AltibbiService.authToken;
  final baseURL = isSinaAPI == true ? AltibbiService.sinaModelEndPointUrl : AltibbiService.url;
  final lang = AltibbiService.lang;
  if (token == null) {
    throw Exception('Token is missing or invalid.');
  }

  final headers = {
    'Content-Type': 'application/json; charset=utf-8',
    'accept-language': lang!
  };

  String? encodedBody;

  Map<String, dynamic> requestBody = Map<String, dynamic>.from(body);

  if (isSinaAPI == true) {
    headers['partner-host'] = AltibbiService.url!;
    headers['partner-user-token'] = token;
  } else {
    headers['Authorization'] = 'Bearer ${token}';
  }

  if (requestBody.isNotEmpty) {
    encodedBody = json.encode(requestBody);
    _log('\n========== REQUEST BODY ==========');
    _log(encodedBody);
    _log('==================================\n');
  }

  Uri url;

  if (method == 'get') {
    final queryParameters = Map.fromEntries(requestBody.entries
        .map((entry) => MapEntry(entry.key, entry.value.toString())));
    if (perPage != null && page != null) {
      queryParameters['per-page'] = perPage.toString();
      queryParameters['page'] = page.toString();
    }

    url = Uri.parse(baseURL!.contains("rest-api") ? baseURL : (isSinaAPI == true ? '$baseURL/$endpoint' : '$baseURL/v1/$endpoint'))
        .replace(queryParameters: queryParameters);
  } else {
    url = Uri.parse(baseURL!.contains("rest-api") ? baseURL : (isSinaAPI == true ? '$baseURL/$endpoint' : '$baseURL/v1/$endpoint'));
    if (method == 'post' && requestBody.containsKey('expand')) {
      final expand = requestBody['expand'];
      url = url.replace(queryParameters: {'expand': expand});
    }
  }
  // Generate and print curl command
  final curlCommand = _generateCurlCommand(
    method: method!,
    url: url,
    headers: headers,
    body: encodedBody,
    file: file,
  );
  _log('\n========== CURL COMMAND ==========');
  final maxChunkSize = 800;
  if (curlCommand.length <= maxChunkSize) {
    _log(curlCommand);
  } else {
    for (int i = 0; i < curlCommand.length; i += maxChunkSize) {
      final end = (i + maxChunkSize < curlCommand.length) ? i + maxChunkSize : curlCommand.length;
      _log(curlCommand.substring(i, end));
    }
  }
  _log('==================================\n');

  http.Response response;

  if (file != null) {
    var request = http.MultipartRequest('POST', url);
    request.headers.addAll(headers);
    request.files.add(await http.MultipartFile.fromPath('file', file.path));
    var streamedResponse = await request.send();
    response = await http.Response.fromStream(streamedResponse);
  } else {
  switch (method) {
    case 'get':
        response = await http.get(url, headers: headers);
        break;
    case 'post':
        response = await http.post(url, headers: headers, body: encodedBody);
        break;
    case 'put':
        response = await http.put(url, headers: headers, body: encodedBody);
        break;
    case 'delete':
        response = await http.delete(url, headers: headers, body: encodedBody);
        break;
    default:
      throw Exception('Invalid method type: $method');
  }
  }

  _log('\n========== RESPONSE ==========');
  _log('Status Code: ${response.statusCode}');
  _log('Headers: ${response.headers}');
  _log('Body: ${response.body}');
  _log('==============================\n');

  return response;
}