Skip to content

Commit

Permalink
Merge pull request #14 from eyro-labs/refactor-to-dart
Browse files Browse the repository at this point in the history
Refactor to dart
  • Loading branch information
alann-maulana committed Jul 29, 2021
2 parents 293cc03 + 8fe3e42 commit 2e84298
Show file tree
Hide file tree
Showing 19 changed files with 290 additions and 116 deletions.
8 changes: 4 additions & 4 deletions .github/workflows/flutter.yaml
Expand Up @@ -24,7 +24,7 @@ jobs:
with:
flutter-version: '2.0.5'
channel: 'stable'
- run: flutter packages get
- run: flutter format --set-exit-if-changed .
- run: flutter analyze .
- run: flutter test
- run: dart pub get
- run: dartfmt -n --set-exit-if-changed lib/ test/
- run: dart analyze .
- run: dart run test -r json ./test
29 changes: 29 additions & 0 deletions example/flutter_parse_example.dart
@@ -0,0 +1,29 @@
import 'package:flutter_parse/flutter_parse.dart';

main() async {
// create configuration
ParseConfiguration config = ParseConfiguration(
server: 'YOUR_PARSE_SERVER_URL',
applicationId: 'YOUR_PARSE_APPLICATION_ID',
clientKey: 'YOUR_PARSE_CLIENT_KEY',
masterKey: 'YOUR_PARSE_MASTER_KEY',
localStorage: Storage(''),
);
// initialize parse using configuration
Parse.initialize(config);

// create and save object
final object = ParseObject(className: 'Beacon')
..set('proximityUUID', 'CB10023F-A318-3394-4199-A8730C7C1AEC')
..set('major', 1)
..set('enabled', true)
..set('timestamp', DateTime.now());
await object.save();

// query for objects
final query = ParseQuery(className: 'Beacon')
..whereEqualTo('proximityUUID', 'CB10023F-A318-3394-4199-A8730C7C1AEC')
..whereLessThanOrEqualTo('major', 10);
final beacons = await query.findAsync();
print(beacons.length);
}
30 changes: 17 additions & 13 deletions lib/flutter_parse.dart
Expand Up @@ -4,12 +4,12 @@
/// Dart package for accessing Parse Server
library flutter_parse;

import 'dart:async';

import 'package:http/http.dart';
import 'package:meta/meta.dart';
import 'package:platform/platform.dart';

import 'src/parse_http_client.dart' as client;
import 'src/platform/platform.dart';
import 'src/storage/storage.dart';

export 'src/parse_acl.dart';
export 'src/parse_cloud.dart';
Expand All @@ -24,9 +24,10 @@ export 'src/parse_role.dart';
export 'src/parse_schema.dart';
export 'src/parse_session.dart';
export 'src/parse_user.dart';
export 'src/storage/storage.dart';

/// Displaying current Parse SDK version
const String kParseSdkVersion = "0.2.4";
const String kParseSdkVersion = "1.0.0";

final Parse parse = Parse._internal();

Expand Down Expand Up @@ -83,30 +84,28 @@ class Parse {
/// Return [Parse] initialized status
bool get initialized => configuration != null;

Platform? _platform;

/// Convert [BaseRequest] object into friendly formatted CURL command into console log
void logToCURL(BaseRequest request) => client.logToCURL(request);

@visibleForTesting
set platform(Platform platform) {
_platform = platform;
}

Platform get platform => _platform ?? kDefaultPlatform;
}

typedef Compute = Future<dynamic> Function(
FutureOr<dynamic> Function(String message),
String message,
);

/// The [ParseConfiguration] class contains variable that handle global
/// configuration for the Parse library.
class ParseConfiguration {
ParseConfiguration({
required String server,
required this.applicationId,
required this.localStorage,
this.liveQueryServer,
this.clientKey,
this.masterKey,
this.enableLogging = false,
this.httpClient,
this.compute,
}) : assert(
server.startsWith('https://') || server.startsWith('http://'),
'Invalid parse server',
Expand Down Expand Up @@ -141,4 +140,9 @@ class ParseConfiguration {

/// Add your custom [BaseClient] class to intercept Parse request here.
final BaseClient? httpClient;

/// Setup [Storage] for local storage use.
final Storage localStorage;

final Compute? compute;
}
77 changes: 43 additions & 34 deletions lib/src/parse_http_client.dart
@@ -1,7 +1,6 @@
import 'dart:async';
import 'dart:convert';

import 'package:flutter/foundation.dart';
import 'package:flutter_parse/src/config/config.dart';
import 'package:http/http.dart' as http;

Expand Down Expand Up @@ -82,10 +81,15 @@ class ParseHTTPClient {
headers: headers,
);

final result = await compute(
_parseResponse,
_HttpResponse(r.body, parse.enableLogging),
);
dynamic result;
if (parse.configuration != null && parse.configuration!.compute != null) {
result = await parse.configuration!.compute!(
_parseResponse,
r.body,
);
} else {
result = await _parseResponse(r.body);
}

if (result is ParseException) throw result;
return result;
Expand Down Expand Up @@ -113,10 +117,15 @@ class ParseHTTPClient {
headers: headers,
);

final result = await compute(
_parseResponse,
_HttpResponse(r.body, parse.enableLogging),
);
dynamic result;
if (parse.configuration != null && parse.configuration!.compute != null) {
result = await parse.configuration!.compute!(
_parseResponse,
r.body,
);
} else {
result = await _parseResponse(r.body);
}

if (result is ParseException) throw result;
return result;
Expand Down Expand Up @@ -145,10 +154,15 @@ class ParseHTTPClient {

if (ignoreResult == true) return null;

final result = await compute(
_parseResponse,
_HttpResponse(r.body, parse.enableLogging),
);
dynamic result;
if (parse.configuration != null && parse.configuration!.compute != null) {
result = await parse.configuration!.compute!(
_parseResponse,
r.body,
);
} else {
result = await _parseResponse(r.body);
}

if (result is ParseException) throw result;
return result;
Expand All @@ -174,30 +188,35 @@ class ParseHTTPClient {
encoding: encoding,
);

final result = await compute(
_parseResponse,
_HttpResponse(r.body, parse.enableLogging),
);
dynamic result;
if (parse.configuration != null && parse.configuration!.compute != null) {
result = await parse.configuration!.compute!(
_parseResponse,
r.body,
);
} else {
result = await _parseResponse(r.body);
}

if (result is ParseException) throw result;
return result;
}
}

dynamic _parseResponse(_HttpResponse response) {
dynamic _parseResponse(String body) {
dynamic result;
try {
result = json.decode(response.body);
result = json.decode(body);

if (response.enableLogging) {
if (parse.enableLogging) {
print("╭-- JSON");
_parseLogWrapped(response.body);
_parseLogWrapped(body);
print("╰-- result");
}
} catch (_) {
if (response.enableLogging) {
if (parse.enableLogging) {
print("╭-- RESPONSE");
_parseLogWrapped(response.body);
_parseLogWrapped(body);
print("╰-- result");
}
}
Expand All @@ -217,7 +236,7 @@ dynamic _parseResponse(_HttpResponse response) {
return ParseException(
code: ParseException.invalidJson,
message: 'invalid server response',
data: response.body,
data: body,
);
}

Expand Down Expand Up @@ -250,13 +269,3 @@ void logToCURL(http.BaseRequest request) {
void _parseLogWrapped(String text) {
log.parseLogWrapped(text);
}

class _HttpResponse {
final String body;
final bool enableLogging;

_HttpResponse(
this.body, [
this.enableLogging = false,
]);
}
50 changes: 16 additions & 34 deletions lib/src/parse_local_storage.dart
@@ -1,8 +1,7 @@
import 'dart:async';
import 'dart:convert';

import 'package:flutter_parse/flutter_parse.dart';
import 'package:meta/meta.dart';
import 'package:shared_preferences/shared_preferences.dart';

final ParseLocalStorage parseLocalStorage = ParseLocalStorage._internal();

Expand Down Expand Up @@ -36,56 +35,39 @@ class LocalStorage {

LocalStorage._internal(this._keyName);

Storage get storage {
if (parse.configuration == null) {
throw ParseException(message: 'parse not initialized');
}

return parse.configuration!.localStorage;
}

_init() async {
final _db = await SharedPreferences.getInstance();
final source = _db.getString(_keyName);
try {
final map = json.decode(source!);
if (map is Map<String, dynamic>) {
_data.addAll(map);
}
} catch (_) {}
await _db.setString(_keyName, json.encode(_data));
final data = await storage.get(_keyName);

if (data != null && data is Map) {
_data.addAll(data);
}
}

Future<bool> setData(Map<String, dynamic> values) async {
_data
..clear()
..addAll(values);

return _flush();
}

Future<bool> setItem(String key, value) async {
_data[key] = value;

return _flush();
return await storage.put(_keyName, values);
}

Future<bool> delete() async {
_data.clear();

return _flush();
}

Future<bool> deleteItem(String key) async {
_data.remove(key);

return _flush();
return await storage.clear(key: _keyName);
}

Map<String, dynamic> getData() {
return _data;
}

getItem(String key) {
return _data[key];
}

bool get isEmpty => _data.isEmpty;

Future<bool> _flush() async {
final _db = await SharedPreferences.getInstance();
return await _db.setString(_keyName, json.encode(_data));
}
}
4 changes: 3 additions & 1 deletion lib/src/parse_object.dart
Expand Up @@ -47,7 +47,7 @@ class ParseObject implements ParseBaseObject {
assert(objectId.isNotEmpty);
_objectId = objectId;
}

if (json != null) {
mergeJson(json);
}
Expand Down Expand Up @@ -76,6 +76,7 @@ class ParseObject implements ParseBaseObject {
ParseRole: (data) => ParseRole.fromJson(json: data),
ParseUser: (data) => ParseUser.fromJson(json: data),
};

static registerSubclass(
ParseObjectCreator creator, [
bool replace = false,
Expand All @@ -87,6 +88,7 @@ class ParseObject implements ParseBaseObject {
kExistingCustomObjects.putIfAbsent(type, () => creator);
}
}

// endregion

// region GETTER
Expand Down
1 change: 0 additions & 1 deletion lib/src/platform/platform.dart

This file was deleted.

3 changes: 0 additions & 3 deletions lib/src/platform/platform_io.dart

This file was deleted.

3 changes: 0 additions & 3 deletions lib/src/platform/platform_unsupported.dart

This file was deleted.

23 changes: 23 additions & 0 deletions lib/src/storage/storage.dart
@@ -0,0 +1,23 @@
import 'package:sembast/sembast.dart';

import 'storage_stub.dart'
if (dart.library.io) 'storage_io.dart'
if (dart.library.html) 'storage_html.dart';

export 'storage_stub.dart'
if (dart.library.io) 'storage_io.dart'
if (dart.library.html) 'storage_html.dart';

abstract class Storage {
factory Storage(String path) => getStorage(path);

DatabaseFactory get databaseFactory;

Future<Database> get database;

Future<Map<String, dynamic>?> get(String key);

Future<bool> put(String key, Map<String, dynamic> data);

Future<bool> clear({String? key});
}

0 comments on commit 2e84298

Please sign in to comment.