You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
264 lines
8.5 KiB
264 lines
8.5 KiB
4 months ago
|
import 'dart:convert';
|
||
|
import 'package:http/http.dart' as http;
|
||
|
|
||
|
// final String API_URL = DataEndpoint;
|
||
|
// final String API_KEY = '''Af+"E<y.-Rs<q9")|'%7A&@U.fU}JV~:''';
|
||
|
|
||
|
class SyncError implements Exception {
|
||
|
final String message;
|
||
|
|
||
|
SyncError([this.message = 'Connection not established.']);
|
||
|
|
||
|
@override
|
||
|
String toString() {
|
||
|
return 'Sync Error: $message';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
class EasyAPIClient {
|
||
|
late String apiurl;
|
||
|
late String apikey;
|
||
|
late Map<String, String> headers;
|
||
|
|
||
|
EasyAPIClient(apiurl, apikey) {
|
||
|
this.apiurl = apiurl;
|
||
|
this.apikey = apikey;
|
||
|
this.headers = {
|
||
|
'x-api-key': apikey,
|
||
|
'Content-Type': 'application/json',
|
||
|
};
|
||
|
}
|
||
|
|
||
|
Future<http.Response> post(String query, [Map<String, dynamic> 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<String, dynamic> querydict, [int indent = 1]) {
|
||
|
String generateQueryString(Map<String, dynamic> querydict, [int indent = 1]) {
|
||
|
var queryString = '';
|
||
|
querydict.forEach((key, value) {
|
||
|
if (value == null) {
|
||
|
queryString += ' ' * indent + '$key\n';
|
||
|
} else if (value is Map<String, dynamic>) {
|
||
|
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<String> parts = input.split('.');
|
||
|
List<String> capitalizedParts = parts.map((part) {
|
||
|
if (part.isNotEmpty) {
|
||
|
return part[0].toUpperCase() + part.substring(1);
|
||
|
} else {
|
||
|
return '';
|
||
|
}
|
||
|
}).toList();
|
||
|
return capitalizedParts.join();
|
||
|
}
|
||
|
|
||
|
|
||
|
Future<Map<String, dynamic>> browse({required int id, Map<String, dynamic> 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<List<dynamic>> search({List<List<dynamic>> domain = const [], String order = 'name', int limit = 80, int offset = 0, Map<String, dynamic> 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<Map<String, dynamic>> create({Map<String, dynamic> values = const {}, Map<String, dynamic> 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<Map<String, dynamic>> write({required int id, required Map<String, dynamic> values, Map<String, dynamic> 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<Map<String, dynamic>> delete({required int id, Map<String, dynamic> 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<Map<String, dynamic>> methodExecute(int id, String methodName, Map<String, dynamic> 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<dynamic> makeApiLoginRequest({required String username,required String password, required baseEndpoint, required authEndpoint}) async {
|
||
|
Map<String, dynamic> jsonData = {
|
||
|
'base_endpoint': baseEndpoint,
|
||
|
};
|
||
|
String basicAuth = 'Basic ' + base64Encode(utf8.encode('$username:$password'));
|
||
|
Map<String, String> 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': '<h3>Comment Here</h3>',
|
||
|
// // '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.
|
||
|
// }
|