diff --git a/.gitignore b/.gitignore index 4667876dd..39010478a 100644 --- a/.gitignore +++ b/.gitignore @@ -102,6 +102,7 @@ unlinked_spec.ds # macOS **/macos/Flutter/GeneratedPluginRegistrant.swift +**/macos/flutter/ephemeral/ # Linux **/linux/flutter/ephemeral @@ -120,3 +121,4 @@ app.*.symbols !**/ios/**/default.perspectivev3 !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages !/dev/ci/**/Gemfile.lock + diff --git a/packages/dart/CHANGELOG.md b/packages/dart/CHANGELOG.md index b90e82bba..e8ddb6d81 100644 --- a/packages/dart/CHANGELOG.md +++ b/packages/dart/CHANGELOG.md @@ -1,3 +1,13 @@ +## [3.1.2](https://github.com/parse-community/Parse-SDK-Flutter/compare/dart-3.1.1...dart-3.1.2) (2022-07-01) + +### Bug Fixes + +* unhandled exception in `ParseRelation`, type `ParseObject` is not a subtype of type ([#696](https://github.com/parse-community/Parse-SDK-Flutter/issues/696)) +* error in progress callback ([#679](https://github.com/parse-community/Parse-SDK-Flutter/issues/679)) +* incorrect return type when calling `first()` ([#661](https://github.com/parse-community/Parse-SDK-Flutter/issues/661)) +* error in `ParseLiveListWidget` when enabling `lazyloading` ([#653](https://github.com/parse-community/Parse-SDK-Flutter/issues/653)) +* unexpected null value after call `user.logout()` ([#770](https://github.com/parse-community/Parse-SDK-Flutter/issues/770)) + ## [3.1.1](https://github.com/parse-community/Parse-SDK-Flutter/compare/V3.1.0...dart-3.1.1) (2022-05-30) ### Refactors diff --git a/packages/dart/README.md b/packages/dart/README.md index a2f2c695b..2e0477b21 100644 --- a/packages/dart/README.md +++ b/packages/dart/README.md @@ -272,7 +272,7 @@ This method returns an `Future` that either resolves in an error (equivalent of Choosing between `query()` and `find()` comes down to personal preference. Both methods can be used for querying a `ParseQuery`, just the output method differs. -Similar to `find()` the `QueryBuilder` also has a function called `Future? first()`. Just like `find()` `first()` is just a convenience method that makes querying the first object satisfying the query simpler. `first()` returns an `Future`, that resoles in an error or the first object matching the query. In case no object satisfies the query, the result will be `null`. +Similar to `find()` the `QueryBuilder` also has a function called `Future first()`. Just like `find()` `first()` is just a convenience method that makes querying the first object satisfying the query simpler. `first()` returns an `Future`, that resoles in an error or the first object matching the query. In case no object satisfies the query, the result will be `null`. ## Complex Queries You can create complex queries to really put your database to the test: @@ -739,6 +739,13 @@ You can retrieve the ACL list of an object using: ParseACL parseACL = parseObject.getACL(); ``` +To set the ACL to `ParseRole` use: + +```dart +parseACL.setReadAccess(userId: "role:ROLE_NAME", allowed: true); +parseACL.setWriteAccess(userId: "role:ROLE_NAME", allowed: true); + +``` ## Config The SDK supports Parse Config. A map of all configs can be grabbed from the server by calling : ```dart diff --git a/packages/dart/lib/src/base/parse_constants.dart b/packages/dart/lib/src/base/parse_constants.dart index a1c96cf18..73b230cd1 100644 --- a/packages/dart/lib/src/base/parse_constants.dart +++ b/packages/dart/lib/src/base/parse_constants.dart @@ -1,7 +1,7 @@ part of flutter_parse_sdk; // Library -const String keySdkVersion = '3.1.0'; +const String keySdkVersion = '3.1.2'; const String keyLibraryName = 'Flutter Parse SDK'; // End Points diff --git a/packages/dart/lib/src/network/parse_query.dart b/packages/dart/lib/src/network/parse_query.dart index 9d5bde048..92bc647b4 100644 --- a/packages/dart/lib/src/network/parse_query.dart +++ b/packages/dart/lib/src/network/parse_query.dart @@ -536,7 +536,7 @@ class QueryBuilder { /// Find the first object that satisfies the query. /// Returns null, if no object is found. - Future? first() async { + Future first() async { ParseResponse parseResponse = await (QueryBuilder.copy(this)..setLimit(1)).query(); if (parseResponse.success) { diff --git a/packages/dart/lib/src/objects/parse_file.dart b/packages/dart/lib/src/objects/parse_file.dart index fe223d6fa..5e9086d19 100644 --- a/packages/dart/lib/src/objects/parse_file.dart +++ b/packages/dart/lib/src/objects/parse_file.dart @@ -71,6 +71,7 @@ class ParseFile extends ParseFileBase { final Map headers = { HttpHeaders.contentTypeHeader: mime(file!.path) ?? 'application/octet-stream', + HttpHeaders.contentLengthHeader: '${file!.lengthSync()}', }; try { final String uri = ParseCoreData().serverUrl + _path; diff --git a/packages/dart/lib/src/objects/parse_relation.dart b/packages/dart/lib/src/objects/parse_relation.dart index 7c117e5d4..678414821 100644 --- a/packages/dart/lib/src/objects/parse_relation.dart +++ b/packages/dart/lib/src/objects/parse_relation.dart @@ -29,7 +29,7 @@ class ParseRelation { Set? _knownObjects = {}; QueryBuilder getQuery() { - return QueryBuilder(ParseObject(_targetClass!)) + return QueryBuilder(ParseCoreData.instance.createObject(_targetClass!)) ..whereRelatedTo(_key, _parent!.parseClassName, _parentObjectId); } diff --git a/packages/dart/lib/src/objects/parse_user.dart b/packages/dart/lib/src/objects/parse_user.dart index 63a24e9ef..e4c15bfc6 100644 --- a/packages/dart/lib/src/objects/parse_user.dart +++ b/packages/dart/lib/src/objects/parse_user.dart @@ -315,7 +315,16 @@ class ParseUser extends ParseObject implements ParseCloneable { /// server. Will also delete the local user data unless /// deleteLocalUserData is false. Future logout({bool deleteLocalUserData = true}) async { - final String sessionId = ParseCoreData().sessionId!; + final String? sessionId = ParseCoreData().sessionId; + + if (sessionId == null) { + return await _handleResponse( + this, + ParseNetworkResponse(data: "{}", statusCode: 200), + ParseApiRQ.logout, + _debug, + parseClassName); + } forgetLocalSession(); diff --git a/packages/dart/lib/src/utils/parse_live_list.dart b/packages/dart/lib/src/utils/parse_live_list.dart index 5547d62e5..a572afdb9 100644 --- a/packages/dart/lib/src/utils/parse_live_list.dart +++ b/packages/dart/lib/src/utils/parse_live_list.dart @@ -144,7 +144,9 @@ class ParseLiveList { }), ); } - query.keysToReturn(keys); + if (keys.isNotEmpty) { + query.keysToReturn(keys); + } } return await query.query(); } diff --git a/packages/dart/pubspec.yaml b/packages/dart/pubspec.yaml index 428f4a8d4..5b73def94 100644 --- a/packages/dart/pubspec.yaml +++ b/packages/dart/pubspec.yaml @@ -1,31 +1,34 @@ name: parse_server_sdk description: Dart plugin for Parse Server, (https://parseplatform.org), (https://back4app.com) -version: 3.1.1 -homepage: https://github.com/phillwiggins/flutter_parse_sdk +version: 3.1.2 +homepage: https://github.com/parse-community/Parse-SDK-Flutter environment: sdk: ">=2.12.0 <3.0.0" dependencies: # Networking - dio: ^4.0.0 - http: ^0.13.3 - web_socket_channel: ^2.1.0 + dio: ^4.0.6 + http: ^0.13.4 + web_socket_channel: ^2.2.0 #Database - sembast: ^3.1.0+2 - sembast_web: ^2.0.0+2 + sembast: ^3.2.0 + sembast_web: ^2.0.1+1 xxtea: ^2.1.0 # Utils - uuid: ^3.0.4 - meta: ^1.3.0 + uuid: ^3.0.6 + meta: ^1.7.0 path: ^1.8.0 mime_type: ^1.0.0 +dependency_overrides: + path: ^1.8.2 # required for transitive use only + dev_dependencies: lints: ^1.0.1 # Testing - build_runner: ^2.0.5 - mockito: ^5.0.10 - test: ^1.17.9 + build_runner: ^2.1.11 + mockito: ^5.2.0 + test: ^1.21.1 diff --git a/packages/flutter/CHANGELOG.md b/packages/flutter/CHANGELOG.md index 9faf40d91..8e0857d42 100644 --- a/packages/flutter/CHANGELOG.md +++ b/packages/flutter/CHANGELOG.md @@ -1,3 +1,12 @@ +## [3.1.3](https://github.com/parse-community/Parse-SDK-Flutter/compare/flutter-3.1.2...flutter-3.1.3) (2022-07-01) + +### Bug Fixes + +* old version of `connectivity_plus package` ([#717](https://github.com/parse-community/Parse-SDK-Flutter/issues/717)) +* dependency `package_info_plus` does not work in web ([#714](https://github.com/parse-community/Parse-SDK-Flutter/issues/714)) +* missing plugin exception, no implementation found for method `getAll` ([#712](https://github.com/parse-community/Parse-SDK-Flutter/issues/712)) + + ## [3.1.2](https://github.com/parse-community/Parse-SDK-Flutter/compare/flutter-3.1.1...flutter-3.1.2) (2022-05-30) ### Refactors diff --git a/packages/flutter/README.md b/packages/flutter/README.md index 41792c96c..563af2194 100644 --- a/packages/flutter/README.md +++ b/packages/flutter/README.md @@ -80,6 +80,19 @@ Due to Cross-origin resource sharing (CORS) restrictions, this requires adding ` When running directly via docker, set the env var `PARSE_SERVER_ALLOW_HEADERS=X-Parse-Installation-Id`. When running via express, set [ParseServerOptions](https://parseplatform.org/parse-server/api/master/ParseServerOptions.html) `allowHeaders: ['X-Parse-Installation-Id']`. +#### Desktop Support (macOS) +The security entitlements posed by the macOS framework require that your app is granted permission to open outgoing network connections, so that the Parse Flutter SDK can communicate with Parse Server. To grant this permission, add the following lines: +``` +com.apple.security.network.client + +``` +to the following files: +``` +/macOS/Runner/Release.entitlements +/macOS/Runner/DebugProfile.entitlements +``` +to help the Parse SDK for Flutter communicate with the Web to access the server and send/retrive data. + #### Network client By default, this SDK uses the `ParseHTTPClient`. Another option is use `ParseDioClient`. This client supports the most features (for example a progress callback at the file upload), but a benchmark has shown, that dio is slower than http on web. @@ -296,7 +309,7 @@ This method returns an `Future` that either resolves in an error (equivalent of Choosing between `query()` and `find()` comes down to personal preference. Both methods can be used for querying a `ParseQuery`, just the output method differs. -Similar to `find()` the `QueryBuilder` also has a function called `Future? first()`. Just like `find()` `first()` is just a convenience method that makes querying the first object satisfying the query simpler. `first()` returns an `Future`, that resoles in an error or the first object matching the query. In case no object satisfies the query, the result will be `null`. +Similar to `find()` the `QueryBuilder` also has a function called `Future first()`. Just like `find()` `first()` is just a convenience method that makes querying the first object satisfying the query simpler. `first()` returns an `Future`, that resoles in an error or the first object matching the query. In case no object satisfies the query, the result will be `null`. ## Complex Queries @@ -844,6 +857,13 @@ You can retrieve the ACL list of an object using: ParseACL parseACL = parseObject.getACL(); ``` +To set the ACL to `ParseRole` use: + +```dart +parseACL.setReadAccess(userId: "role:ROLE_NAME", allowed: true); +parseACL.setWriteAccess(userId: "role:ROLE_NAME", allowed: true); +``` + ## Config The SDK supports Parse Config. A map of all configs can be grabbed from the server by calling : ```dart diff --git a/packages/flutter/example/linux/flutter/generated_plugin_registrant.cc b/packages/flutter/example/linux/flutter/generated_plugin_registrant.cc index d38195aa0..e71a16d23 100644 --- a/packages/flutter/example/linux/flutter/generated_plugin_registrant.cc +++ b/packages/flutter/example/linux/flutter/generated_plugin_registrant.cc @@ -2,6 +2,8 @@ // Generated file. Do not edit. // +// clang-format off + #include "generated_plugin_registrant.h" diff --git a/packages/flutter/example/linux/flutter/generated_plugin_registrant.h b/packages/flutter/example/linux/flutter/generated_plugin_registrant.h index 9bf747894..e0f0a47bc 100644 --- a/packages/flutter/example/linux/flutter/generated_plugin_registrant.h +++ b/packages/flutter/example/linux/flutter/generated_plugin_registrant.h @@ -2,6 +2,8 @@ // Generated file. Do not edit. // +// clang-format off + #ifndef GENERATED_PLUGIN_REGISTRANT_ #define GENERATED_PLUGIN_REGISTRANT_ diff --git a/packages/flutter/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig b/packages/flutter/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig deleted file mode 100644 index 05050e176..000000000 --- a/packages/flutter/example/macos/Flutter/ephemeral/Flutter-Generated.xcconfig +++ /dev/null @@ -1,11 +0,0 @@ -// This is a generated file; do not edit or check into version control. -FLUTTER_ROOT=C:\flutter -FLUTTER_APPLICATION_PATH=D:\GithubProjects\parse\Parse-SDK-Flutter\packages\flutter\example -FLUTTER_BUILD_DIR=build -FLUTTER_BUILD_NAME=1.0.0 -FLUTTER_BUILD_NUMBER=1 -EXCLUDED_ARCHS=arm64 -DART_OBFUSCATION=false -TRACK_WIDGET_CREATION=false -TREE_SHAKE_ICONS=false -PACKAGE_CONFIG=.packages diff --git a/packages/flutter/example/macos/Flutter/ephemeral/flutter_export_environment.sh b/packages/flutter/example/macos/Flutter/ephemeral/flutter_export_environment.sh deleted file mode 100644 index 6f35a01d7..000000000 --- a/packages/flutter/example/macos/Flutter/ephemeral/flutter_export_environment.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -# This is a generated file; do not edit or check into version control. -export "FLUTTER_ROOT=C:\flutter" -export "FLUTTER_APPLICATION_PATH=D:\GithubProjects\parse\Parse-SDK-Flutter\packages\flutter\example" -export "FLUTTER_BUILD_DIR=build" -export "FLUTTER_BUILD_NAME=1.0.0" -export "FLUTTER_BUILD_NUMBER=1" -export "EXCLUDED_ARCHS=arm64" -export "DART_OBFUSCATION=false" -export "TRACK_WIDGET_CREATION=false" -export "TREE_SHAKE_ICONS=false" -export "PACKAGE_CONFIG=.packages" diff --git a/packages/flutter/lib/parse_server_sdk.dart b/packages/flutter/lib/parse_server_sdk.dart index a13cc55c1..441be678b 100644 --- a/packages/flutter/lib/parse_server_sdk.dart +++ b/packages/flutter/lib/parse_server_sdk.dart @@ -8,8 +8,9 @@ import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:flutter/material.dart'; import 'package:package_info_plus/package_info_plus.dart'; import 'package:parse_server_sdk/parse_server_sdk.dart' as sdk; +import 'package:parse_server_sdk_flutter/src/storage/core_store_directory_io.dart' + if (dart.library.html) 'package:parse_server_sdk_flutter/src/storage/core_store_directory_web.dart'; import 'package:path/path.dart' as path; -import 'package:path_provider/path_provider.dart'; import 'package:sembast/sembast.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -90,8 +91,8 @@ class Parse extends sdk.Parse parseFileConstructor: parseFileConstructor, liveListRetryIntervals: liveListRetryIntervals, connectivityProvider: connectivityProvider ?? this, - fileDirectory: fileDirectory ?? - (!sdk.parseIsWeb ? (await getTemporaryDirectory()).path : null), + fileDirectory: + fileDirectory ?? (await CoreStoreDirectory().getTempDirectory()), appResumedStream: appResumedStream ?? _appResumedStreamController.stream, clientCreator: clientCreator, ) as Parse; @@ -136,14 +137,7 @@ class Parse extends sdk.Parse Future dbDirectory() async { String dbDirectory = ''; - if (!sdk.parseIsWeb && - (Platform.isIOS || - Platform.isAndroid || - Platform.isMacOS || - Platform.isLinux || - Platform.isWindows)) { - dbDirectory = (await getApplicationDocumentsDirectory()).path; - } + dbDirectory = await CoreStoreDirectory().getDatabaseDirectory(); return path.join('$dbDirectory/parse', 'parse.db'); } diff --git a/packages/flutter/lib/src/storage/core_store_directory_io.dart b/packages/flutter/lib/src/storage/core_store_directory_io.dart new file mode 100644 index 000000000..325939228 --- /dev/null +++ b/packages/flutter/lib/src/storage/core_store_directory_io.dart @@ -0,0 +1,11 @@ +import 'package:path_provider/path_provider.dart'; + +class CoreStoreDirectory { + Future getDatabaseDirectory() async { + return (await getApplicationDocumentsDirectory()).path; + } + + Future getTempDirectory() async { + return (await getTemporaryDirectory()).path; + } +} diff --git a/packages/flutter/lib/src/storage/core_store_directory_web.dart b/packages/flutter/lib/src/storage/core_store_directory_web.dart new file mode 100644 index 000000000..a62268c91 --- /dev/null +++ b/packages/flutter/lib/src/storage/core_store_directory_web.dart @@ -0,0 +1,9 @@ +class CoreStoreDirectory { + Future getDatabaseDirectory() async { + return ''; + } + + Future getTempDirectory() async { + return ''; + } +} diff --git a/packages/flutter/pubspec.yaml b/packages/flutter/pubspec.yaml index eb9c8688a..1e4ab280b 100644 --- a/packages/flutter/pubspec.yaml +++ b/packages/flutter/pubspec.yaml @@ -1,7 +1,7 @@ name: parse_server_sdk_flutter description: Flutter plugin for Parse Server, (https://parseplatform.org), (https://back4app.com) -version: 3.1.2 -homepage: https://github.com/phillwiggins/flutter_parse_sdk +version: 3.1.3 +homepage: https://github.com/parse-community/Parse-SDK-Flutter environment: sdk: ">=2.12.0 <3.0.0" @@ -10,36 +10,32 @@ dependencies: flutter: sdk: flutter - # Uncomment for Release version - parse_server_sdk: ^3.1.1 - + parse_server_sdk: ^3.1.2 # Uncomment for local testing #parse_server_sdk: # path: ../dart - # Uncomment for test with Github Branch - #parse_server_sdk: - # git: - # url: https://github.com/parse-community/Parse-SDK-Flutter.git - # ref: nullsafety - # path: packages/dart - # Networking - dio: ^4.0.0 - connectivity_plus: ^1.0.1 # only used in the flutter part + dio: ^4.0.6 + connectivity_plus: ^2.3.2 # only used in the flutter part #Database - shared_preferences: ^2.0.5 # only used in the flutter part + shared_preferences: ^2.0.15 # only used in the flutter part # Utils - path_provider: ^2.0.1 # only used in the flutter part - package_info_plus: ^1.0.0 # only used in the flutter part - sembast: ^3.0.0+4 # required for transitive use only - path: ^1.8.0 # required for transitive use only + path_provider: ^2.0.10 # only used in the flutter part + package_info_plus: ^1.4.2 # only used in the flutter part + sembast: ^3.2.0 + sembast_web: ^2.0.1+1 + path: ^1.8.1 # required for transitive use only + +dependency_overrides: + path: ^1.8.2 # required for transitive use only + platform: ^3.1.0 dev_dependencies: flutter_lints: ^1.0.4 # Testing flutter_test: sdk: flutter - mockito: ^5.0.10 + mockito: ^5.2.0 diff --git a/tools/flutter-dependencies.bat b/tools/flutter-dependencies.bat index 3728eecb1..62b47bf34 100644 --- a/tools/flutter-dependencies.bat +++ b/tools/flutter-dependencies.bat @@ -1,7 +1,8 @@ +call flutter config --no-analytics cd packages/dart -flutter pub get +call flutter pub get cd ../.. cd packages/flutter -flutter pub remove parse_server_sdk -flutter pub add parse_server_sdk --path ../dart -flutter pub get +call flutter pub remove parse_server_sdk +call flutter pub add parse_server_sdk --path ../dart +call flutter pub get \ No newline at end of file diff --git a/tools/flutter-dependencies.sh b/tools/flutter-dependencies.sh old mode 100755 new mode 100644