import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:workouttest_util/model/cache.dart'; import 'package:workouttest_util/util/common.dart'; import 'package:workouttest_util/util/logging.dart'; import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:workouttest_util/util/not_found_exception.dart'; class APIWebClient with Common, Logging { static final APIWebClient _singleton = APIWebClient._internal(); late bool cert; factory APIWebClient() { return _singleton; } APIWebClient._internal() { cert = false; } dynamic authenticateUser(String email, String password) async { var baseUrl = Cache().getBaseUrl(); log("Base URL: $baseUrl"); var url = "${baseUrl}authenticate"; try { final body = jsonEncode({ 'username': email, 'password': password }); var uri = Uri.parse(url); var result = await http.post(uri, body: body, headers: { "Content-Type": "application/json", "Authorization": "1", }); if (result.statusCode != 200) { log("authentication response: ${result.statusCode} with URL: $url"); throw Exception("Authentication error: ${result.statusCode}"); } String response = result.body; log("Authentication status: ${result.statusCode}, response: $response"); final data = jsonDecode(response); return data; } on Exception catch (exception) { log(exception.toString()); try { await Sentry.captureException(exception); } on Exception catch (e) { log(e.toString()); } throw Exception("Network error, try again later!"); } } Future post(String endPoint, String body) async { final url = Cache().getBaseUrl() + endPoint; log(" ------------ http/post body $body - url: $url "); try { String authToken = Cache().getAuthToken(); if (authToken.isEmpty) { var responseJson = await authenticateUser(Cache.username, Cache.password); authToken = responseJson['token']; Cache().authToken = authToken; } var uri = Uri.parse(url); var result = await http.post(uri, body: body, headers: { "Content-Type": "application/json", "Authorization": 'Bearer $authToken', }); log(" ------------post response code: ${result.statusCode}"); if (result.statusCode == 200) { return result.body; } else if (result.statusCode == 404) { throw const NotFoundException(message: "Not Found"); } else { throw Exception("Network Error, please try again later"); } } on NotFoundException catch(e) { throw NotFoundException(message: "Not Found ${e.message}"); } on Exception catch (e) { log("Post Exception: $e"); await Sentry.captureException(e); throw Exception("Network Error, please try again later"); } } Future get(String endPoint, String param) async { final url = Cache().getBaseUrl() + endPoint + param; try { log("-------- API get $url"); String authToken = Cache().getAuthToken(); if (authToken.isEmpty) { var responseJson = await authenticateUser(Cache.username, Cache.password); authToken = responseJson['token']; Cache().authToken = authToken; } var uri = Uri.parse(url); var result = await http.get(uri, headers: { "Content-Type": "application/json", "Authorization": 'Bearer $authToken', }); log(" ------------get response code: ${result.statusCode}"); if (result.statusCode == 200) { return result.body; } else if (result.statusCode == 404) { throw const NotFoundException(message: "Not Found"); } else { throw Exception("Network Error, please try again later"); } } on NotFoundException catch(e) { throw NotFoundException(message: "Not Found ${e.message}"); } on Exception catch (e) { log("Post Exception: $e"); await Sentry.captureException(e); throw Exception("Network Error, please try again later"); } } }