first pass at splitting off resolvers

This commit is contained in:
Sacha Greif 2016-11-03 21:39:09 +09:00
parent 878643f29a
commit 56bcfba245
18 changed files with 219 additions and 9 deletions

View file

@ -1,14 +1,20 @@
import Telescope from 'meteor/nova:lib';
import { makeExecutableSchema } from 'graphql-tools';
import { client } from './client.js';
import { createApolloServer } from './server.js';
import typeDefs from './schema';
import resolvers from './resolvers';
// import resolvers from './resolvers';
console.log("// Telescope.graphQL.resolvers")
console.log(Telescope.graphQL.resolvers)
const schema = makeExecutableSchema({
typeDefs,
resolvers,
resolvers: Telescope.graphQL.resolvers,
});
createApolloServer({

View file

@ -1,3 +1,5 @@
// not used anymore
import Posts from 'meteor/nova:posts';
import Users from 'meteor/nova:users';
import Comments from 'meteor/nova:comments';

View file

@ -8,6 +8,8 @@ import { graphqlExpress, graphiqlExpress } from 'graphql-server-express';
import bodyParser from 'body-parser';
import express from 'express';
import deepmerge from 'deepmerge';
import { Meteor } from 'meteor/meteor';
import { WebApp } from 'meteor/webapp';
import { check } from 'meteor/check';
@ -16,6 +18,8 @@ import { _ } from 'meteor/underscore';
import Users from 'meteor/nova:users';
import Telescope from 'meteor/nova:lib';
const defaultConfig = {
path: '/graphql',
maxAccountsCacheSizeInMB: 1,
@ -86,6 +90,8 @@ export const createApolloServer = (givenOptions = {}, givenConfig = {}) => {
options.context.userId = user._id;
options.context.currentUser = Users.findOne(user._id);
options.context = deepmerge(options.context, Telescope.graphQL.context);
}
}
}

View file

@ -14,9 +14,6 @@ Package.onUse(function (api) {
// Nova packages
'nova:core@0.27.3-nova',
'nova:posts@0.27.3-nova',
'nova:users@0.27.3-nova',
'nova:comments@0.27.3-nova',
]);

View file

@ -9,5 +9,6 @@ import './subscriptions.js';
import './methods.js';
import './permissions.js';
import './published_fields.js';
import './resolvers.js';
export default Categories;

View file

@ -0,0 +1,32 @@
import Telescope from 'meteor/nova:lib';
import Users from 'meteor/nova:users';
// shortcut
const gVF = Users.getViewableFields;
const resolvers = {
Post: {
categories(post, args, context) {
return post.categories ? context.Categories.find({_id: {$in: post.categories}}, { fields: gVF(context.currentUser, context.Categories) }).fetch() : [];
},
},
Category: {
parent(category, args, context) {
return category.parent ? context.Categories.findOne({_id: category.parent }, { fields: gVF(context.currentUser, context.Categories) }) : null;
}
},
Query: {
categories(root, args, context) {
const options = {
limit: 5,
fields: gVF(context.currentUser, context.Categories)
};
return context.Categories.find({}, options).fetch();
},
category(root, args, context) {
return context.Categories.findOne({_id: args._id}, { fields: gVF(context.currentUser, context.Categories) });
},
},
};
Telescope.graphQL.addResolvers(resolvers);

View file

@ -127,4 +127,6 @@ Telescope.graphQL.addSchema(Categories.graphQLSchema);
Telescope.graphQL.addQuery(`
categories: [Category]
category(_id: String): Category
`);
`);
Telescope.graphQL.addToContext({ Categories });

View file

@ -11,5 +11,6 @@ import './custom_fields.js';
import './emails.js';
import './published_fields.js';
import './permissions.js';
import './resolvers.js';
export default Comments;

View file

@ -0,0 +1,51 @@
import Telescope from 'meteor/nova:lib';
import Posts from 'meteor/nova:posts';
import Users from 'meteor/nova:users';
// shortcut
const gVF = Users.getViewableFields;
const resolvers = {
Post: {
commenters(post, args, context) {
return post.commenters ? context.Users.find({_id: {$in: post.commenters}}, { fields: gVF(context.currentUser, Users) }).fetch() : [];
},
comments(post, args, context) {
return post.commentCount ? context.Comments.find({postId: post._id}, { fields: gVF(context.currentUser, Comments) }).fetch() : [];
},
},
Comment: {
parentComment(comment, args, context) {
return comment.parentCommentId ? context.Comments.findOne({_id: comment.parentCommentId}, { fields: gVF(context.currentUser, context.Comments) }) : null;
},
topLevelComment(comment, args, context) {
return comment.topLevelCommentId ? context.Comments.findOne({_id: comment.topLevelCommentId}, { fields: gVF(context.currentUser, context.Comments) }) : null;
},
post(comment, args, context) {
return context.Posts.findOne({_id: comment.postId}, { fields: gVF(context.currentUser, context.Posts) });
},
user(comment, args, context) {
return context.Users.findOne({_id: comment.userId}, { fields: gVF(context.currentUser, context.Posts) });
},
upvoters(comment, args, context) {
return comment.upvoters ? context.Users.find({_id: {$in: comment.upvoters}}, { fields: gVF(context.currentUser, context.Users) }).fetch() : [];
},
downvoters(comment, args, context) {
return comment.downvoters ? context.Users.find({_id: {$in: comment.downvoters}}, { fields: gVF(context.currentUser, context.Users) }).fetch() : [];
},
},
Query: {
comments(root, args, context) {
const options = {
limit: 5,
fields: gVF(context.currentUser, Comments)
}
return context.Comments.find({}, options).fetch();
},
comment(root, args, context) {
return context.Comments.findOne({_id: args._id}, { fields: gVF(context.currentUser, Comments) });
},
}
};
Telescope.graphQL.addResolvers(resolvers);

View file

@ -211,4 +211,6 @@ Telescope.graphQL.addSchema(Comments.graphQLSchema);
Telescope.graphQL.addQuery(`
comments: [Comment]
comment(_id: String): Comment
`);
`);
Telescope.graphQL.addToContext({ Comments });

View file

@ -1,3 +1,5 @@
import deepmerge from 'deepmerge';
Telescope.graphQL = {
schemas: [],
addSchema(schema) {
@ -11,4 +13,12 @@ Telescope.graphQL = {
addMutation(mutation) {
this.mutations.push(mutation);
},
resolvers: {},
addResolvers(resolvers) {
this.resolvers = deepmerge(this.resolvers, resolvers);
},
context: {},
addToContext(object) {
this.context = deepmerge(this.context, object);
}
};

View file

@ -7,6 +7,6 @@ import './collections.js';
import './deep.js';
import './deep_extend.js';
import './intl-polyfill.js';
import './schemas.js';
import './graphql.js';
export default Telescope;

View file

@ -10,5 +10,6 @@ import './callbacks.js';
import './emails.js';
import './methods.js';
import './permissions.js';
import './resolvers.js';
export default Posts;

View file

@ -0,0 +1,50 @@
import Telescope from 'meteor/nova:lib';
import Users from 'meteor/nova:users';
// shortcut
const gVF = Users.getViewableFields;
const resolvers = {
Post: {
user(post, args, context) {
return context.Users.findOne({ _id: post.userId }, { fields: gVF(context.currentUser, Users) });
},
upvoters(post, args, context) {
return post.upvoters ? context.Users.find({_id: {$in: post.upvoters}}, { fields: gVF(context.currentUser, Users) }).fetch() : [];
},
downvoters(post, args, context) {
return post.downvoters ? context.Users.find({_id: {$in: post.downvoters}}, { fields: gVF(context.currentUser, Users) }).fetch() : [];
},
},
Query: {
posts(root, {terms, offset, limit}, context, info) {
console.log("// context")
console.log(context)
let {selector, options} = context.Posts.parameters.get(terms);
const protectedLimit = (limit < 1 || limit > 10) ? 10 : limit;
options.limit = protectedLimit;
options.skip = offset;
// keep only fields that should be viewable by current user
options.fields = gVF(context.currentUser, Posts);
return context.Posts.find(selector, options).fetch();
},
postsViewTotal(root, {terms}, context) {
const {selector} = context.Posts.parameters.get(terms);
return context.Posts.find(selector).count();
},
post(root, args, context) {
Meteor._sleepForMs(2000); // wait 2 seconds
return context.Posts.findOne({_id: args._id}, { fields: gVF(context.currentUser, Posts) });
},
},
Mutation: {
postVote(root, {postId, voteType}, context) {
Meteor._sleepForMs(2000); // wait 2 seconds for demonstration purpose
console.log("sleep done");
const post = Posts.findOne(postId);
return context.Users.canDo(context.currentUser, `posts.${voteType}`) ? Telescope.operateOnItem(context.Posts, post, context.currentUser, voteType) : false;
},
}
};
Telescope.graphQL.addResolvers(resolvers);

View file

@ -344,6 +344,8 @@ Telescope.graphQL.addQuery(`
post(_id: String): Post
`);
Telescope.graphQL.addToContext({ Posts });
if (typeof SimpleSchema !== "undefined") {
Posts.schema = new SimpleSchema(Posts.schemaJSON);
Posts.attachSchema(Posts.schema);

View file

@ -12,5 +12,6 @@ import './emails.js';
import './avatar.js';
import './methods.js';
import './permissions.js';
import './resolvers.js';
export default Users;

View file

@ -0,0 +1,44 @@
import Telescope from 'meteor/nova:lib';
import Users from './collection.js';
// shortcut
const gVF = Users.getViewableFields;
const resolvers = {
User: {
telescope(user, args, context) {
return user.telescope;
},
},
UserTelescope: {
downvotedComments(telescope, args, context) {
return telescope.downvotedComments ? telescope.downvotedComments : []
},
downvotedPosts(telescope, args, context) {
return telescope.downvotedPosts ? telescope.downvotedPosts : []
},
upvotedComments(telescope, args, context) {
return telescope.upvotedComments ? telescope.upvotedComments : []
},
upvotedPosts(telescope, args, context) {
return telescope.upvotedPosts ? telescope.upvotedPosts : [];
},
},
Query: {
users(root, args, context) {
const options = {
limit: 5,
fields: gVF(context.currentUser, Users)
}
return context.Users.find({}, {limit: 5}).fetch();
},
user(root, args, context) {
return context.Users.findOne({$or: [{_id: args._id}, {'telescope.slug': args.slug}]}, { fields: gVF(context.currentUser, context.Users) });
},
currentUser(root, args, context) {
return context && context.userId ? context.Users.findOne(context.userId) : null;
}
}
};
export default resolvers;

View file

@ -357,4 +357,6 @@ Telescope.graphQL.addQuery(`
users: [User]
user(_id: String, slug: String): User
currentUser: User
`);
`);
Telescope.graphQL.addToContext({ Users });