mirror of
https://github.com/vale981/Vulcan
synced 2025-03-06 10:01:40 -05:00
first pass at splitting off resolvers
This commit is contained in:
parent
878643f29a
commit
56bcfba245
18 changed files with 219 additions and 9 deletions
|
@ -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({
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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',
|
||||
|
||||
]);
|
||||
|
||||
|
|
|
@ -9,5 +9,6 @@ import './subscriptions.js';
|
|||
import './methods.js';
|
||||
import './permissions.js';
|
||||
import './published_fields.js';
|
||||
import './resolvers.js';
|
||||
|
||||
export default Categories;
|
32
packages/nova-categories/lib/resolvers.js
Normal file
32
packages/nova-categories/lib/resolvers.js
Normal 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);
|
|
@ -127,4 +127,6 @@ Telescope.graphQL.addSchema(Categories.graphQLSchema);
|
|||
Telescope.graphQL.addQuery(`
|
||||
categories: [Category]
|
||||
category(_id: String): Category
|
||||
`);
|
||||
`);
|
||||
|
||||
Telescope.graphQL.addToContext({ Categories });
|
||||
|
|
|
@ -11,5 +11,6 @@ import './custom_fields.js';
|
|||
import './emails.js';
|
||||
import './published_fields.js';
|
||||
import './permissions.js';
|
||||
import './resolvers.js';
|
||||
|
||||
export default Comments;
|
51
packages/nova-comments/lib/resolvers.js
Normal file
51
packages/nova-comments/lib/resolvers.js
Normal 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);
|
|
@ -211,4 +211,6 @@ Telescope.graphQL.addSchema(Comments.graphQLSchema);
|
|||
Telescope.graphQL.addQuery(`
|
||||
comments: [Comment]
|
||||
comment(_id: String): Comment
|
||||
`);
|
||||
`);
|
||||
|
||||
Telescope.graphQL.addToContext({ Comments });
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
};
|
|
@ -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;
|
|
@ -10,5 +10,6 @@ import './callbacks.js';
|
|||
import './emails.js';
|
||||
import './methods.js';
|
||||
import './permissions.js';
|
||||
import './resolvers.js';
|
||||
|
||||
export default Posts;
|
50
packages/nova-posts/lib/resolvers.js
Normal file
50
packages/nova-posts/lib/resolvers.js
Normal 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);
|
|
@ -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);
|
||||
|
|
|
@ -12,5 +12,6 @@ import './emails.js';
|
|||
import './avatar.js';
|
||||
import './methods.js';
|
||||
import './permissions.js';
|
||||
import './resolvers.js';
|
||||
|
||||
export default Users;
|
44
packages/nova-users/lib/resolvers.js
Normal file
44
packages/nova-users/lib/resolvers.js
Normal 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;
|
|
@ -357,4 +357,6 @@ Telescope.graphQL.addQuery(`
|
|||
users: [User]
|
||||
user(_id: String, slug: String): User
|
||||
currentUser: User
|
||||
`);
|
||||
`);
|
||||
|
||||
Telescope.graphQL.addToContext({ Users });
|
||||
|
|
Loading…
Add table
Reference in a new issue