|
|
|
@ -3,14 +3,15 @@ import 'dart:convert';
|
|
|
|
import 'dart:io';
|
|
|
|
import 'dart:io';
|
|
|
|
|
|
|
|
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
import 'package:flutter/foundation.dart';
|
|
|
|
|
|
|
|
import 'package:hmg_patient_app_new/core/app_state.dart';
|
|
|
|
|
|
|
|
import 'package:hmg_patient_app_new/core/consts.dart';
|
|
|
|
|
|
|
|
import 'package:hmg_patient_app_new/core/dependencies.dart';
|
|
|
|
import 'package:hmg_patient_app_new/core/exceptions/api_exception.dart';
|
|
|
|
import 'package:hmg_patient_app_new/core/exceptions/api_exception.dart';
|
|
|
|
|
|
|
|
import 'package:hmg_patient_app_new/core/utils/utils.dart';
|
|
|
|
|
|
|
|
import 'package:hmg_patient_app_new/services/logger_service.dart';
|
|
|
|
import 'package:http/http.dart';
|
|
|
|
import 'package:http/http.dart';
|
|
|
|
import 'package:http/io_client.dart';
|
|
|
|
import 'package:http/io_client.dart';
|
|
|
|
|
|
|
|
|
|
|
|
import '../app_state.dart';
|
|
|
|
|
|
|
|
import '../consts.dart';
|
|
|
|
|
|
|
|
import '../utils/utils.dart';
|
|
|
|
|
|
|
|
import '../../main.dart';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// ignore_for_file: avoid_annotating_with_dynamic
|
|
|
|
// ignore_for_file: avoid_annotating_with_dynamic
|
|
|
|
|
|
|
|
|
|
|
|
@ -31,12 +32,16 @@ class APIError {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
APIException _throwAPIException(Response response, Function retryCallBack) {
|
|
|
|
APIException _throwAPIException(Response response, Function retryCallBack) {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
LoggerService loggerService = getIt.get<LoggerService>();
|
|
|
|
|
|
|
|
|
|
|
|
switch (response.statusCode) {
|
|
|
|
switch (response.statusCode) {
|
|
|
|
case 200:
|
|
|
|
case 200:
|
|
|
|
APIError? apiError;
|
|
|
|
APIError? apiError;
|
|
|
|
if (response.body != null && response.body.isNotEmpty) {
|
|
|
|
if (response.body != null && response.body.isNotEmpty) {
|
|
|
|
var jsonError = jsonDecode(response.body);
|
|
|
|
var jsonError = jsonDecode(response.body);
|
|
|
|
print(jsonError);
|
|
|
|
loggerService.logInfo(jsonError.toString());
|
|
|
|
apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage']);
|
|
|
|
apiError = APIError(jsonError['ErrorCode'], jsonError['ErrorMessage']);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return APIException(APIException.BAD_REQUEST, error: apiError);
|
|
|
|
return APIException(APIException.BAD_REQUEST, error: apiError);
|
|
|
|
@ -75,11 +80,9 @@ abstract class IApiClient {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class ApiClient implements IApiClient {
|
|
|
|
class ApiClient implements IApiClient {
|
|
|
|
// static final ApiClient _instance = ApiClient._internal();
|
|
|
|
LoggerService loggerService;
|
|
|
|
|
|
|
|
|
|
|
|
// ApiClient._internal();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// factory ApiClient() => _instance;
|
|
|
|
ApiClient({required this.loggerService});
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
Future<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject,
|
|
|
|
Future<U> postJsonForObject<T, U>(FactoryConstructor<U> factoryConstructor, String url, T jsonObject,
|
|
|
|
@ -89,18 +92,18 @@ class ApiClient implements IApiClient {
|
|
|
|
_headers.addAll(headers);
|
|
|
|
_headers.addAll(headers);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!kReleaseMode) {
|
|
|
|
if (!kReleaseMode) {
|
|
|
|
print("Url:$url");
|
|
|
|
loggerService.logInfo("Url:$url");
|
|
|
|
var bodyJson = json.encode(jsonObject);
|
|
|
|
var bodyJson = json.encode(jsonObject);
|
|
|
|
print("body:$bodyJson");
|
|
|
|
loggerService.logInfo("body:$bodyJson");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes);
|
|
|
|
var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes);
|
|
|
|
// try {
|
|
|
|
// try {
|
|
|
|
if (!kReleaseMode) {
|
|
|
|
if (!kReleaseMode) {
|
|
|
|
logger.i("res: " + response.body);
|
|
|
|
loggerService.logInfo("res: ${response.body}");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var jsonData = jsonDecode(response.body);
|
|
|
|
var jsonData = jsonDecode(response.body);
|
|
|
|
if (jsonData["IsAuthenticated"] != null) {
|
|
|
|
if (jsonData["IsAuthenticated"] != null) {
|
|
|
|
AppState().setIsAuthenticated = jsonData["IsAuthenticated"];
|
|
|
|
getIt.get<AppState>().setIsAuthenticated = jsonData["IsAuthenticated"];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (jsonData["ErrorMessage"] == null) {
|
|
|
|
if (jsonData["ErrorMessage"] == null) {
|
|
|
|
return factoryConstructor(jsonData);
|
|
|
|
return factoryConstructor(jsonData);
|
|
|
|
@ -146,16 +149,16 @@ class ApiClient implements IApiClient {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (queryParameters != null) {
|
|
|
|
if (queryParameters != null) {
|
|
|
|
// var queryString = new Uri(queryParameters: queryParameters).query;
|
|
|
|
// var queryString = new Uri(queryParameters: queryParameters).query;
|
|
|
|
var queryString = Uri(queryParameters: queryParameters.map((key, value) => MapEntry(key, value == null ? null : value.toString()))).query;
|
|
|
|
var queryString = Uri(queryParameters: queryParameters.map((key, value) => MapEntry(key, value?.toString()))).query;
|
|
|
|
url = url + '?' + queryString;
|
|
|
|
url = '$url?$queryString';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// if (!kReleaseMode && url.contains("saned")) {
|
|
|
|
// if (!kReleaseMode && url.contains("saned")) {
|
|
|
|
if (!kReleaseMode) {
|
|
|
|
if (!kReleaseMode) {
|
|
|
|
print("Url: $url");
|
|
|
|
loggerService.logInfo("Url: $url");
|
|
|
|
print("Headers: $_headers");
|
|
|
|
loggerService.logInfo("Headers: $_headers");
|
|
|
|
// var bodyJson = json.encode(requestBody);
|
|
|
|
// var bodyJson = json.encode(requestBody);
|
|
|
|
print("body: $requestBody");
|
|
|
|
loggerService.logInfo("body: $requestBody");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 120));
|
|
|
|
var response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(Duration(seconds: 120));
|
|
|
|
@ -170,7 +173,7 @@ class ApiClient implements IApiClient {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} on SocketException catch (e) {
|
|
|
|
} on SocketException catch (e) {
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
print('will retry after 3 seconds...');
|
|
|
|
loggerService.logInfo('will retry after 3 seconds...');
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
@ -178,7 +181,7 @@ class ApiClient implements IApiClient {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} on HttpException catch (e) {
|
|
|
|
} on HttpException catch (e) {
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
print('will retry after 3 seconds...');
|
|
|
|
loggerService.logInfo('will retry after 3 seconds...');
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
@ -188,7 +191,7 @@ class ApiClient implements IApiClient {
|
|
|
|
throw APIException(APIException.TIMEOUT, arguments: e);
|
|
|
|
throw APIException(APIException.TIMEOUT, arguments: e);
|
|
|
|
} on ClientException catch (e) {
|
|
|
|
} on ClientException catch (e) {
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
print('will retry after 3 seconds...');
|
|
|
|
loggerService.logInfo('will retry after 3 seconds...');
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
@ -199,7 +202,7 @@ class ApiClient implements IApiClient {
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
Future<Response> getJsonForResponse<T>(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0, bool isAuthAPI = false}) async {
|
|
|
|
Future<Response> getJsonForResponse<T>(String url, {String? token, Map<String, dynamic>? queryParameters, Map<String, String>? headers, int retryTimes = 0, bool isAuthAPI = false}) async {
|
|
|
|
logger.i("Url:$url");
|
|
|
|
loggerService.logInfo("Url:$url");
|
|
|
|
if (headers == null) {
|
|
|
|
if (headers == null) {
|
|
|
|
headers = {'Content-Type': 'application/json'};
|
|
|
|
headers = {'Content-Type': 'application/json'};
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
@ -225,8 +228,8 @@ class ApiClient implements IApiClient {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (queryParameters != null) {
|
|
|
|
if (queryParameters != null) {
|
|
|
|
var queryString = new Uri(queryParameters: queryParameters).query;
|
|
|
|
var queryString = Uri(queryParameters: queryParameters).query;
|
|
|
|
url = url + '?' + queryString;
|
|
|
|
url = '$url?$queryString';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var response = await _get(Uri.parse(url), headers: _headers).timeout(Duration(seconds: 60));
|
|
|
|
var response = await _get(Uri.parse(url), headers: _headers).timeout(Duration(seconds: 60));
|
|
|
|
|
|
|
|
|
|
|
|
@ -239,7 +242,7 @@ class ApiClient implements IApiClient {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} on SocketException catch (e) {
|
|
|
|
} on SocketException catch (e) {
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
print('will retry after 3 seconds...');
|
|
|
|
loggerService.logInfo('will retry after 3 seconds...');
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
@ -247,7 +250,7 @@ class ApiClient implements IApiClient {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} on HttpException catch (e) {
|
|
|
|
} on HttpException catch (e) {
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
print('will retry after 3 seconds...');
|
|
|
|
loggerService.logInfo('will retry after 3 seconds...');
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
@ -257,7 +260,7 @@ class ApiClient implements IApiClient {
|
|
|
|
throw APIException(APIException.TIMEOUT, arguments: e);
|
|
|
|
throw APIException(APIException.TIMEOUT, arguments: e);
|
|
|
|
} on ClientException catch (e) {
|
|
|
|
} on ClientException catch (e) {
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
if (retryTimes > 0) {
|
|
|
|
print('will retry after 3 seconds...');
|
|
|
|
loggerService.logInfo('will retry after 3 seconds...');
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
await Future.delayed(Duration(seconds: 3));
|
|
|
|
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
@ -282,7 +285,6 @@ class ApiClient implements IApiClient {
|
|
|
|
|
|
|
|
|
|
|
|
Future<Response> _post(url, {Map<String, String>? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding));
|
|
|
|
Future<Response> _post(url, {Map<String, String>? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding));
|
|
|
|
|
|
|
|
|
|
|
|
Future<Response> _put(url, {Map<String, String>? headers, body, Encoding? encoding}) => _withClient((client) => client.put(url, headers: headers, body: body, encoding: encoding));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
void setHomeUrl(String url) {
|
|
|
|
void setHomeUrl(String url) {
|
|
|
|
|