import 'dart:convert'; import 'dart:io'; import 'package:mohem_flutter_app/models/response_models.dart'; import 'package:mohem_flutter_app/services/secure_storage.dart'; import 'package:http/http.dart'; import 'package:injector/injector.dart'; import 'http_service.dart'; import 'network_service.dart'; abstract class IBackendApiService { Future getUnauthenticatedAPI(String route); Future getAuthenticatedAPI(String route); Future postUnauthenticatedAPI( String route, String dataAsJson); Future postAuthenticatedAPI(String route, String dataAsJson); Future deleteAuthenticatedAPI(String route, String id); } class BackendApiService implements IBackendApiService { static String _homeUrl = "https://check.revotec.eu/check2/"; static String _serverApiBaseUrl = _homeUrl + "mapi/v1/"; static String get homeUrl => _homeUrl; final ISecureStorage _secureStorage = Injector.appInstance.getDependency(); final IHttpService _httpService = Injector.appInstance.getDependency(); ///internal helper functions which executes the given api call ///and wraps the response Future _callApi(Future callback) async { Response response; try { //execute future response = await callback; //check response code, and if not ok return isOk = false //200 for Get //201 for Post // print("res121: " + // response.statusCode.toString() + // " Body:" + // response.body.toString()); //if delete request sent so server is returning 204 in case of success. if (response.statusCode == 204) return BackendResponse(id: 1, isOk: true, result: null); if (response.statusCode != 200 && response.statusCode != 201) return BackendResponse(id: -1, isOk: false, result: null); //if response code is good then parse message and return parsed response return BackendResponse.fromJson(json.decode(response.body)); //return BackendResponse.fromJson(dioResponse.body); } catch (e) { return BackendResponse(id: -1, isOk: false, result: null); // try { // return BackendResponse.fromJson(json.decode(response.body)); // } catch (e) { // return BackendResponse(id:-1, isOk:false,result: null); // } } } @override Future getAuthenticatedAPI(String route) async { await checkConnection(); final token = await _secureStorage.readBearerToken(); return _callApi(_httpService.get(_serverApiBaseUrl + route, headers: { 'Content-Type': 'application/json', 'Accept': '*/*', HttpHeaders.authorizationHeader: "Bearer $token" })); } @override Future getUnauthenticatedAPI(String route) async { await checkConnection(); return _callApi(_httpService.get(_serverApiBaseUrl + route, headers: {'Content-Type': 'application/json', 'Accept': '*/*'})); } @override Future postAuthenticatedAPI( String route, String dataAsJson) async { await checkConnection(); final token = await _secureStorage.readBearerToken(); // print("res121: " + _serverApiBaseUrl + route); return _callApi(_httpService .post(_serverApiBaseUrl + route, body: dataAsJson, headers: { 'Content-Type': 'application/json', 'Accept': '*/*', HttpHeaders.authorizationHeader: "Bearer $token" })); } @override Future postUnauthenticatedAPI( String route, String dataAsJson) async { await checkConnection(); return _callApi(_httpService.post(_serverApiBaseUrl + route, body: dataAsJson, headers: {'Content-Type': 'application/json'})); } Future checkConnection() async { if (!(await Injector.appInstance .getDependency() .isHostAvailable(_homeUrl))) throw NetworkException(); } @override Future deleteAuthenticatedAPI( String route, String id) async { await checkConnection(); final token = await _secureStorage.readBearerToken(); return _callApi( _httpService.delete(_serverApiBaseUrl + route + "/" + id, headers: { 'Content-Type': 'application/json', 'Accept': '*/*', HttpHeaders.authorizationHeader: "Bearer $token" })); } }