Vulcan/packages/vulcan-voting/lib/server/graphql.js

59 lines
1.6 KiB
JavaScript
Raw Normal View History

import { addCallback, addGraphQLSchema, addGraphQLResolvers, addGraphQLMutation, Utils } from 'meteor/vulcan:core';
2017-09-04 20:28:50 +09:00
import { mutateItem } from '../modules/vote.js';
import { VoteableCollections } from '../modules/make_voteable.js';
import { createError } from 'apollo-errors';
function CreateVoteableUnionType() {
const voteSchema = `
type Vote {
itemId: String
power: Float
votedAt: String
}
union Voteable = ${VoteableCollections.map(collection => collection.typeName).join(' | ')}
`;
addGraphQLSchema(voteSchema);
return {}
}
addCallback('graphql.init.before', CreateVoteableUnionType);
const resolverMap = {
Voteable: {
__resolveType(obj, context, info){
return obj.__typename;
},
},
};
2017-07-13 17:37:59 +09:00
addGraphQLResolvers(resolverMap);
addGraphQLMutation('vote(documentId: String, voteType: String, collectionName: String) : Voteable');
const voteResolver = {
Mutation: {
vote(root, {documentId, voteType, collectionName}, context) {
const collection = context[Utils.capitalize(collectionName)];
const document = collection.findOne(documentId);
if (context.Users.canDo(context.currentUser, `${collectionName.toLowerCase()}.${voteType}`)) {
const mutatedDocument = mutateItem(collection, document, context.currentUser, voteType, false);
mutatedDocument.__typename = collection.typeName;
return mutatedDocument;
} else {
const VoteError = createError('cannot_vote');
throw new VoteError();
}
},
},
};
2017-07-13 17:37:59 +09:00
addGraphQLResolvers(voteResolver);