import 'dart:convert'; import 'package:http/http.dart' as http; // final String API_URL = DataEndpoint; // final String API_KEY = '''Af+"E headers; EasyAPIClient(apiurl, apikey) { this.apiurl = apiurl; this.apikey = apikey; this.headers = { 'x-api-key': apikey, 'Content-Type': 'application/json', }; } Future post(String query, [Map variables = const {}]) async { final allbodyparts = {'query': query, 'variables': variables}; final body = Map.fromEntries(allbodyparts.entries.where((entry) => entry.value != null)); return await http.post(Uri.parse(this.apiurl), headers: this.headers, body: jsonEncode(body)); } } String pyDictToGPLString(dynamic values, [int indent = 0]) { String formatValue(dynamic value, [int indent = 0]) { if (value is bool) { return value.toString().toLowerCase(); } else if (value is String) { return '"$value"'; } else if (value is List) { final items = value.map((item) => formatValue(item, indent)).join(', '); return '[$items]'; } else if (value is Map) { final items = value.entries.map((entry) => ' ' * (indent + 1) + '${entry.key}: ${formatValue(entry.value, indent + 1)}').join(',\n'); return '{\n$items\n${' ' * indent}}'; } else { return value.toString(); } } final formattedValues = formatValue(values, indent); return formattedValues; } String pyDictToGPLQueryString(Map querydict, [int indent = 1]) { String generateQueryString(Map querydict, [int indent = 1]) { var queryString = ''; querydict.forEach((key, value) { if (value == null) { queryString += ' ' * indent + '$key\n'; } else if (value is Map) { queryString += ' ' * indent + '$key {\n'; queryString += generateQueryString(value, indent + 1); queryString += ' ' * indent + '}\n'; } else { throw ArgumentError('Invalid querydict format'); } }); return queryString; } final queryString = generateQueryString(querydict, indent); return '{\n$queryString${' ' * (indent - 1)}}'; } class GPLModel { late EasyAPIClient _syncapi; final String omodel; late String gpl_model; GPLModel(this.omodel, String apiurl, String apikey) { if (omodel.isNotEmpty) { gpl_model = convertToCamelCase(omodel); _syncapi = EasyAPIClient(apiurl, apikey); } else { gpl_model = ""; } } String convertToCamelCase(String input) { List parts = input.split('.'); List capitalizedParts = parts.map((part) { if (part.isNotEmpty) { return part[0].toUpperCase() + part.substring(1); } else { return ''; } }).toList(); return capitalizedParts.join(); } Future> browse({required int id, Map querydict = const {'id': null}}) async { final gplquery = pyDictToGPLQueryString(querydict, 2); final browseBody = '''query MyQuery { $gpl_model(id: "$id") $gplquery }'''; final response = await _syncapi.post(browseBody); final data = json.decode(response.body)['data']; return data[gpl_model][0]; } Future> search({List> domain = const [], String order = 'name', int limit = 80, int offset = 0, Map querydict = const {'id': null}}) async { final gplquery = pyDictToGPLQueryString(querydict, 2); final searchBody = '''query MyQuery(\$offset: Int, \$limit: Int, \$order: String, \$domain: [[Any]]) { $gpl_model( offset: \$offset limit: \$limit order: \$order domain: \$domain ) $gplquery }'''; final allVariables = { 'domain': domain, 'order': order, 'limit': limit, 'offset': offset, }; final response = await _syncapi.post(searchBody, allVariables); final data = json.decode(response.body)['data']; return data[gpl_model]; } Future> create({Map values = const {}, Map querydict = const {'id': null}}) async { final gplvalues = pyDictToGPLString(values, 2); final gplquery = pyDictToGPLQueryString(querydict, 2); print(gpl_model); final createBody = '''mutation Create { create$gpl_model: $gpl_model( $gpl_model\Values: $gplvalues ) $gplquery }'''; final response = await _syncapi.post(createBody); final data = json.decode(response.body)['data']; return data['create$gpl_model'][0]; } Future> write({required int id, required Map values, Map querydict = const {'id': null}}) async { final gplvalues = pyDictToGPLString(values, 2); final gplquery = pyDictToGPLQueryString(querydict, 2); final writeBody = '''mutation Update { update$gpl_model: $gpl_model( id: $id, $gpl_model\Values: $gplvalues ) $gplquery }'''; final response = await _syncapi.post(writeBody); final data = json.decode(response.body)['data']; return data['update$gpl_model'][0]; } Future> delete({required int id, Map querydict = const {'id': null}}) async { final gplquery = pyDictToGPLQueryString(querydict, 2); final deleteBody = '''mutation Delete { delete$gpl_model: $gpl_model( id: $id ) $gplquery }'''; final response = await _syncapi.post(deleteBody); final data = json.decode(response.body); return data; } Future> methodExecute(int id, String methodName, Map methodParameters) async { final methodExecuteBody = '''mutation Method { method$gpl_model: $gpl_model( id: $id, method_name: $methodName, method_parameters: ${pyDictToGPLString(methodParameters)} ) }'''; final response = await _syncapi.post(methodExecuteBody); final data = json.decode(response.body); return data; } } Future makeApiLoginRequest({required String username,required String password, required baseEndpoint, required authEndpoint}) async { Map jsonData = { 'base_endpoint': baseEndpoint, }; String basicAuth = 'Basic ' + base64Encode(utf8.encode('$username:$password')); Map headers = { 'Content-Type': 'application/json', 'Authorization': basicAuth, }; String jsonEncoded = json.encode(jsonData); try{ var response = await http.post( Uri.parse(authEndpoint), headers: headers, body: jsonEncoded, ); return response; } catch(e) { print(e); } } // final GPLModel resObj = GPLModel('res.partner'); // void main() { // // For normal query operation // var query_dict = {'id': null, 'name': null, 'country_id': {'id': null, 'name': null}, 'mobile': null}; // // final result = resObj.search(domain: const [], querydict: query_dict); // final result = resObj.browse(1079, query_dict); // // final create_values = { // // 'active': true, // // 'name': 'Ekika Corporation PVT LTD.', // // 'bank_ids': [ // // [0, 0, { // // 'sequence': 10, // // 'bank_id': 2, // // 'acc_number': '1111111', // // 'allow_out_payment': true, // // 'acc_holder_name': false, // // }], // // [0, 0, { // // 'sequence': 10, // // 'bank_id': 3, // // 'acc_number': '9999999999999', // // 'allow_out_payment': true, // // 'acc_holder_name': false, // // }] // // ], // // 'city': 'Gandhinagar', // // 'zip': '382421', // // 'comment': '

Comment Here

', // // 'mobile': '888888888', // // }; // // final result = resObj.create(values: create_values, querydict: query_dict); // // final write_values = { // // 'name': 'Ekika Corporation', // // 'mobile': 111111111, // // }; // // final result = resObj.write(1115, write_values,query_dict); // // final result = resObj.delete(1116); // // final result = resObj.methodExecute(4, 'parameter_test_method', {'key_3': 'new_val_3', 'key_2': 'new_val_2', 'key_1': 'new_val_1'}); // result.then((value) => print(value)); // // You can call other functions here like resWriteOne. // }