From 8ad7e19ef4f13cc47c78041f02eddd57400b2b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20S=CC=A7eref=20Kayal=C4=B1?= Date: Wed, 30 Apr 2025 17:49:46 +0300 Subject: [PATCH 1/3] no message --- packages/dart/example/main.dart | 2 + packages/dart/lib/parse_server_sdk.dart | 55 +------------------ .../dart/lib/src/network/parse_aggregate.dart | 30 ++++++++++ .../lib/src/network/parse_http_client.dart | 17 +++++- packages/dart/lib/src/utils/url_replace.dart | 24 ++++++++ 5 files changed, 72 insertions(+), 56 deletions(-) create mode 100644 packages/dart/lib/src/network/parse_aggregate.dart create mode 100644 packages/dart/lib/src/utils/url_replace.dart diff --git a/packages/dart/example/main.dart b/packages/dart/example/main.dart index ce96602d3..3ef6f8254 100644 --- a/packages/dart/example/main.dart +++ b/packages/dart/example/main.dart @@ -14,6 +14,8 @@ Future main() async { ..set('Name', 'Ketogenic') ..set('Fat', 65); + // ParseAggregate('className', pipeline: {}).execute(); + var response = await dietPlan.save(); if (response.success) { diff --git a/packages/dart/lib/parse_server_sdk.dart b/packages/dart/lib/parse_server_sdk.dart index 3b27e0560..4f4e57141 100644 --- a/packages/dart/lib/parse_server_sdk.dart +++ b/packages/dart/lib/parse_server_sdk.dart @@ -11,6 +11,7 @@ import 'package:cross_file/cross_file.dart'; import 'package:dio/dio.dart'; import 'package:meta/meta.dart'; import 'package:mime/mime.dart'; +import 'package:parse_server_sdk/src/utils/url_replace.dart'; import 'package:path/path.dart' as path; import 'package:sembast/sembast.dart'; import 'package:sembast/sembast_io.dart'; @@ -29,111 +30,59 @@ export 'src/network/parse_dio_client.dart'; export 'src/network/parse_http_client.dart'; part 'src/base/parse_constants.dart'; - part 'src/data/parse_core_data.dart'; - part 'src/data/parse_subclass_handler.dart'; - part 'src/enums/parse_enum_api_rq.dart'; - part 'src/network/options.dart'; - +part 'src/network/parse_aggregate.dart'; part 'src/network/parse_client.dart'; - part 'src/network/parse_connectivity.dart'; - part 'src/network/parse_live_query.dart'; - part 'src/network/parse_query.dart'; - part 'src/objects/parse_acl.dart'; - part 'src/objects/parse_array.dart'; - part 'src/objects/parse_base.dart'; - part 'src/objects/parse_cloneable.dart'; - part 'src/objects/parse_config.dart'; - part 'src/objects/parse_error.dart'; - part 'src/objects/parse_exception.dart'; - part 'src/objects/parse_file.dart'; - part 'src/objects/parse_file_base.dart'; - part 'src/objects/parse_file_web.dart'; - part 'src/objects/parse_function.dart'; - part 'src/objects/parse_geo_point.dart'; - part 'src/objects/parse_installation.dart'; - part 'src/objects/parse_number.dart'; - part 'src/objects/parse_object.dart'; - part 'src/objects/parse_operation/parse_add_operation.dart'; - part 'src/objects/parse_operation/parse_add_relation_operation.dart'; - part 'src/objects/parse_operation/parse_add_unique_operation.dart'; - part 'src/objects/parse_operation/parse_increment_operation.dart'; - part 'src/objects/parse_operation/parse_operation.dart'; - part 'src/objects/parse_operation/parse_remove_operation.dart'; - part 'src/objects/parse_operation/parse_remove_relation_operation.dart'; - part 'src/objects/parse_relation.dart'; - part 'src/objects/parse_response.dart'; - part 'src/objects/parse_save_state_aware_child.dart'; - part 'src/objects/parse_session.dart'; - part 'src/objects/parse_user.dart'; - part 'src/objects/parse_x_file.dart'; - part 'src/objects/response/parse_error_response.dart'; - part 'src/objects/response/parse_exception_response.dart'; - part 'src/objects/response/parse_response_builder.dart'; - part 'src/objects/response/parse_response_utils.dart'; - part 'src/objects/response/parse_success_no_results.dart'; - part 'src/storage/core_store.dart'; - part 'src/storage/core_store_memory.dart'; - part 'src/storage/core_store_sem_impl.dart'; - part 'src/storage/xxtea_codec.dart'; - part 'src/utils/parse_date_format.dart'; - part 'src/utils/parse_decoder.dart'; - part 'src/utils/parse_encoder.dart'; - part 'src/utils/parse_live_list.dart'; - part 'src/utils/parse_logger.dart'; - part 'src/utils/parse_login_helpers.dart'; - part 'src/utils/parse_utils.dart'; - part 'src/utils/valuable.dart'; class Parse { diff --git a/packages/dart/lib/src/network/parse_aggregate.dart b/packages/dart/lib/src/network/parse_aggregate.dart new file mode 100644 index 000000000..5f4ac370d --- /dev/null +++ b/packages/dart/lib/src/network/parse_aggregate.dart @@ -0,0 +1,30 @@ +part of '../../parse_server_sdk.dart'; + +class ParseAggregate { + final String className; + final Map pipeline; + final bool? debug; + final ParseClient? client; + final bool? autoSendSessionId; + final String? parseClassName; + + ParseAggregate(this.className,{required this.pipeline,this.debug, this.client, this.autoSendSessionId, this.parseClassName}); + + Future execute() async { + if(pipeline.isEmpty){ + throw ArgumentError('pipeline must not be empty. Please add pipeline operations to aggregate data. Example: {"\$group": {"_id": "\$userId", "totalScore": {"\$sum": "\$score"}}} '); + } + final debugBool = isDebugEnabled(objectLevelDebug: debug); + final result = await ParseHTTPClient().get( + '${ParseCoreData().serverUrl}$keyEndPointAggregate/$className', + replace: UrlReplace(queryParameters: pipeline) + ); + return handleResponse( + this, + result, + ParseApiRQ.get, + debugBool, + parseClassName ?? 'ParseBase', + ); + } +} diff --git a/packages/dart/lib/src/network/parse_http_client.dart b/packages/dart/lib/src/network/parse_http_client.dart index 5b1b9795d..7ea1a27d7 100644 --- a/packages/dart/lib/src/network/parse_http_client.dart +++ b/packages/dart/lib/src/network/parse_http_client.dart @@ -1,9 +1,9 @@ import 'dart:convert'; -import 'package:universal_io/io.dart'; import 'package:http/http.dart' as http; - import 'package:parse_server_sdk/parse_server_sdk.dart'; +import 'package:parse_server_sdk/src/utils/url_replace.dart'; +import 'package:universal_io/io.dart'; import 'http_client_io.dart' if (dart.library.js) 'http_client_js.dart'; @@ -30,9 +30,20 @@ class ParseHTTPClient extends ParseClient { String path, { ParseNetworkOptions? options, ProgressCallback? onReceiveProgress, + UrlReplace? replace }) async { final http.Response response = await _client.get( - Uri.parse(path), + replace != null ? Uri.parse(path).replace( + scheme:replace.scheme, + userInfo:replace.userInfo, + host:replace.host, + port:replace.port, + path:replace.path, + pathSegments:replace.pathSegments, + query:replace.query, + queryParameters:replace.queryParameters, + fragment:replace.fragment, + ): Uri.parse(path), headers: options?.headers, ); return ParseNetworkResponse( diff --git a/packages/dart/lib/src/utils/url_replace.dart b/packages/dart/lib/src/utils/url_replace.dart new file mode 100644 index 000000000..9a0a1e0e1 --- /dev/null +++ b/packages/dart/lib/src/utils/url_replace.dart @@ -0,0 +1,24 @@ +class UrlReplace{ + String? scheme; + String? userInfo; + String? host; + int? port; + String? path; + Iterable? pathSegments; + String? query; + Map? queryParameters; + String? fragment; + + UrlReplace({ + this.scheme, + this.userInfo, + this.host, + this.port, + this.path, + this.pathSegments, + this.query, + this.queryParameters, + this.fragment, + }); + +} \ No newline at end of file From e65a3f560918085c2c28fbc986b44337e2ca0612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20S=CC=A7eref=20Kayal=C4=B1?= Date: Wed, 30 Apr 2025 18:25:07 +0300 Subject: [PATCH 2/3] packages updated --- packages/dart/pubspec.yaml | 8 ++++---- packages/flutter/pubspec.yaml | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/dart/pubspec.yaml b/packages/dart/pubspec.yaml index ae668f690..82424aa4c 100644 --- a/packages/dart/pubspec.yaml +++ b/packages/dart/pubspec.yaml @@ -24,7 +24,7 @@ dependencies: # Networking dio: ^5.7.0 http: ^1.2.0 - web_socket_channel: ^2.4.3 + web_socket_channel: ^3.0.3 #Database sembast: ^3.6.0 @@ -34,15 +34,15 @@ dependencies: uuid: ^4.5.1 meta: ^1.16.0 path: ^1.9.0 - mime: ^1.0.0 - timezone: ^0.9.4 + mime: ^2.0.0 + timezone: ^0.10.1 universal_io: ^2.2.2 xxtea: ^2.1.0 collection: ^1.18.0 cross_file: ^0.3.3+8 dev_dependencies: - lints: ^4.0.0 + lints: ^5.1.1 # Testing build_runner: ^2.4.9 diff --git a/packages/flutter/pubspec.yaml b/packages/flutter/pubspec.yaml index 21f3d0a46..059c22983 100644 --- a/packages/flutter/pubspec.yaml +++ b/packages/flutter/pubspec.yaml @@ -25,7 +25,7 @@ dependencies: flutter: sdk: flutter - parse_server_sdk: ^6.4.0 + parse_server_sdk: ^8.0.0 # Uncomment for local testing #parse_server_sdk: # path: ../dart @@ -40,14 +40,14 @@ dependencies: # Utils path_provider: ^2.1.4 - package_info_plus: ^5.0.1 + package_info_plus: ^8.3.0 path: ^1.8.3 dev_dependencies: flutter_test: sdk: flutter - flutter_lints: ^4.0.0 + flutter_lints: ^5.0.0 path_provider_platform_interface: ^2.1.2 plugin_platform_interface: ^2.1.8 From c093ff1387942452505ddd72aabc227ec2344c72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mehmet=20S=CC=A7eref=20Kayal=C4=B1?= Date: Wed, 30 Apr 2025 21:53:34 +0300 Subject: [PATCH 3/3] Aggregate done! --- packages/dart/example/main.dart | 8 +++++++- .../dart/lib/src/network/parse_aggregate.dart | 14 +++++++++----- .../dart/lib/src/network/parse_http_client.dart | 15 ++------------- packages/flutter/example/.gitignore | 2 ++ 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/packages/dart/example/main.dart b/packages/dart/example/main.dart index 3ef6f8254..8f0b03a35 100644 --- a/packages/dart/example/main.dart +++ b/packages/dart/example/main.dart @@ -14,7 +14,7 @@ Future main() async { ..set('Name', 'Ketogenic') ..set('Fat', 65); - // ParseAggregate('className', pipeline: {}).execute(); + var response = await dietPlan.save(); @@ -22,4 +22,10 @@ Future main() async { dietPlan = response.results?.first; print("Response received successfully"); } + + final res = await ParseAggregate('DietPlan', pipeline: { + r'$match': {'Name': 'Ketogenic'} + }).execute(); + + print(res); } diff --git a/packages/dart/lib/src/network/parse_aggregate.dart b/packages/dart/lib/src/network/parse_aggregate.dart index 5f4ac370d..f30b7ba32 100644 --- a/packages/dart/lib/src/network/parse_aggregate.dart +++ b/packages/dart/lib/src/network/parse_aggregate.dart @@ -2,7 +2,7 @@ part of '../../parse_server_sdk.dart'; class ParseAggregate { final String className; - final Map pipeline; + Map pipeline; final bool? debug; final ParseClient? client; final bool? autoSendSessionId; @@ -11,16 +11,20 @@ class ParseAggregate { ParseAggregate(this.className,{required this.pipeline,this.debug, this.client, this.autoSendSessionId, this.parseClassName}); Future execute() async { + Map _pipeline={}; if(pipeline.isEmpty){ throw ArgumentError('pipeline must not be empty. Please add pipeline operations to aggregate data. Example: {"\$group": {"_id": "\$userId", "totalScore": {"\$sum": "\$score"}}} '); } + else{ + _pipeline.addAll({'pipeline':jsonEncode([pipeline])}); + } final debugBool = isDebugEnabled(objectLevelDebug: debug); - final result = await ParseHTTPClient().get( - '${ParseCoreData().serverUrl}$keyEndPointAggregate/$className', - replace: UrlReplace(queryParameters: pipeline) + final result = await ParseObject(className)._client.get( + Uri.parse('${ParseCoreData().serverUrl}$keyEndPointAggregate$className').replace(queryParameters: _pipeline).toString(), ); + print('result >>> ${result.data}'); return handleResponse( - this, + ParseObject(className), result, ParseApiRQ.get, debugBool, diff --git a/packages/dart/lib/src/network/parse_http_client.dart b/packages/dart/lib/src/network/parse_http_client.dart index 7ea1a27d7..1732ec687 100644 --- a/packages/dart/lib/src/network/parse_http_client.dart +++ b/packages/dart/lib/src/network/parse_http_client.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'package:http/http.dart' as http; import 'package:parse_server_sdk/parse_server_sdk.dart'; -import 'package:parse_server_sdk/src/utils/url_replace.dart'; import 'package:universal_io/io.dart'; import 'http_client_io.dart' if (dart.library.js) 'http_client_js.dart'; @@ -30,20 +29,10 @@ class ParseHTTPClient extends ParseClient { String path, { ParseNetworkOptions? options, ProgressCallback? onReceiveProgress, - UrlReplace? replace }) async { + final http.Response response = await _client.get( - replace != null ? Uri.parse(path).replace( - scheme:replace.scheme, - userInfo:replace.userInfo, - host:replace.host, - port:replace.port, - path:replace.path, - pathSegments:replace.pathSegments, - query:replace.query, - queryParameters:replace.queryParameters, - fragment:replace.fragment, - ): Uri.parse(path), + Uri.parse(path), headers: options?.headers, ); return ParseNetworkResponse( diff --git a/packages/flutter/example/.gitignore b/packages/flutter/example/.gitignore index 24476c5d1..6c319542b 100644 --- a/packages/flutter/example/.gitignore +++ b/packages/flutter/example/.gitignore @@ -5,9 +5,11 @@ *.swp .DS_Store .atom/ +.build/ .buildlog/ .history .svn/ +.swiftpm/ migrate_working_dir/ # IntelliJ related