Files
fcs/lib/helpers/api_helper.dart

258 lines
8.6 KiB
Dart
Raw Normal View History

2020-10-26 04:41:24 +06:30
import 'dart:async';
2020-05-29 07:45:27 +06:30
import 'dart:convert';
import 'dart:io';
2024-01-23 14:35:09 +06:30
import 'package:device_info_plus/device_info_plus.dart';
2020-05-29 07:45:27 +06:30
import 'package:dio/dio.dart';
2024-10-04 13:55:59 +06:30
import 'package:fcs/data/services/services.dart';
import 'package:fcs/domain/entities/user.dart';
2020-10-07 02:33:06 +06:30
import 'package:fcs/domain/vo/status.dart';
2020-05-29 07:45:27 +06:30
import 'package:logging/logging.dart';
2020-10-26 04:41:24 +06:30
import 'package:path_provider/path_provider.dart';
2020-05-29 07:45:27 +06:30
2020-10-07 02:33:06 +06:30
import '../config.dart';
2020-09-10 02:13:22 +06:30
import 'dev_info.dart';
2020-10-26 04:41:24 +06:30
import 'firebase_helper.dart';
import 'dart:developer' as log;
2020-05-29 07:45:27 +06:30
final logger = Logger('requestAPI');
2020-05-29 07:45:27 +06:30
// request makes http request
// if token is null
2024-01-09 13:11:22 +06:30
Future<dynamic> requestAPI(String path, method,
{dynamic payload, String? token, String? url, int? networkTimeout}) async {
2020-09-10 02:13:22 +06:30
DevInfo devInfo = await DevInfo.getDevInfo();
String deviceName = "${devInfo.model}(${devInfo.id})";
logger.info("device:${devInfo.deviceID},deviceName:$deviceName");
2020-05-29 07:45:27 +06:30
Map<String, dynamic> headers = {};
if (token != null) {
headers["Token"] = token;
}
2024-10-04 13:55:59 +06:30
User? pinLoginUser = Services.instance.authService.getPinLoginUser();
if (pinLoginUser != null) {
headers["pin_token"] = pinLoginUser.pinToken;
}
2024-01-23 16:28:08 +06:30
if (devInfo.deviceID != null) {
2024-01-09 13:11:22 +06:30
headers["Device"] = devInfo.deviceID ?? "" + ":" + deviceName;
2020-09-12 03:34:52 +06:30
}
headers["Project-ID"] = Services.setting.reportProjectID;
2020-05-29 07:45:27 +06:30
BaseOptions options = new BaseOptions(
method: method,
baseUrl: url == null ? Config.instance.apiURL : url,
2024-01-09 13:11:22 +06:30
connectTimeout: Duration(milliseconds: networkTimeout ?? 50000),
receiveTimeout: Duration(milliseconds: networkTimeout ?? 50000),
2020-05-29 07:45:27 +06:30
headers: headers,
);
logger.info("baseUrl:${options.baseUrl}, path:$path, method:$method");
logger.info("payload:$payload");
List<String> list = [];
headers.forEach((key, value) {
var r = '-H $key:$value ';
list.add(r);
});
String curlPath =
"curl -X $method ${list.join("")}${payload != null ? '-d \'${jsonEncode(payload)}\' ' : ''}${options.baseUrl}$path";
log.log(curlPath);
2020-05-29 07:45:27 +06:30
try {
Dio dio = new Dio(options);
Response response = await dio.request(
path,
data: payload,
);
if (response.statusCode == HttpStatus.ok) {
var data = Status.fromJson(response.data);
if (data.status == 'Ok') {
return response.data["data"];
} else {
throw Exception(data.message);
}
}else{
throw Exception( "${response.statusCode} - ${response.statusMessage}");
2020-05-29 07:45:27 +06:30
}
} catch (e) {
logger.warning("path:$path, api:$e");
2020-05-29 07:45:27 +06:30
throw e;
}
}
// request makes http request
// if token is null
Future<dynamic> requestDownloadAPI(String path, method,
2021-09-10 14:27:38 +06:30
{dynamic payload, String? token, String? url, String? filePath}) async {
2020-05-29 07:45:27 +06:30
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
String deviceName = "${androidInfo.model}(${androidInfo.id})";
logger.info("device:${androidInfo.id},deviceName:$deviceName");
2020-05-29 07:45:27 +06:30
var bytes = utf8.encode(payload);
var base64Str = base64.encode(bytes);
String escapePayload = HtmlEscape().convert(base64Str);
try {
String baseUrl = url == null ? Config.instance.apiURL : url;
logger.info("Path:$baseUrl$path");
2020-05-29 07:45:27 +06:30
HttpClient client = new HttpClient();
var _downloadData = StringBuffer();
2021-09-10 14:27:38 +06:30
var fileSave = new File(filePath!);
2020-05-29 07:45:27 +06:30
var request = await client.getUrl(Uri.parse("$baseUrl$path"));
request.headers.set("Project-ID", Services.setting.reportProjectID);
2020-05-29 07:45:27 +06:30
request.headers
.set(HttpHeaders.contentTypeHeader, "application/json; charset=UTF-8");
if (token != null) {
request.headers.set("Token", token);
}
2024-01-23 14:35:09 +06:30
request.headers.set("Device", androidInfo.id + ":" + deviceName);
2020-05-29 07:45:27 +06:30
request.headers.set("payload", escapePayload);
var response = await request.close();
print("headers:${response.headers}");
response.transform(utf8.decoder).listen((d) => _downloadData.write(d),
onDone: () {
fileSave.writeAsString(_downloadData.toString());
});
} catch (e) {
logger.warning("path:$path, api:$e");
2020-05-29 07:45:27 +06:30
throw e;
}
}
// request makes http request
// if token is null
Future<dynamic> requestDownloadPDFAPI(String path, method,
2021-09-10 14:27:38 +06:30
{dynamic payload, String? token, String? url, String? filePath}) async {
2020-05-29 07:45:27 +06:30
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
String deviceName = "${androidInfo.model}(${androidInfo.id})";
logger.info("device:${androidInfo.id},deviceName:$deviceName");
2020-05-29 07:45:27 +06:30
var bytes = utf8.encode(payload);
var base64Str = base64.encode(bytes);
String escapePayload = HtmlEscape().convert(base64Str);
try {
String baseUrl = url == null ? Config.instance.apiURL : url;
logger.info("Path:$baseUrl$path");
2020-05-29 07:45:27 +06:30
HttpClient client = new HttpClient();
// var _downloadData = StringBuffer();
2021-09-10 14:27:38 +06:30
var fileSave = new File(filePath!);
2020-05-29 07:45:27 +06:30
var request = await client.getUrl(Uri.parse("$baseUrl$path"));
request.headers.set("Project-ID", Services.setting.reportProjectID);
2020-05-29 07:45:27 +06:30
if (token != null) {
request.headers.set("Token", token);
}
2024-01-23 14:35:09 +06:30
request.headers.set("Device", androidInfo.id + ":" + deviceName);
2020-05-29 07:45:27 +06:30
request.headers.set("payload", escapePayload);
var response = await request.close();
print("headers:${response.headers}");
2021-09-10 14:27:38 +06:30
List<int> _downloadData = [];
2020-05-29 07:45:27 +06:30
response.listen((d) => _downloadData.addAll(d), onDone: () {
fileSave.writeAsBytes(_downloadData);
});
// response.transform(utf8.decoder).listen((d) => _downloadData.write(d),
// onDone: () {
// fileSave.writeAsString(_downloadData.toString());
// });
} catch (e) {
logger.warning("path:$path, api:$e");
2020-05-29 07:45:27 +06:30
throw e;
}
}
2020-10-26 04:41:24 +06:30
typedef OnDownloadDone(File file);
// request makes http request
// if token is null
Future<dynamic> requestDownload(String path, method,
{dynamic payload,
2024-01-23 16:28:08 +06:30
required String? token,
required String? url,
2021-09-10 14:27:38 +06:30
required String filePath,
OnDownloadDone? onDownloadDone}) async {
2020-10-26 04:41:24 +06:30
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
String deviceName = "${androidInfo.model}(${androidInfo.id})";
logger.info("device:${androidInfo.id},deviceName:$deviceName");
2020-10-26 04:41:24 +06:30
var bytes = utf8.encode(payload);
var base64Str = base64.encode(bytes);
String escapePayload = HtmlEscape().convert(base64Str);
try {
String baseUrl = url == null ? Config.instance.apiURL : url;
logger.info("Path:$baseUrl$path");
2020-10-26 04:41:24 +06:30
HttpClient client = new HttpClient();
// var _downloadData = StringBuffer();
var request = await client.postUrl(Uri.parse("$baseUrl$path"));
request.headers.set("Project-ID", Services.setting.reportProjectID);
2020-10-26 04:41:24 +06:30
if (token != null) {
request.headers.set("Token", token);
}
2024-01-23 14:35:09 +06:30
request.headers.set("Device", androidInfo.id + ":" + deviceName);
2020-10-26 04:41:24 +06:30
request.headers
.set(HttpHeaders.contentTypeHeader, 'application/json; charset=utf-8');
request.headers.set("payload", escapePayload);
request.write(payload);
// request.write(escapePayload);
var response = await request.close();
print("headers:${response.headers}");
2021-09-10 14:27:38 +06:30
List<int> _downloadData = [];
2020-10-26 04:41:24 +06:30
var cd = response.headers.value("content-disposition");
String fileName = "download.csv";
if (cd != null && cd.contains("filename=")) {
fileName = cd.substring(cd.indexOf("=") + 1);
}
2024-01-23 16:28:08 +06:30
// var file = filePath + "/" + fileName;
2020-10-26 04:41:24 +06:30
var fileSave = new File(filePath + "/" + fileName);
response.listen((d) => _downloadData.addAll(d), onDone: () async {
await fileSave.writeAsBytes(_downloadData);
if (onDownloadDone != null) {
onDownloadDone(fileSave);
}
// final message = await OpenFile.open(file);
// log.info("Open file result:${message.message}");
// if (message.message != "done") {
// throw Exception(message.message);
// }
// await Share.file(fileName, fileName, _downloadData,
// downloadType == DownloadType.CSV ? "text/csv" : "application/pdf");
});
} catch (e) {
e.toString();
logger.warning("path:$path, api:$e");
2020-10-26 04:41:24 +06:30
throw e;
}
}
Future<File> downloadPDF(
String templateName, Map<String, dynamic> values) async {
final completer = Completer<File>();
final directory = await getApplicationSupportDirectory();
String path = ('${directory.path}');
logger.info("download file path:$path");
2020-10-26 04:41:24 +06:30
var data = {"template_name": templateName, "data": values};
print("payload:$data");
await requestDownload("/api/pdf", "POST",
filePath: path,
url: Services.setting.reportURL,
2020-10-26 04:41:24 +06:30
token: await getToken(),
payload: jsonEncode(data), onDownloadDone: (f) async {
completer.complete(f);
});
return completer.future;
}