1
0
mirror of https://gitlab.com/comunic/comunicmobile synced 2024-11-22 12:59:21 +00:00
comunicmobile/lib/helpers/api_helper.dart

75 lines
2.3 KiB
Dart

import 'dart:convert';
import 'dart:io';
import 'package:comunic/helpers/account_credentials_helper.dart';
import 'package:comunic/models/api_request.dart';
import 'package:comunic/models/api_response.dart';
import 'package:comunic/models/config.dart';
/// API Helper
///
/// @author Pierre HUBERT
class APIHelper {
final _httpClient = HttpClient();
/// Execute a [request] on the server and returns a [APIResponse]
///
/// This method should never throw but the response code of the [APIResponse]
/// should be verified before accessing response content
Future<APIResponse> exec(APIRequest request) async {
try {
//Add API tokens
request.addString("serviceName", config().serviceName);
request.addString("serviceToken", config().serviceToken);
//Add user tokens (if required)
if (request.needLogin) {
final tokens = await AccountCredentialsHelper().get();
assert(tokens != null);
request.addString("userToken1", tokens.tokenOne);
request.addString("userToken2", tokens.tokenTwo);
}
// Prepare request body
String requestBody = "";
request.args.forEach((key, value) => requestBody +=
Uri.encodeQueryComponent(key) +
"=" +
Uri.encodeQueryComponent(value) +
"&");
List<int> bodyBytes = utf8.encode(requestBody);
// Determine server URL
final path = config().apiServerUri + request.uri;
Uri url;
if (!config().apiServerSecure)
url = Uri.http(config().apiServerName, path);
else
url = Uri.https(config().apiServerName, path);
//Connect to server
final connection = await _httpClient.postUrl(url);
connection.headers.set("Content-Length", bodyBytes.length.toString());
connection.headers
.set("Content-Type", "application/x-www-form-urlencoded");
connection.add(bodyBytes);
final response = await connection.close();
if (response.statusCode != HttpStatus.ok)
return APIResponse(response.statusCode, null);
//Save & return response
final responseBody = await response.transform(utf8.decoder).join();
return APIResponse(response.statusCode, responseBody);
} on Exception catch (e) {
print(e.toString());
print("Could not execute a request!");
return APIResponse(-1, null);
}
}
}