100 lines
3 KiB
Dart
100 lines
3 KiB
Dart
|
// Inspired by:
|
||
|
// https://www.apollographql.com/docs/apollo-server/features/subscriptions/#subscriptions-example
|
||
|
|
||
|
import 'package:angel_file_service/angel_file_service.dart';
|
||
|
import 'package:angel_framework/angel_framework.dart';
|
||
|
import 'package:angel_framework/http.dart';
|
||
|
import 'package:angel_graphql/angel_graphql.dart';
|
||
|
import 'package:angel_serialize/angel_serialize.dart';
|
||
|
import 'package:file/local.dart';
|
||
|
import 'package:graphql_schema/graphql_schema.dart';
|
||
|
import 'package:graphql_server/graphql_server.dart';
|
||
|
import 'package:graphql_server/mirrors.dart';
|
||
|
import 'package:http/io_client.dart';
|
||
|
import 'package:logging/logging.dart';
|
||
|
|
||
|
main() async {
|
||
|
var logger = Logger('angel_graphql');
|
||
|
var app = Angel(logger: logger);
|
||
|
var http = AngelHttp(app);
|
||
|
app.logger.onRecord.listen((rec) {
|
||
|
print(rec);
|
||
|
if (rec.error != null) print(rec.error);
|
||
|
if (rec.stackTrace != null) print(rec.stackTrace);
|
||
|
});
|
||
|
|
||
|
// Create an in-memory service.
|
||
|
var fs = LocalFileSystem();
|
||
|
var postService =
|
||
|
app.use('/api/posts', JsonFileService(fs.file('posts.json')));
|
||
|
|
||
|
// Also get a [Stream] of item creation events.
|
||
|
var postAdded = postService.afterCreated
|
||
|
.asStream()
|
||
|
.map((e) => {'postAdded': e.result})
|
||
|
.asBroadcastStream();
|
||
|
|
||
|
// GraphQL setup.
|
||
|
var postType = objectType('Post', fields: [
|
||
|
field('author', graphQLString),
|
||
|
field('comment', graphQLString),
|
||
|
]);
|
||
|
|
||
|
var schema = graphQLSchema(
|
||
|
// Hooked up to the postService:
|
||
|
// type Query { posts: [Post] }
|
||
|
queryType: objectType(
|
||
|
'Query',
|
||
|
fields: [
|
||
|
field(
|
||
|
'posts',
|
||
|
listOf(postType),
|
||
|
resolve: resolveViaServiceIndex(postService),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
|
||
|
// Hooked up to the postService:
|
||
|
// type Mutation {
|
||
|
// addPost(author: String!, comment: String!): Post
|
||
|
// }
|
||
|
mutationType: objectType(
|
||
|
'Mutation',
|
||
|
fields: [
|
||
|
field(
|
||
|
'addPost',
|
||
|
postType,
|
||
|
inputs: [
|
||
|
GraphQLFieldInput(
|
||
|
'data', postType.toInputObject('PostInput').nonNullable()),
|
||
|
],
|
||
|
resolve: resolveViaServiceCreate(postService),
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
|
||
|
// Hooked up to `postAdded`:
|
||
|
// type Subscription { postAdded: Post }
|
||
|
subscriptionType: objectType(
|
||
|
'Subscription',
|
||
|
fields: [
|
||
|
field('postAdded', postType, resolve: (_, __) => postAdded),
|
||
|
],
|
||
|
),
|
||
|
);
|
||
|
|
||
|
// Mount GraphQL routes; we'll support HTTP and WebSockets transports.
|
||
|
app.get('/graphql', graphQLHttp(GraphQL(schema)));
|
||
|
app.get('/graphql/subscriptions', graphQLWS(GraphQL(schema)));
|
||
|
app.get('/graphiql', graphiQL());
|
||
|
|
||
|
var server = await http.startServer('127.0.0.1', 3000);
|
||
|
var uri =
|
||
|
Uri(scheme: 'http', host: server.address.address, port: server.port);
|
||
|
var graphiqlUri = uri.replace(path: 'graphiql');
|
||
|
var postsUri = uri.replace(pathSegments: ['api', 'posts']);
|
||
|
print('Listening at $uri');
|
||
|
print('Access graphiql at $graphiqlUri');
|
||
|
print('Access posts service at $postsUri');
|
||
|
}
|