This commit is contained in:
Tobe O 2019-04-26 09:52:48 -04:00
parent d575b0f75e
commit 3324193e15
5 changed files with 56 additions and 11 deletions

View file

@ -1 +1,8 @@
# 1.0.0 # 1.0.1
* Explicitly extend `Service<Id, T>`.
* Override `readData`.
* Use `Service<Id, Map<String, dynamic>>` for `inner`, instead of just
`Service<Id, Map>`.
# 1.0.0
* Initial version.

View file

@ -1 +1,22 @@
{ "id": 3, "completed": false, "text": "clean your room" } [
{
"id": "0",
"createdAt": null,
"updatedAt": null,
"idAsInt": null,
"text": "Yes",
"completed": false,
"created_at": "2019-04-26T09:51:27.494884",
"updated_at": "2019-04-26T09:51:27.494884"
},
{
"id": "1",
"createdAt": null,
"updatedAt": null,
"idAsInt": null,
"text": "nOPE",
"completed": false,
"created_at": "2019-04-26T09:51:37.847741",
"updated_at": "2019-04-26T09:51:37.847741"
}
]

View file

@ -1,13 +1,19 @@
import 'dart:io';
import 'package:angel_file_service/angel_file_service.dart';
import 'package:angel_framework/angel_framework.dart'; import 'package:angel_framework/angel_framework.dart';
import 'package:angel_framework/http.dart'; import 'package:angel_framework/http.dart';
import 'package:angel_typed_service/angel_typed_service.dart'; import 'package:angel_typed_service/angel_typed_service.dart';
import 'package:file/local.dart';
import 'package:json_god/json_god.dart' as god; import 'package:json_god/json_god.dart' as god;
import 'package:logging/logging.dart'; import 'package:logging/logging.dart';
main() async { main() async {
var app = Angel(); var app = Angel();
var http = AngelHttp(app); var http = AngelHttp(app);
var service = TypedService<String, Todo>(MapService()); var fs = LocalFileSystem();
var exampleDir = fs.file(Platform.script).parent;
var dataJson = exampleDir.childFile('data.json');
var service = TypedService<String, Todo>(JsonFileService(dataJson));
hierarchicalLoggingEnabled = true; hierarchicalLoggingEnabled = true;
app.use('/api/todos', service); app.use('/api/todos', service);
@ -27,8 +33,10 @@ main() async {
class Todo extends Model { class Todo extends Model {
String text; String text;
bool completed; bool completed;
@override @override
DateTime createdAt, updatedAt; DateTime createdAt, updatedAt;
Todo({String id, this.text, this.completed, this.createdAt, this.updatedAt}) Todo({String id, this.text, this.completed, this.createdAt, this.updatedAt})
: super(id: id); : super(id: id);
} }

View file

@ -4,9 +4,9 @@ import 'package:angel_framework/angel_framework.dart';
import 'package:json_god/json_god.dart' as god; import 'package:json_god/json_god.dart' as god;
/// An Angel service that uses reflection to (de)serialize Dart objects. /// An Angel service that uses reflection to (de)serialize Dart objects.
class TypedService<Id, T> extends Service<Id, dynamic> { class TypedService<Id, T> extends Service<Id, T> {
/// The inner service. /// The inner service.
final Service<Id, Map> inner; final Service<Id, Map<String, dynamic>> inner;
TypedService(this.inner) : super() { TypedService(this.inner) : super() {
if (!reflectType(T).isAssignableTo(reflectType(Model))) if (!reflectType(T).isAssignableTo(reflectType(Model)))
@ -14,6 +14,13 @@ class TypedService<Id, T> extends Service<Id, dynamic> {
"If you specify a type for TypedService, it must extend Model."); "If you specify a type for TypedService, it must extend Model.");
} }
@override
FutureOr<T> Function(RequestContext, ResponseContext) get readData =>
_readData;
T _readData(RequestContext req, ResponseContext res) =>
deserialize(req.bodyAsMap);
/// Attempts to deserialize [x] into an instance of [T]. /// Attempts to deserialize [x] into an instance of [T].
T deserialize(x) { T deserialize(x) {
// print('DESERIALIZE: $x (${x.runtimeType})'); // print('DESERIALIZE: $x (${x.runtimeType})');
@ -55,11 +62,11 @@ class TypedService<Id, T> extends Service<Id, dynamic> {
} }
/// Serializes [x] into a [Map]. /// Serializes [x] into a [Map].
Map serialize(x) { Map<String, dynamic> serialize(x) {
if (x is Model) if (x is Model)
return god.serializeObject(x) as Map; return (god.serializeObject(x) as Map).cast<String, dynamic>();
else if (x is Map) else if (x is Map)
return x; return x.cast<String, dynamic>();
else else
throw ArgumentError('Cannot serialize ${x.runtimeType}'); throw ArgumentError('Cannot serialize ${x.runtimeType}');
} }
@ -77,11 +84,11 @@ class TypedService<Id, T> extends Service<Id, dynamic> {
inner.read(id, params).then(deserialize); inner.read(id, params).then(deserialize);
@override @override
Future<T> modify(Id id, data, [Map<String, dynamic> params]) => Future<T> modify(Id id, T data, [Map<String, dynamic> params]) =>
inner.modify(id, serialize(data), params).then(deserialize); inner.modify(id, serialize(data), params).then(deserialize);
@override @override
Future<T> update(Id id, data, [Map<String, dynamic> params]) => Future<T> update(Id id, T data, [Map<String, dynamic> params]) =>
inner.update(id, serialize(data), params).then(deserialize); inner.update(id, serialize(data), params).then(deserialize);
@override @override

View file

@ -1,5 +1,5 @@
name: angel_typed_service name: angel_typed_service
version: 1.0.0 version: 1.0.1
description: Angel services that use reflection to (de)serialize Dart objects. description: Angel services that use reflection to (de)serialize Dart objects.
homepage: https://github.com/angel-dart/typed_service homepage: https://github.com/angel-dart/typed_service
author: Tobe O <thosakwe@gmail.com> author: Tobe O <thosakwe@gmail.com>
@ -9,6 +9,8 @@ dependencies:
angel_framework: ^2.0.0-alpha angel_framework: ^2.0.0-alpha
json_god: ^2.0.0-beta json_god: ^2.0.0-beta
dev_dependencies: dev_dependencies:
angel_file_service: ^2.0.0
file: ^5.0.0
logging: ^0.11.0 logging: ^0.11.0
pedantic: ^1.0.0 pedantic: ^1.0.0
test: ^1.0.0 test: ^1.0.0