import 'dart:convert'; import 'dart:io'; import 'package:aman_kassa_flutter/core/base/base_service.dart'; import 'package:aman_kassa_flutter/core/models/halyk/halyk_post_session.dart'; import 'package:aman_kassa_flutter/redux/state/user_state.dart'; import 'package:aman_kassa_flutter/redux/store.dart'; import 'package:aman_kassa_flutter/views/login/login_view.dart'; import 'package:crypto/crypto.dart'; import 'package:device_info/device_info.dart'; import 'package:aman_kassa_flutter/core/models/message.dart'; import 'package:aman_kassa_flutter/core/models/response.dart'; import 'package:aman_kassa_flutter/core/models/smena.dart'; import 'package:aman_kassa_flutter/core/route_names.dart'; import 'package:aman_kassa_flutter/core/services/dialog_service.dart'; import 'package:aman_kassa_flutter/core/services/navigator_service.dart'; import 'package:aman_kassa_flutter/core/locator.dart'; import '../models/auth_response.dart'; import 'package:http/http.dart' as http; /// The service responsible fworking requests class ApiService extends BaseService { static const test_host = 'https://kassa-test.aman.com.kz'; static const test_endpoint = '$test_host/ru/api/v2'; static const host = 'https://kassa.aman.com.kz'; static const endpoint = '$host/ru/api/v2'; static const pos_endpoint = '$test_host/api'; final NavigatorService _navigatorService = locator(); final DialogService _dialogService = locator(); var client = new http.Client(); bool _test = false; bool get test => this._test; set test(bool value) => this._test = value; Future authenticate(String email, String password, { bool statusCheck = true}) async { Map requestBody = { 'email': email, 'password': password }; String response = await requestFormData('/authenticate', requestBody, statusCheck: statusCheck ); AuthResponse aman = AuthResponse.fromJson(json.decode(response)); return aman.body; } Future authenticateToken(String token, { bool statusCheck = true}) async { Map requestBody = { 'token': token }; String response = await requestFormData('/activate_token', requestBody, statusCheck: statusCheck ); AuthResponse aman = AuthResponse.fromJson(json.decode(response)); return aman.body; } Future> isActive(String token) async { Map requestBody = {'api_token': token}; var response = await requestFormData('/test_auth', requestBody, statusCheck: false); return Response.fromJson(json.decode(response), Message.fromJson); } Future> logout(String token) async { Map requestBody = {'api_token': token}; var response = await requestFormData('/logout', requestBody); return Response.fromJsonDynamic(json.decode(response)); } Future halykPosToken(String token, login, password) async { String salt = '!=uF:w1N_Salh?1gVSJ#eGfJYHA(wS4D'; String hash = md5.convert(utf8.encode('$login$salt')).toString(); print(hash); Map requestBody = {'login': login, 'password': password}; var response = await requestFormData('/getpostoken', requestBody, bodyEntry: true, posEndPoint: true, statusCheck: false); return HalykPosSession.fromJson(jsonDecode(response)); } Future> money(String token) async { Map requestBody = {'api_token': token}; var response = await requestFormData('/money', requestBody); return Response.fromJsonDynamic(json.decode(response)); } Future> infoKkm(String token) async { Map requestBody = {'api_token': token}; var response = await requestFormData('/info', requestBody); return Response.fromJsonDynamic(json.decode(response)); } Future> deposit(String token, String sum) async { Map requestBody = {'api_token': token, 'summ': sum}; var response = await requestFormData('/deposit', requestBody); return Response.fromJsonDynamic(json.decode(response)); } Future> withdrawal(String token, String sum) async { Map requestBody = {'api_token': token, 'summ': sum}; var response = await requestFormData('/withdrawal', requestBody); return Response.fromJsonDynamic(json.decode(response)); } Future> smena(String token) async { Map requestBody = {'api_token': token}; var response = await requestFormData('/smena', requestBody); return Response.fromJson(json.decode(response), Smena.fromJson); } Future> closeSmena(String token) async { Map requestBody = {'api_token': token}; var response = await requestFormData('/close_smena', requestBody); return Response.fromJson(json.decode(response), Smena.fromJson); } Future> openSmena(String token) async { Map requestBody = {'api_token': token}; var response = await requestFormData('/open_smena', requestBody); return Response.fromJson(json.decode(response), Smena.fromJson); } Future> xReport(String token) async { Map requestBody = {'api_token': token}; var response = await requestFormData('/report_x', requestBody); return Response.fromJsonDynamic(json.decode(response)); } Future> sell(String token, String checkData) async { Map requestBody = {'api_token': token, 'data': checkData}; var response = await requestFormData('/sell', requestBody); return Response.fromJsonDynamic(json.decode(response)); } Future> sellReturn(String token, String checkData) async { Map requestBody = {'api_token': token, 'data': checkData}; var response = await requestFormData('/sell_return', requestBody); return Response.fromJsonDynamic(json.decode(response)); } Future requestFormData(String point, Map requestBody, { bool statusCheck = true, bool bodyEntry = false, bool posEndPoint= false } ) async { DeviceInfoPlugin deviceInfo = DeviceInfoPlugin(); Map headers = { HttpHeaders.contentTypeHeader: bodyEntry ? "application/json" : "multipart/form-data", HttpHeaders.cacheControlHeader: "no-cache" }; if(Platform.isAndroid) { AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo; headers.addAll({ HttpHeaders.userAgentHeader: androidInfo.model, "mob_agent" : "e40c519e7a24d0c93530fd362023afa0", }); } if(Platform.isIOS) { IosDeviceInfo iosInfo = await deviceInfo.iosInfo; headers.addAll({ HttpHeaders.userAgentHeader: iosInfo.utsname.machine, "mob_agent" : "fbd69e994b6251837ba82a08c6f68307", }); } String url = '$endpoint$point'; if(this._test) { url = '$test_endpoint$point'; } if(posEndPoint){ url = '$pos_endpoint$point'; } var uri = Uri.parse(url); String body; if(bodyEntry) { http.Response res = await http.post(uri, body: jsonEncode(requestBody), headers: headers ); body = res.body; } else { var request = http.MultipartRequest('POST', uri) ..headers.addAll(headers) ..fields.addAll(requestBody); var response = await request.send(); body = await response.stream.bytesToString(); } if(statusCheck) { //Проверка на авторизованный запрос, необязательный параметр Response check = Response.fromJsonDynamic(json.decode(body)); if (!check.operation && ( [401,402,403,412].contains(check.status) ) ) { new Future.delayed(const Duration(milliseconds: 1000), (){ _dialogService.showDialog(description: 'Необходимо пройти повторную авторизацию'); UserState state = Redux.store.state.userState; _navigatorService.replace(LoginViewRoute, arguments: LoginModel(authType: state.authenticateType, login: state.login, password: state.password )); }); } } return body; } Future> getGoodsFromServer(String token) async { Map requestBody = {'api_token': token}; var response = await requestFormData('/goods', requestBody); return Response.fromJsonDynamic(json.decode(response)); } Future> getCategoryFromServer(String token) async { Map requestBody = {'api_token': token}; var response = await requestFormData('/goods_category', requestBody); return Response.fromJsonDynamic(json.decode(response)); } Future> getServiceFromServer(String token) async { Map requestBody = {'api_token': token}; var response = await requestFormData('/services', requestBody); return Response.fromJsonDynamic(json.decode(response)); } }