From 611a785ffc40e832d4ade163093bd543d74e1014 Mon Sep 17 00:00:00 2001 From: alex Date: Thu, 18 Jul 2019 13:08:46 +0200 Subject: [PATCH] feat: use the new sembast store API Also ran `dartfmt -w . --fix` to fix the lint warnings --- example/main.dart | 10 ++--- lib/angel_sembast.dart | 94 ++++++++++++++++++------------------------ pubspec.yaml | 4 +- test/all_test.dart | 10 ++--- 4 files changed, 52 insertions(+), 66 deletions(-) diff --git a/example/main.dart b/example/main.dart index e89f1382..8bb6357b 100644 --- a/example/main.dart +++ b/example/main.dart @@ -5,17 +5,17 @@ import 'package:logging/logging.dart'; import 'package:sembast/sembast_io.dart'; main() async { - var app = new Angel(); + var app = Angel(); var db = await databaseFactoryIo.openDatabase('todos.db'); app - ..logger = (new Logger('angel_sembast_example')..onRecord.listen(print)) - ..use('/api/todos', new SembastService(db, store: 'todos')) + ..logger = (Logger('angel_sembast_example')..onRecord.listen(print)) + ..use('/api/todos', SembastService(db, store: 'todos')) ..shutdownHooks.add((_) => db.close()); - var http = new AngelHttp(app); + var http = AngelHttp(app); var server = await http.startServer('127.0.0.1', 3000); var uri = - new Uri(scheme: 'http', host: server.address.address, port: server.port); + Uri(scheme: 'http', host: server.address.address, port: server.port); print('angel_sembast example listening at $uri'); } diff --git a/lib/angel_sembast.dart b/lib/angel_sembast.dart index 53814ed0..b0c00b9b 100644 --- a/lib/angel_sembast.dart +++ b/lib/angel_sembast.dart @@ -4,7 +4,7 @@ import 'package:sembast/sembast.dart'; class SembastService extends Service> { final Database database; - final Store store; + final StoreRef> store; /// If set to `true`, clients can remove all items by passing a `null` `id` to `remove`. /// @@ -16,12 +16,11 @@ class SembastService extends Service> { SembastService(this.database, {String store, this.allowRemoveAll = false, this.allowQuery = true}) - : this.store = - (store == null ? database.mainStore : database.getStore(store)), + : this.store = intMapStoreFactory.store(store), super(); Finder _makeQuery([Map params]) { - params = new Map.from(params ?? {}); + params = Map.from(params ?? {}); Filter out; var sort = []; @@ -36,16 +35,16 @@ class SembastService extends Service> { var v = params[key]; if (v is! Map) { - sort.add(new SortOrder(v.toString(), true)); + sort.add(SortOrder(v.toString(), true)); } else { var m = v as Map; m.forEach((k, sorter) { if (sorter is SortOrder) { sort.add(sorter); } else if (sorter is String) { - sort.add(new SortOrder(k.toString(), sorter == "-1")); + sort.add(SortOrder(k.toString(), sorter == "-1")); } else if (sorter is num) { - sort.add(new SortOrder(k.toString(), sorter == -1)); + sort.add(SortOrder(k.toString(), sorter == -1)); } }); } @@ -57,94 +56,81 @@ class SembastService extends Service> { queryObj.forEach((k, v) { if (k != 'provider' && !const ['__requestctx', '__responsectx'].contains(k)) { - var filter = new Filter.equal(k.toString(), v); - if (out == null) + var filter = Filter.equals(k.toString(), v); + if (out == null) { out = filter; - else - out = new Filter.or([out, filter]); + } else { + out = Filter.or([out, filter]); + } } }); } } } - return new Finder(filter: out, sortOrders: sort); + return Finder(filter: out, sortOrders: sort); } - Map _jsonify(Record record) { - return new Map.from(record.value as Map) - ..['id'] = record.key.toString(); - } + Map _withId(Map data, String id) => + Map.from(data ?? {})..['id'] = id; @override Future> findOne( [Map params, - String errorMessage = 'No record was found matching the given query.']) { - return store.findRecord(_makeQuery(params)).then(_jsonify); + String errorMessage = + 'No record was found matching the given query.']) async { + return (await store.findFirst(database, finder: _makeQuery(params)))?.value; } @override Future>> index( [Map params]) async { - var records = await store.findRecords(_makeQuery(params)); - return records.where((r) => r.value != null).map(_jsonify).toList(); + var records = await store.find(database, finder: _makeQuery(params)); + return records + .where((r) => r.value != null) + .map((r) => _withId(r.value, r.key.toString())) + .toList(); } @override Future> read(String id, [Map params]) async { - var record = await store.get(int.parse(id)); + var record = await store.record(int.parse(id)).getSnapshot(database); if (record == null) { - throw new AngelHttpException.notFound( - message: 'No record found for ID $id'); + throw AngelHttpException.notFound(message: 'No record found for ID $id'); } - return (record as Map)..['id'] = id; + return _withId(record.value, id); } @override Future> create(Map data, [Map params]) async { return await database.transaction((txn) async { - var store = txn.getStore(this.store.name); - var key = await store.put(data) as int; + var key = await store.add(txn, data); var id = key.toString(); - data = new Map.from(data)..['id'] = id; - return data; + return _withId(data, id); }); } @override Future> modify(String id, Map data, [Map params]) async { - data = new Map.from(data)..['id'] = id; - return await database.transaction((txn) async { - var store = txn.getStore(this.store.name); - var existing = await store.get(int.parse(id)); - - data = - new Map.from(existing as Map ?? {}) - ..addAll(data) - ..['id'] = id; - - await store.put(data, int.parse(id)); - return (await store.get(int.parse(id)) as Map) - ..['id'] = id; + var record = store.record(int.parse(id)); + data = await record.put(txn, data, merge: true); + return _withId(data, id); }); } @override Future> update(String id, Map data, [Map params]) async { - data = new Map.from(data)..['id'] = id; - return await database.transaction((txn) async { - var store = txn.getStore(this.store.name); - await store.put(data, int.parse(id)); - return (await store.get(int.parse(id)) as Map) - ..['id'] = id; + var record = store.record(int.parse(id)); + data = await record.put(txn, data); + return _withId(data, id); }); } @@ -158,23 +144,23 @@ class SembastService extends Service> { throw AngelHttpException.forbidden( message: 'Clients are not allowed to delete all items.'); } else { - await store.deleteAll(await store.findKeys(new Finder())); + await store.delete(database); return {}; } } return database.transaction((txn) async { - var store = txn.getStore(this.store.name); - var record = await store.get(int.parse(id)) as Map; + var record = store.record(int.parse(id)); + var snapshot = await record.getSnapshot(txn); - if (record == null) { - throw new AngelHttpException.notFound( + if (snapshot == null) { + throw AngelHttpException.notFound( message: 'No record found for ID $id'); } else { - await store.delete(id); + await record.delete(txn); } - return record..['id'] = id; + return _withId(snapshot.value, id); }); } } diff --git a/pubspec.yaml b/pubspec.yaml index b822c43f..a21ae48e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -4,10 +4,10 @@ homepage: https://github.com/angel-dart/sembast version: 1.0.1 author: Tobe O environment: - sdk: ">=2.0.0-dev <3.0.0" + sdk: ">=2.1.0-dev <3.0.0" dependencies: angel_framework: ^2.0.0-alpha - sembast: ^1.9.5 + sembast: ^1.19.0-dev.2 dev_dependencies: angel_http_exception: ^1.0.0 logging: diff --git a/test/all_test.dart b/test/all_test.dart index c4862d58..8398a1f9 100644 --- a/test/all_test.dart +++ b/test/all_test.dart @@ -12,7 +12,7 @@ main() async { setUp(() async { database = await memoryDatabaseFactory.openDatabase('test.db'); - service = new SembastService(database); + service = SembastService(database); }); tearDown(() => database.close()); @@ -37,7 +37,7 @@ main() async { }); test('read', () async { - var name = 'poobah${new DateTime.now().millisecondsSinceEpoch}'; + var name = 'poobah${DateTime.now().millisecondsSinceEpoch}'; var input = await service.create({'name': name, 'bar': 'baz'}); print(input); expect(await service.read(input['id'] as String), input); @@ -47,8 +47,8 @@ main() async { var input = await service.create({'bar': 'baz', 'yes': 'no'}); var id = input['id'] as String; var output = await service.modify(id, {'bar': 'quux'}); - expect(new SplayTreeMap.from(output), - new SplayTreeMap.from({'id': id, 'bar': 'quux', 'yes': 'no'})); + expect(SplayTreeMap.from(output), + SplayTreeMap.from({'id': id, 'bar': 'quux', 'yes': 'no'})); expect(await service.read(id), output); }); @@ -64,7 +64,7 @@ main() async { var input = await service.create({'bar': 'baz'}); var id = input['id'] as String; expect(await service.remove(id), input); - expect(await database.get(id), isNull); + expect(await StoreRef.main().record(id).get(database), isNull); }); test('remove', () async {