diff --git a/ios/Flutter/flutter_export_environment.sh b/ios/Flutter/flutter_export_environment.sh index babf0d3..7e0d072 100644 --- a/ios/Flutter/flutter_export_environment.sh +++ b/ios/Flutter/flutter_export_environment.sh @@ -2,6 +2,7 @@ # This is a generated file; do not edit or check into version control. export "FLUTTER_ROOT=C:\Android\flutter" export "FLUTTER_APPLICATION_PATH=C:\Users\Aleksandr\AndroidStudioProjects\vikunja" +export "COCOAPODS_PARALLEL_CODE_SIGN=true" export "FLUTTER_TARGET=lib\main.dart" export "FLUTTER_BUILD_DIR=build" export "SYMROOT=${SOURCE_ROOT}/../build\ios" diff --git a/lib/api/client.dart b/lib/api/client.dart index 63ef8f3..1fc7158 100644 --- a/lib/api/client.dart +++ b/lib/api/client.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'dart:convert'; import 'package:http/http.dart' as http; +import 'package:vikunja_app/api/response.dart'; +import 'package:vikunja_app/components/string_extension.dart'; class Client { final JsonDecoder _decoder = new JsonDecoder(); @@ -25,33 +27,46 @@ class Client { 'Content-Type': 'application/json' }; - Future get(String url) { - return http.get(Uri.parse('${this.base}$url'), + Future get(String url, + [Map> queryParameters]) { + // TODO: This could be moved to a seperate function + var uri = Uri.parse('${this.base}$url'); + // Because these are all final values, we can't just add the queryParameters and must instead build a new Uri Object every time this method is called. + var newUri = Uri( + scheme: uri.scheme, + userInfo: uri.userInfo, + host: uri.host, + port: uri.port, + path: uri.path, + query: uri.query, + queryParameters: queryParameters, + // Because dart takes a Map here, it is only possible to sort by one parameter while the api supports n parameters. + fragment: uri.fragment); + return http.get(newUri, headers: _headers) + .then(_handleResponse); + } + + Future delete(String url) { + return http.delete('${this.base}$url'.toUri(), headers: _headers, ).then(_handleResponse); } - Future delete(String url) { - return http.delete(Uri.parse('${this.base}$url'), - headers: _headers, - ).then(_handleResponse); - } - - Future post(String url, {dynamic body}) { - return http.post(Uri.parse('${this.base}$url'), + Future post(String url, {dynamic body}) { + return http.post('${this.base}$url'.toUri(), headers: _headers, body: _encoder.convert(body), ).then(_handleResponse); } - Future put(String url, {dynamic body}) { - return http.put(Uri.parse('${this.base}$url'), + Future put(String url, {dynamic body}) { + return http.put('${this.base}$url'.toUri(), headers: _headers, body: _encoder.convert(body), ).then(_handleResponse); } - dynamic _handleResponse(http.Response response) { + Response _handleResponse(http.Response response) { if (response.statusCode < 200 || response.statusCode >= 400 || json == null) { @@ -65,12 +80,17 @@ class Client { throw new ApiException( response.statusCode, response.request.url.toString()); } - return _decoder.convert(response.body); + return Response( + _decoder.convert(response.body), + response.statusCode, + response.headers + ); } } class InvalidRequestApiException extends ApiException { final String message; + InvalidRequestApiException(int errorCode, String path, this.message) : super(errorCode, path); @@ -83,6 +103,7 @@ class InvalidRequestApiException extends ApiException { class ApiException implements Exception { final int errorCode; final String path; + ApiException(this.errorCode, this.path); @override diff --git a/lib/api/label_task.dart b/lib/api/label_task.dart new file mode 100644 index 0000000..e29011f --- /dev/null +++ b/lib/api/label_task.dart @@ -0,0 +1,30 @@ +import 'package:vikunja_app/api/client.dart'; +import 'package:vikunja_app/api/service.dart'; +import 'package:vikunja_app/models/label.dart'; +import 'package:vikunja_app/models/labelTask.dart'; +import 'package:vikunja_app/service/services.dart'; + +class LabelTaskAPIService extends APIService implements LabelTaskService { + LabelTaskAPIService(Client client) : super(client); + + @override + Future