Skip to content

Commit 9c76d67

Browse files
author
FNPCMDs
authored
Merge pull request #1 from parse-community/release/1.0.28
Release/1.0.28
2 parents 7462a01 + f07909f commit 9c76d67

20 files changed

+771
-907
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ await Parse().initialize(
2727
```
2828

2929
If you want to use secure storage or use the Flutter web/desktop SDK, please change to the below instance of CoreStorage as it has no dependencies on Flutter.
30+
31+
**The `CoreStoreSembastImp` does not encrypt the data!** (Web is not safe anyway. Encrypt fields manually as needed.)
3032
```dart
3133
3234
await Parse().initialize(

example/pubspec.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ dependencies:
1111
sembast: ^2.0.1
1212
shared_preferences: ^0.5.0
1313

14+
path_provider: ^1.6.14
15+
1416
dev_dependencies:
1517
parse_server_sdk:
1618
path: ../

lib/parse_server_sdk.dart

Lines changed: 146 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -1,152 +1,197 @@
1-
library flutter_parse_sdk;
2-
31
import 'dart:async';
4-
import 'dart:convert';
52
import 'dart:io';
6-
import 'dart:math';
7-
import 'dart:typed_data';
83
import 'dart:ui' as ui;
94

10-
import 'package:http/http.dart';
11-
import 'package:http/io_client.dart';
12-
import 'package:meta/meta.dart';
5+
import 'package:connectivity/connectivity.dart';
6+
import 'package:flutter/widgets.dart';
137
import 'package:package_info/package_info.dart';
148
import 'package:path/path.dart' as path;
159
import 'package:path_provider/path_provider.dart';
1610
import 'package:sembast/sembast.dart';
17-
import 'package:sembast/sembast_io.dart';
18-
import 'package:shared_preferences/shared_preferences.dart';
19-
import 'package:uuid/uuid.dart';
20-
import 'package:xxtea/xxtea.dart';
21-
22-
export 'src/network/parse_live_query.dart'
23-
if (dart.library.js) 'src/network/parse_live_query_web.dart';
24-
export 'src/utils/parse_live_list.dart';
25-
26-
part 'package:parse_server_sdk/src/data/core_store.dart';
27-
part 'package:parse_server_sdk/src/data/parse_subclass_handler.dart';
28-
part 'package:parse_server_sdk/src/objects/response/parse_error_response.dart';
29-
part 'package:parse_server_sdk/src/objects/response/parse_exception_response.dart';
30-
part 'package:parse_server_sdk/src/objects/response/parse_response_builder.dart';
31-
part 'package:parse_server_sdk/src/objects/response/parse_response_utils.dart';
32-
part 'package:parse_server_sdk/src/objects/response/parse_success_no_results.dart';
33-
part 'package:parse_server_sdk/src/storage/core_store_sem_impl.dart';
34-
part 'package:parse_server_sdk/src/storage/core_store_sp_impl.dart';
35-
part 'package:parse_server_sdk/src/storage/xxtea_codec.dart';
36-
part 'src/base/parse_constants.dart';
37-
part 'src/data/parse_core_data.dart';
38-
part 'src/enums/parse_enum_api_rq.dart';
39-
part 'src/network/parse_http_client.dart';
40-
part 'src/network/parse_query.dart';
41-
part 'src/objects/parse_acl.dart';
42-
part 'src/objects/parse_base.dart';
43-
part 'src/objects/parse_cloneable.dart';
44-
part 'src/objects/parse_config.dart';
45-
part 'src/objects/parse_error.dart';
46-
part 'src/objects/parse_file.dart';
47-
part 'src/objects/parse_file_base.dart';
48-
part 'src/objects/parse_file_web.dart';
49-
part 'src/objects/parse_function.dart';
50-
part 'src/objects/parse_geo_point.dart';
51-
part 'src/objects/parse_installation.dart';
52-
part 'src/objects/parse_merge.dart';
53-
part 'src/objects/parse_object.dart';
54-
part 'src/objects/parse_relation.dart';
55-
part 'src/objects/parse_response.dart';
56-
part 'src/objects/parse_session.dart';
57-
part 'src/objects/parse_user.dart';
58-
part 'src/utils/parse_date_format.dart';
59-
part 'src/utils/parse_decoder.dart';
60-
part 'src/utils/parse_encoder.dart';
61-
part 'src/utils/parse_file_extensions.dart';
62-
part 'src/utils/parse_logger.dart';
63-
part 'src/utils/parse_login_helpers.dart';
64-
part 'src/utils/parse_utils.dart';
65-
66-
class Parse {
67-
ParseCoreData data;
68-
bool _hasBeenInitialized = false;
6911

12+
import 'parse_server_sdk_dart.dart' as sdk;
13+
import 'src/storage/core_store_sp_impl.dart';
14+
15+
export 'parse_server_sdk_dart.dart' hide Parse, CoreStoreSembastImp;
16+
export 'src/storage/core_store_sp_impl.dart';
17+
export 'src/utils/parse_live_list_flutter.dart';
18+
19+
class Parse extends sdk.Parse
20+
with WidgetsBindingObserver
21+
implements sdk.ParseConnectivityProvider {
7022
/// To initialize Parse Server in your application
7123
///
7224
/// This should be initialized in MyApp() creation
7325
///
7426
/// ```
7527
/// Parse().initialize(
76-
// "PARSE_APP_ID",
77-
// "https://parse.myaddress.com/parse/,
78-
// masterKey: "asd23rjh234r234r234r",
79-
// debug: true,
80-
// liveQuery: true);
81-
// ```
28+
/// "PARSE_APP_ID",
29+
/// "https://parse.myaddress.com/parse/,
30+
/// masterKey: "asd23rjh234r234r234r",
31+
/// debug: true,
32+
/// liveQuery: true);
33+
/// ```
34+
/// [appName], [appVersion] and [appPackageName] are automatically set on Android and IOS, if they are not defined. You should provide a value on web.
35+
/// [fileDirectory] is not used on web
36+
@override
8237
Future<Parse> initialize(
8338
String appId,
8439
String serverUrl, {
8540
bool debug = false,
86-
String appName = '',
41+
String appName,
42+
String appVersion,
43+
String appPackageName,
44+
String locale,
8745
String liveQueryUrl,
8846
String clientKey,
8947
String masterKey,
9048
String sessionId,
9149
bool autoSendSessionId,
9250
SecurityContext securityContext,
93-
CoreStore coreStore,
94-
Map<String, ParseObjectConstructor> registeredSubClassMap,
95-
ParseUserConstructor parseUserConstructor,
96-
ParseFileConstructor parseFileConstructor,
51+
sdk.CoreStore coreStore,
52+
Map<String, sdk.ParseObjectConstructor> registeredSubClassMap,
53+
sdk.ParseUserConstructor parseUserConstructor,
54+
sdk.ParseFileConstructor parseFileConstructor,
9755
List<int> liveListRetryIntervals,
56+
sdk.ParseConnectivityProvider connectivityProvider,
57+
String fileDirectory,
58+
Stream<void> appResumedStream,
9859
}) async {
99-
final String url = removeTrailingSlash(serverUrl);
60+
if (!sdk.parseIsWeb && (appName == null || appVersion == null || appPackageName == null)) {
61+
final PackageInfo packageInfo = await PackageInfo.fromPlatform();
62+
appName ??= packageInfo.appName;
63+
appVersion ??= packageInfo.version;
64+
appPackageName ??= packageInfo.packageName;
65+
}
10066

101-
await ParseCoreData.init(
67+
return await super.initialize(
10268
appId,
103-
url,
69+
serverUrl,
10470
debug: debug,
10571
appName: appName,
72+
appVersion: appVersion,
73+
appPackageName: appPackageName,
74+
locale: locale ?? sdk.parseIsWeb
75+
? ui.window.locale.toString()
76+
: Platform.localeName,
10677
liveQueryUrl: liveQueryUrl,
107-
masterKey: masterKey,
10878
clientKey: clientKey,
79+
masterKey: masterKey,
10980
sessionId: sessionId,
11081
autoSendSessionId: autoSendSessionId,
11182
securityContext: securityContext,
112-
store: coreStore,
83+
coreStore: coreStore ??
84+
await CoreStoreSharedPrefsImp.getInstance(password: masterKey),
11385
registeredSubClassMap: registeredSubClassMap,
11486
parseUserConstructor: parseUserConstructor,
11587
parseFileConstructor: parseFileConstructor,
116-
liveListRetryIntervals: liveListRetryIntervals,
88+
connectivityProvider: connectivityProvider ?? this,
89+
fileDirectory: fileDirectory ?? (await getTemporaryDirectory()).path,
90+
appResumedStream: appResumedStream ?? _appResumedStreamController.stream,
11791
);
92+
}
11893

119-
_hasBeenInitialized = true;
94+
final StreamController<void> _appResumedStreamController =
95+
StreamController<void>();
96+
97+
@override
98+
Future<sdk.ParseConnectivityResult> checkConnectivity() async {
99+
//Connectivity works differently on web
100+
if (!sdk.parseIsWeb) {
101+
switch (await Connectivity().checkConnectivity()) {
102+
case ConnectivityResult.wifi:
103+
return sdk.ParseConnectivityResult.wifi;
104+
case ConnectivityResult.mobile:
105+
return sdk.ParseConnectivityResult.mobile;
106+
case ConnectivityResult.none:
107+
return sdk.ParseConnectivityResult.none;
108+
}
109+
}
110+
return sdk.ParseConnectivityResult.wifi;
111+
}
120112

121-
return this;
113+
@override
114+
Stream<sdk.ParseConnectivityResult> get connectivityStream {
115+
return Connectivity().onConnectivityChanged.map((ConnectivityResult event) {
116+
switch (event) {
117+
case ConnectivityResult.wifi:
118+
return sdk.ParseConnectivityResult.wifi;
119+
case ConnectivityResult.mobile:
120+
return sdk.ParseConnectivityResult.mobile;
121+
default:
122+
return sdk.ParseConnectivityResult.none;
123+
}
124+
});
122125
}
123126

124-
bool hasParseBeenInitialized() => _hasBeenInitialized;
127+
@override
128+
void didChangeAppLifecycleState(AppLifecycleState state) {
129+
_appResumedStreamController.sink.add(null);
130+
}
131+
}
125132

126-
Future<ParseResponse> healthCheck(
127-
{bool debug, ParseHTTPClient client, bool sendSessionIdByDefault}) async {
128-
ParseResponse parseResponse;
133+
class CoreStoreSembastImp implements sdk.CoreStoreSembastImp {
134+
CoreStoreSembastImp._();
129135

130-
final bool _debug = isDebugEnabled(objectLevelDebug: debug);
136+
static sdk.CoreStoreSembastImp _sembastImp;
131137

132-
final ParseHTTPClient _client = client ??
133-
ParseHTTPClient(
134-
sendSessionId:
135-
sendSessionIdByDefault ?? ParseCoreData().autoSendSessionId,
136-
securityContext: ParseCoreData().securityContext);
138+
static Future<sdk.CoreStore> getInstance({DatabaseFactory factory, String password}) async {
139+
if (_sembastImp == null) {
140+
String dbDirectory = '';
141+
if (!sdk.parseIsWeb &&
142+
(Platform.isIOS || Platform.isAndroid || Platform.isMacOS))
143+
dbDirectory = (await getApplicationDocumentsDirectory()).path;
144+
final String dbPath = path.join('$dbDirectory/parse', 'parse.db');
145+
_sembastImp ??= await sdk.CoreStoreSembastImp.getInstance(dbPath,
146+
factory: factory, password: password);
147+
}
148+
return CoreStoreSembastImp._();
149+
}
137150

138-
const String className = 'parseBase';
139-
const ParseApiRQ type = ParseApiRQ.healthCheck;
151+
@override
152+
Future<bool> clear() => _sembastImp.clear();
140153

141-
try {
142-
final Response response =
143-
await _client.get('${ParseCoreData().serverUrl}$keyEndPointHealth');
144-
parseResponse =
145-
handleResponse<Parse>(null, response, type, _debug, className);
146-
} on Exception catch (e) {
147-
parseResponse = handleException(e, type, _debug, className);
148-
}
154+
@override
155+
Future<bool> containsKey(String key) => _sembastImp.containsKey(key);
149156

150-
return parseResponse;
151-
}
157+
@override
158+
Future<dynamic> get(String key) => _sembastImp.get(key);
159+
160+
@override
161+
Future<bool> getBool(String key) => _sembastImp.getBool(key);
162+
163+
@override
164+
Future<double> getDouble(String key) => _sembastImp.getDouble(key);
165+
166+
@override
167+
Future<int> getInt(String key) => _sembastImp.getInt(key);
168+
169+
@override
170+
Future<String> getString(String key) => _sembastImp.getString(key);
171+
172+
@override
173+
Future<List<String>> getStringList(String key) =>
174+
_sembastImp.getStringList(key);
175+
176+
@override
177+
Future<void> remove(String key) => _sembastImp.remove(key);
178+
179+
@override
180+
Future<void> setBool(String key, bool value) =>
181+
_sembastImp.setBool(key, value);
182+
183+
@override
184+
Future<void> setDouble(String key, double value) =>
185+
_sembastImp.setDouble(key, value);
186+
187+
@override
188+
Future<void> setInt(String key, int value) => _sembastImp.setInt(key, value);
189+
190+
@override
191+
Future<void> setString(String key, String value) =>
192+
_sembastImp.setString(key, value);
193+
194+
@override
195+
Future<void> setStringList(String key, List<String> values) =>
196+
_sembastImp.setStringList(key, values);
152197
}

0 commit comments

Comments
 (0)