Patch
This commit is contained in:
parent
b3530e5a2a
commit
8f1e7eb7ce
4 changed files with 38 additions and 12 deletions
|
@ -1,7 +1,9 @@
|
||||||
import 'package:angel_framework/angel_framework.dart';
|
import 'package:angel_framework/angel_framework.dart';
|
||||||
import 'package:angel_graphql/angel_graphql.dart';
|
import 'package:angel_graphql/angel_graphql.dart';
|
||||||
|
import 'package:angel_serialize/angel_serialize.dart';
|
||||||
import 'package:graphql_schema/graphql_schema.dart';
|
import 'package:graphql_schema/graphql_schema.dart';
|
||||||
import 'package:graphql_server/graphql_server.dart';
|
import 'package:graphql_server/graphql_server.dart';
|
||||||
|
import 'package:graphql_server/mirrors.dart';
|
||||||
|
|
||||||
main() async {
|
main() async {
|
||||||
var app = new Angel();
|
var app = new Angel();
|
||||||
|
@ -9,18 +11,14 @@ main() async {
|
||||||
|
|
||||||
var todoService = app.use('api/todos', new MapService()) as Service;
|
var todoService = app.use('api/todos', new MapService()) as Service;
|
||||||
|
|
||||||
var todo = objectType('todo', [
|
|
||||||
field(
|
|
||||||
'text',
|
|
||||||
type: graphQLString,
|
|
||||||
),
|
|
||||||
]);
|
|
||||||
|
|
||||||
var api = objectType('api', [
|
var api = objectType('api', [
|
||||||
field(
|
field(
|
||||||
'todos',
|
'todo',
|
||||||
type: listType(todo),
|
type: listType(objectTypeFromDartType(Todo)),
|
||||||
resolve: resolveFromService(todoService),
|
resolve: resolveFromService(todoService),
|
||||||
|
arguments: [
|
||||||
|
new GraphQLFieldArgument('id', graphQLId),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
@ -38,3 +36,12 @@ main() async {
|
||||||
print('Listening at $uri');
|
print('Listening at $uri');
|
||||||
print('Access graphiql at $graphiqlUri');
|
print('Access graphiql at $graphiqlUri');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@serializable
|
||||||
|
class Todo extends Model {
|
||||||
|
String text;
|
||||||
|
|
||||||
|
bool completed;
|
||||||
|
|
||||||
|
Todo({this.text, this.completed});
|
||||||
|
}
|
||||||
|
|
|
@ -7,4 +7,6 @@ dependencies:
|
||||||
graphql_schema:
|
graphql_schema:
|
||||||
path: ../graphql_schema
|
path: ../graphql_schema
|
||||||
graphql_server:
|
graphql_server:
|
||||||
path: ../graphql_server
|
path: ../graphql_server
|
||||||
|
dev_dependencies:
|
||||||
|
angel_serialize: ^2.0.0
|
|
@ -3,12 +3,22 @@ import 'dart:mirrors';
|
||||||
import 'package:angel_serialize/angel_serialize.dart';
|
import 'package:angel_serialize/angel_serialize.dart';
|
||||||
import 'package:graphql_schema/graphql_schema.dart';
|
import 'package:graphql_schema/graphql_schema.dart';
|
||||||
import 'package:recase/recase.dart';
|
import 'package:recase/recase.dart';
|
||||||
|
import 'package:tuple/tuple.dart';
|
||||||
|
|
||||||
/// Reflects upon a given [type] and dynamically generates a [GraphQLType] that corresponds to it.
|
/// Reflects upon a given [type] and dynamically generates a [GraphQLType] that corresponds to it.
|
||||||
///
|
///
|
||||||
/// This function is aware of the annotations from `package:angel_serialize`, and works seamlessly
|
/// This function is aware of the annotations from `package:angel_serialize`, and works seamlessly
|
||||||
/// with them.
|
/// with them.
|
||||||
GraphQLType objectTypeFromDartType(Type type, [List<Type> typeArguments]) {
|
GraphQLType objectTypeFromDartType(Type type, [List<Type> typeArguments]) {
|
||||||
|
var tuple = new Tuple2(type, typeArguments);
|
||||||
|
return _cache.putIfAbsent(
|
||||||
|
tuple, () => _objectTypeFromDartType(type, typeArguments));
|
||||||
|
}
|
||||||
|
|
||||||
|
final Map<Tuple2<Type, List<Type>>, GraphQLType> _cache =
|
||||||
|
<Tuple2<Type, List<Type>>, GraphQLType>{};
|
||||||
|
|
||||||
|
GraphQLType _objectTypeFromDartType(Type type, [List<Type> typeArguments]) {
|
||||||
if (type == bool) {
|
if (type == bool) {
|
||||||
return graphQLBoolean;
|
return graphQLBoolean;
|
||||||
} else if (type == int) {
|
} else if (type == int) {
|
||||||
|
@ -17,9 +27,12 @@ GraphQLType objectTypeFromDartType(Type type, [List<Type> typeArguments]) {
|
||||||
return graphQLFloat;
|
return graphQLFloat;
|
||||||
} else if (type == String) {
|
} else if (type == String) {
|
||||||
return graphQLString;
|
return graphQLString;
|
||||||
|
} else if (type == DateTime) {
|
||||||
|
return graphQLDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
var mirror = reflectType(type, typeArguments);
|
var mirror = reflectType(
|
||||||
|
type, typeArguments?.isNotEmpty == true ? typeArguments : null);
|
||||||
|
|
||||||
if (mirror is! ClassMirror) {
|
if (mirror is! ClassMirror) {
|
||||||
throw new StateError(
|
throw new StateError(
|
||||||
|
@ -35,7 +48,10 @@ GraphQLObjectType objectTypeFromClassMirror(ClassMirror mirror) {
|
||||||
for (var name in mirror.instanceMembers.keys) {
|
for (var name in mirror.instanceMembers.keys) {
|
||||||
var methodMirror = mirror.instanceMembers[name];
|
var methodMirror = mirror.instanceMembers[name];
|
||||||
var exclude = _getExclude(name, methodMirror);
|
var exclude = _getExclude(name, methodMirror);
|
||||||
var canAdd = exclude?.canSerialize != true;
|
var canAdd = name != #hashCode &&
|
||||||
|
name != #runtimeType &&
|
||||||
|
!methodMirror.isPrivate &&
|
||||||
|
exclude?.canSerialize != true;
|
||||||
if (methodMirror.isGetter && canAdd) {
|
if (methodMirror.isGetter && canAdd) {
|
||||||
fields.add(fieldFromGetter(name, methodMirror, exclude, mirror));
|
fields.add(fieldFromGetter(name, methodMirror, exclude, mirror));
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,5 +6,6 @@ dependencies:
|
||||||
graphql_parser:
|
graphql_parser:
|
||||||
path: ../graphql_parser
|
path: ../graphql_parser
|
||||||
recase: ^1.0.0
|
recase: ^1.0.0
|
||||||
|
tuple: ^1.0.0
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
test: ^0.12.0
|
test: ^0.12.0
|
Loading…
Reference in a new issue