Files
talk/plugins/talk-plugin-featured-comments/index.js
T

105 lines
2.4 KiB
JavaScript

const { check } = require('perms/utils');
module.exports = {
typeDefs: `
type CommentFeaturedData {
comment: Comment!
user: User!
}
type CommentUnfeaturedData {
comment: Comment!
user: User!
}
type Subscription {
# Subscribe to featured comments.
commentFeatured(asset_id: ID): CommentFeaturedData
# Subscribe to featured comments.
commentUnfeatured(asset_id: ID): CommentUnfeaturedData
}
`,
resolvers: {
Subscription: {
commentFeatured: ({ user, comment }) => {
return { user, comment };
},
commentUnfeatured: ({ user, comment }) => {
return { user, comment };
},
},
},
setupFunctions: {
commentFeatured: (options, args) => ({
commentFeatured: {
filter: ({ comment }, { user }) => {
if (!args.asset_id) {
return check(user, ['ADMIN', 'MODERATOR']);
}
return comment.asset_id === args.asset_id;
},
},
}),
commentUnfeatured: (options, args) => ({
commentUnfeatured: {
filter: ({ comment }, { user }) => {
if (!args.asset_id) {
return check(user, ['ADMIN', 'MODERATOR']);
}
return comment.asset_id === args.asset_id;
},
},
}),
},
hooks: {
RootMutation: {
addTag: {
async post(
obj,
{ tag: { name, id, item_type } },
{ user, mutators: { Comment }, pubsub }
) {
if (name === 'FEATURED' && item_type === 'COMMENTS') {
const comment = await Comment.setStatus({
id: id,
status: 'ACCEPTED',
});
if (comment) {
pubsub.publish('commentFeatured', { comment, user });
}
}
},
},
removeTag: {
async post(
obj,
{ tag: { name, id, item_type } },
{ user, loaders: { Comments }, pubsub }
) {
if (name === 'FEATURED' && item_type === 'COMMENTS') {
const comment = await Comments.get.load(id);
if (comment) {
pubsub.publish('commentUnfeatured', { comment, user });
}
}
},
},
},
},
tags: [
{
name: 'FEATURED',
permissions: {
public: true,
self: false,
roles: ['ADMIN', 'MODERATOR'],
},
models: ['COMMENTS'],
created_at: new Date(),
},
],
};