Api client

PHOTO EMBED

Fri Jan 12 2024 09:29:57 GMT+0000 (Coordinated Universal Time)

Saved by @Samuel1347 #flutter #dart

import 'dart:convert';
import 'dart:developer';

import 'package:flutter/foundation.dart';
import 'package:http/http.dart';
import 'package:http/http.dart' as http;

import '../../features/auth/data/datasources/authentication_local_data_source.dart';
import 'api_constants.dart';
import 'api_exceptions.dart';

class ApiClient {
  final AuthenticationLocalDataSource _authenticationLocalDataSource;
  final Client _client;

  ApiClient(this._client, this._authenticationLocalDataSource);

  dynamic get(String path,
      {Map<dynamic, dynamic>? filter,
      bool parse = true,
      Map<String, dynamic>? params}) async {
    String sessionId =
        await _authenticationLocalDataSource.getSessionId() ?? "";

    var paramsString = '';
    if (filter?.isNotEmpty ?? false) {
      filter?.forEach((key, value) {
        paramsString += '&$key=$value';
      });
    }

    final pth =
        Uri.parse('${ApiConstants.baseApiUrl}$path$paramsString').replace(
      queryParameters: params,
    );

    debugPrint("Pth $pth");

    final header = {
      'Authorization': sessionId,
      'Content-Type': 'application/json',
    };

    final response = await _client.get(
      pth, //?format=json
      headers: header,
    );

    // log("Token $sessionId path: ${pth}  header $header Status code: ${response.statusCode}");
    // debugPrint("Get balance $pth status code ${response.statusCode} body ${response.body}");

    if (response.statusCode == 200) {
      if (parse) {
        return json.decode(utf8.decode(response.bodyBytes));
      }
      return response.body;
    } else if (response.statusCode == 400 || response.statusCode == 404) {
      String msg = "unknown_error";
      var resp = jsonDecode(utf8.decode(response.bodyBytes));
      if (resp.containsKey("error")) {
        msg = resp["error"];
      } else if (resp.containsKey("message")) {
        var rsp = resp["message"];
        if (rsp.runtimeType == String) msg = resp["message"];
        if (rsp.runtimeType == List) msg = rsp[0];
      } else {
        msg = utf8
            .decode(response.bodyBytes)
            .replaceAll("[", '')
            .replaceAll("]", '')
            .replaceAll("}", '')
            .replaceAll("{", '')
            .replaceAll("\\", '');
      }
      throw ExceptionWithMessage(msg);
    } else if (response.statusCode == 401) {
      throw UnauthorisedException();
    } else {
      throw Exception(response.reasonPhrase);
    }
  }

  dynamic postPhoto({
    required List<int> fileBytes,
    required String userId,
    required String role,
  }) async {
    String? sessionId = await _authenticationLocalDataSource.getSessionId();

    var headers = {
      'Content-Type': 'multipart/form-data',
    };

    if (sessionId != '') {
      headers.addAll({'Authorization': '$sessionId'});
    }

    var request = http.MultipartRequest(
      'POST',
      Uri.parse(
        "${ApiConstants.baseApiUrl}${ApiConstants.uploads}",
      ),
    );

    final avatar = http.MultipartFile.fromBytes(
      'avatar',
      fileBytes,
      filename: 'avatar.png',
    );
    // Добавляем файл в запрос
    request.files.add(
      avatar,
    );

    // Добавляем параметры в тело запроса
    // request.fields['avatar'] = avatar;
    request.fields['userId'] = userId;
    request.fields['path'] = role;

    request.headers.addAll(headers);

    try {
      final response = await request.send();

      debugPrint("message ${response.request}");
      debugPrint("Status ${response.statusCode}");

      if (response.statusCode == 200) {
        debugPrint(await response.stream.bytesToString());
        return true;
      } else {
        debugPrint(response.reasonPhrase);
        return false;
      }
    } catch (error) {
      debugPrint("Error: $error");
      return false;
    }
  }

  dynamic post(
    String path, {
    Map<dynamic, dynamic>? params,
    bool withToken = true,
  }) async {
    String sessionId =
        await _authenticationLocalDataSource.getSessionId() ?? "";
    Map<String, String> userHeader = {
      "Content-type": "application/json",
      "Accept": "*/*"
    };
    if (kDebugMode) {
      debugPrintThrottled("Request params: $params ");
    }
    if (sessionId != '' && withToken) {
      log("Session != null $sessionId");
      userHeader.addAll({
        'Authorization': ' $sessionId',
      });
    }

    final uri = Uri.parse(ApiConstants.baseApiUrl + path);

    log("Post uri = $uri");
    log("Post header = $userHeader");
    debugPrint("Post body =  ${jsonEncode(params)}");
    final response = await _client.post(
      uri,
      body: jsonEncode(params),
      headers: userHeader,
    );
    if (kDebugMode) {
      debugPrint("API post response: ${response.statusCode} ");
      debugPrint(utf8.decode(response.bodyBytes));
    }

    debugPrint("Response status ${response.statusCode}");
    if (response.statusCode == 200 || response.statusCode == 201) {
      // debugPrint("Everyt thing ok");
      return json.decode(utf8.decode(response.bodyBytes));
    }
    if (response.statusCode == 400 ||
        response.statusCode == 403 ||
        response.statusCode == 405 ||
        response.statusCode == 500 || response.statusCode == 409) {
      String msg = "unknown_error";
      var resp = jsonDecode(utf8.decode(response.bodyBytes));
      if (resp.containsKey("error")) {
        msg = resp["error"];
      } else if (resp.containsKey("message")) {
        var rsp = resp["message"];
        if (rsp.runtimeType == String) msg = resp["message"];
        if (rsp.runtimeType == List) msg = rsp[0];
      } else {
        msg = utf8
            .decode(response.bodyBytes)
            .replaceAll("[", '')
            .replaceAll("]", '')
            .replaceAll("}", '')
            .replaceAll("{", '')
            .replaceAll("\\", '');
      }
      throw ExceptionWithMessage(msg);
    } else if (response.statusCode == 401) {
      throw UnauthorisedException();
    } else if (response.statusCode == 404) {
      throw const ExceptionWithMessage("Not found");
    } else {
      debugPrint("Exception ${response.reasonPhrase}");
      throw Exception(response.reasonPhrase);
    }
  }

  dynamic patch(String path, {Map<dynamic, dynamic>? params}) async {
    String sessionId =
        await _authenticationLocalDataSource.getSessionId() ?? "";
    Map<String, String> userHeader = {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
    };

    if (sessionId != '') {
      userHeader.addAll({'Authorization': sessionId});
    }

    final pth = getPath(path, null);
    debugPrint("Path $pth");
    final response = await _client.patch(
      pth,
      body: jsonEncode(params),
      headers: userHeader,
    );
    if (kDebugMode) {
      debugPrint(utf8.decode(response.bodyBytes));
    }

    debugPrint("Response $path ${response.statusCode}");
    if (response.statusCode == 200 || response.statusCode == 201) {
      // debugPrint("Everyt thing ok");
      return json.decode(utf8.decode(response.bodyBytes));
    }
    if (response.statusCode == 400 ||
        response.statusCode == 403 ||
        response.statusCode == 405) {
      String msg = "unknown_error";
      var resp = jsonDecode(utf8.decode(response.bodyBytes));
      if (resp.containsKey("error")) {
        msg = resp["error"];
      } else if (resp.containsKey("message")) {
        var rsp = resp["message"];
        if (rsp.runtimeType == String) msg = resp["message"];
        if (rsp.runtimeType == List) msg = rsp[0];
      } else {
        msg = utf8
            .decode(response.bodyBytes)
            .replaceAll("[", '')
            .replaceAll("]", '')
            .replaceAll("}", '')
            .replaceAll("{", '')
            .replaceAll("\\", '');
      }
      throw ExceptionWithMessage(msg);
    } else if (response.statusCode == 401) {
      throw UnauthorisedException();
    } else if (response.statusCode == 404) {
      throw const ExceptionWithMessage("Not found");
    } else {
      debugPrint("Exception ${response.reasonPhrase}");
      throw Exception(response.reasonPhrase);
    }
  }

  dynamic deleteWithBody(String path, {Map<dynamic, dynamic>? params}) async {
    String sessionId =
        (await _authenticationLocalDataSource.getSessionId()) ?? "";
    final response = await _client.delete(
      //getPath(path, null),
      Uri.parse('${ApiConstants.baseApiUrl}$path'),

      headers: {
        'Authorization': ' $sessionId',

        // 'Content-Type': 'application/json',
      },
    );

    debugPrint("API delete response code: ${response.statusCode} ");
    debugPrint(utf8.decode(response.bodyBytes));
    if (response.statusCode == 204) {
      return {'success': true};
    } else if (response.statusCode == 200) {
      return {'success': true};
    } else if (response.statusCode == 400 ||
        response.statusCode == 403 ||
        response.statusCode == 402 ||
        response.statusCode == 405) {
      String msg = "unknown_error";
      var resp = jsonDecode(utf8.decode(response.bodyBytes));
      if (resp.containsKey("error")) {
        msg = resp["error"];
      } else if (resp.containsKey("message")) {
        var rsp = resp["message"];
        if (rsp.runtimeType == String) msg = resp["message"];
        if (rsp.runtimeType == List) msg = rsp[0];
      } else {
        msg = utf8
            .decode(response.bodyBytes)
            .replaceAll("[", '')
            .replaceAll("]", '')
            .replaceAll("}", '')
            .replaceAll("{", '')
            .replaceAll("\\", '');
      }
      throw ExceptionWithMessage(msg);
    } else if (response.statusCode == 401) {
      throw UnauthorisedException();
    } else {
      throw Exception(response.reasonPhrase);
    }
  }

  Uri getPath(String path, Map<dynamic, dynamic>? params) {
    var paramsString = '';
    if (params?.isNotEmpty ?? false) {
      params?.forEach((key, value) {
        paramsString += '&$key=$value';
      });
    }

    return Uri.parse('${ApiConstants.baseApiUrl}$path$paramsString');
    // '${ApiConstants.BASE_URL}$path?api_key=${ApiConstants.API_KEY}$paramsString');
  }
}

// ================ DIO ================ //
//
// import 'dart:convert';
// import 'dart:developer';
//
// import 'package:dio/dio.dart';
// import 'package:dio_http_cache/dio_http_cache.dart';
// import 'package:flutter/foundation.dart';
//
// import '../../features/auth/data/datasources/authentication_local_data_source.dart';
// import 'api_constants.dart';
// import 'api_exceptions.dart';
//
// class ApiClient {
//   final AuthenticationLocalDataSource _authenticationLocalDataSource;
//   final Dio _dio;
//
//   ApiClient(this._dio, this._authenticationLocalDataSource) {
//     _dio.interceptors.add(
//       InterceptorsWrapper(
//         onRequest: (options, handler) async {
//           // options.headers.addAll({
//           //   'Content-Type': 'application/json',
//           // });
//           return handler.next(options);
//         },
//       ),
//     );
//
//     _dio.interceptors.add(
//       DioCacheManager(CacheConfig(
//               baseUrl: ApiConstants.baseApiUrl,
//               defaultMaxAge: const Duration(days: 3),
//               defaultMaxStale: const Duration(days: 5)))
//           .interceptor,
//     );
//   }
//
//   Future<dynamic> get(String path,
//       {Map<dynamic, dynamic>? filter,
//       bool parse = true,
//       Map<String, dynamic>? params}) async {
//     try {
//       final sessionToken = await _authenticationLocalDataSource.getSessionId();
//       final header = {
//         'Authorization': sessionToken,
//         'Content-Type': 'application/json',
//       };
//       final response = await _dio.get(path,
//           // queryParameters: params,
//           options: Options(
//             headers: header,
//           ));
//
//       if (response.statusCode == 200) {
//         if (parse) {
//           return json.decode(response.data);
//         }
//         return response.data;
//       } else if (response.statusCode == 400 || response.statusCode == 404) {
//         throw const ExceptionWithMessage("Unknown error");
//       } else if (response.statusCode == 401) {
//         throw UnauthorisedException();
//       } else {
//         throw Exception(response.statusMessage);
//       }
//     } catch (error) {
//       throw Exception("Error: $error");
//     }
//   }
//
//   Future<dynamic> post(String path,
//       {Map<dynamic, dynamic>? params, bool withToken = true}) async {
//     try {
//       String sessionId =
//           await _authenticationLocalDataSource.getSessionId() ?? "";
//       Map<String, String> userHeader = {
//         "Content-type": "application/json",
//         "Accept": "*/*"
//       };
//
//           final uri = ApiConstants.baseApiUrl + path;
//
//       final response = await _dio.post(
//         uri,
//         options: Options(headers: userHeader),
//         data: jsonEncode(params),
//       );
//
//       if (sessionId != '' && withToken) {
//         log("Session != null $sessionId");
//         userHeader.addAll({
//           'Authorization': ' $sessionId',
//         });
//       }
//
//       debugPrint("API post response: ${response.statusCode} ");
//       debugPrint(utf8.decode(response.data));
//       if (response.statusCode == 200 || response.statusCode == 201) {
//         return json.decode(response.data.toString());
//       } else if (response.statusCode == 400 ||
//           response.statusCode == 403 ||
//           response.statusCode == 405 ||
//           response.statusCode == 500 ||
//           response.statusCode == 409) {
//         throw const ExceptionWithMessage("Unknown error");
//       } else if (response.statusCode == 401) {
//         throw UnauthorisedException();
//       } else if (response.statusCode == 404) {
//         throw const ExceptionWithMessage("Not found");
//       } else {
//         throw Exception(response.statusMessage);
//       }
//     } catch (error) {
//       throw Exception("Error: $error");
//     }
//   }
//
//   Future<dynamic> postPhoto({
//     required List<int> fileBytes,
//     required String userId,
//     required String role,
//   }) async {
//     try {
//       final sessionId = await _authenticationLocalDataSource.getSessionId();
//
//       var headers = {
//         'Content-Type': 'multipart/form-data',
//       };
//
//       if (sessionId != '') {
//         headers.addAll({'Authorization': '$sessionId'});
//       }
//
//       var request = FormData.fromMap({
//         'avatar': MultipartFile.fromBytes(
//           fileBytes,
//           filename: 'avatar.png',
//         ),
//         'userId': userId,
//         'path': role,
//       });
//
//       final response = await _dio.post(
//         "${ApiConstants.baseApiUrl}${ApiConstants.uploads}",
//         data: request,
//         options: Options(headers: headers),
//       );
//
//       if (response.statusCode == 200) {
//         return true;
//       } else {
//         return false;
//       }
//     } catch (error) {
//       throw Exception("Error: $error");
//     }
//   }
//
//   // Добавьте другие методы, такие как patch, deleteWithBody, если они используются в вашем коде.
//
//   // ...
//
//   Future<dynamic> patch(String path, {Map<dynamic, dynamic>? params}) async {
//     try {
//       final sessionId = await _authenticationLocalDataSource.getSessionId();
//
//       var userHeader = {
//         'Content-Type': 'application/json',
//         'Accept': '*/*',
//       };
//
//       if (kDebugMode) {
//         debugPrintThrottled("Request params: $params ");
//       }
//
//       if (sessionId != '') {
//         userHeader.addAll({
//           'Authorization': ' $sessionId',
//         });
//       }
//
//       final response = await _dio.patch(
//         ApiConstants.baseApiUrl + path,
//         data: params,
//         options: Options(headers: userHeader),
//       );
//
//       if (response.statusCode == 200 || response.statusCode == 201) {
//         return json.decode(response.toString());
//       } else if (response.statusCode == 400 ||
//           response.statusCode == 403 ||
//           response.statusCode == 405) {
//         throw const ExceptionWithMessage("Unknown error");
//       } else if (response.statusCode == 401) {
//         throw UnauthorisedException();
//       } else if (response.statusCode == 404) {
//         throw const ExceptionWithMessage("Not found");
//       } else {
//         throw Exception(response.statusMessage);
//       }
//     } catch (error) {
//       throw Exception("Error: $error");
//     }
//   }
//
//   Future<dynamic> deleteWithBody(String path,
//       {Map<dynamic, dynamic>? params}) async {
//     try {
//       final sessionId = await _authenticationLocalDataSource.getSessionId();
//
//       final response = await _dio.delete(
//         '${ApiConstants.baseApiUrl}$path',
//         data: params,
//         options: Options(
//           headers: {
//             'Authorization': ' $sessionId',
//           },
//         ),
//       );
//
//       if (response.statusCode == 204 || response.statusCode == 200) {
//         return {'success': true};
//       } else if (response.statusCode == 400 ||
//           response.statusCode == 403 ||
//           response.statusCode == 402 ||
//           response.statusCode == 405) {
//         throw const ExceptionWithMessage("Unknown error");
//       } else if (response.statusCode == 401) {
//         throw UnauthorisedException();
//       } else {
//         throw Exception(response.statusMessage);
//       }
//     } catch (error) {
//       throw Exception("Error: $error");
//     }
//   }
//
//   Uri getPath(String path, Map<dynamic, dynamic>? params) {
//     var paramsString = '';
//     if (params?.isNotEmpty ?? false) {
//       params?.forEach((key, value) {
//         paramsString += '&$key=$value';
//       });
//     }
//
//     return Uri.parse('${ApiConstants.baseApiUrl}$path$paramsString');
//   }
// }
content_copyCOPY