const RootMutation = { createComment: async ( _, { input }, { mutators: { Comment }, loaders: { Actions } } ) => { const comment = await Comment.create(input); // Retrieve actions that was assigned to comment. const actions = await Actions.getByID.load(comment.id); return { comment, actions }; }, editComment: async ( _, { id, asset_id, edit }, { mutators: { Comment } } ) => ({ comment: await Comment.edit({ id, asset_id, edit }), }), createFlag: async ( _, { flag: { item_id, item_type, reason, message } }, { mutators: { Action } } ) => ({ flag: await Action.create({ item_id, item_type, action_type: 'FLAG', group_id: reason, metadata: { message }, }), }), createDontAgree: async ( _, { dontagree: { item_id, item_type, message } }, { mutators: { Action } } ) => ({ dontagree: await Action.create({ item_id, item_type, action_type: 'DONTAGREE', metadata: { message }, }), }), deleteAction: async (_, { id }, { mutators: { Action } }) => { await Action.delete({ id }); }, approveUsername: async (_, { id }, { mutators: { User } }) => { await User.setUserUsernameStatus(id, 'APPROVED'); }, rejectUsername: async (_, { id }, { mutators: { User } }) => { await User.setUserUsernameStatus(id, 'REJECTED'); }, changeUsername: async (_, { id, username }, { mutators: { User } }) => { await User.changeUsername(id, username); }, setUsername: async (_, { id, username }, { mutators: { User } }) => { await User.setUsername(id, username); }, suspendUser: async ( obj, { input: { id, until, message } }, { mutators: { User } } ) => { await User.setUserSuspensionStatus(id, until, message); }, unsuspendUser: async (obj, { input: { id } }, { mutators: { User } }) => { await User.setUserSuspensionStatus(id); }, banUser: async (obj, { input: { id, message } }, { mutators: { User } }) => { await User.setUserBanStatus(id, true, message); }, unbanUser: async (obj, { input: { id } }, { mutators: { User } }) => { await User.setUserBanStatus(id, false); }, ignoreUser: async (_, { id }, { mutators: { User } }) => { await User.ignoreUser({ id }); }, stopIgnoringUser: async (_, { id }, { mutators: { User } }) => { await User.stopIgnoringUser({ id }); }, updateAssetSettings: async ( _, { id, input: settings }, { mutators: { Asset } } ) => { await Asset.updateSettings(id, settings); }, updateAssetStatus: async ( _, { id, input: status }, { mutators: { Asset } } ) => { await Asset.updateStatus(id, status); }, closeAsset: async (_, { id }, { mutators: { Asset } }) => { await Asset.closeNow(id); }, setUserRole: async (_, { id, role }, { mutators: { User } }) => { await User.setRole(id, role); }, setCommentStatus: async ( _, { id, status }, { mutators: { Comment }, pubsub } ) => { const comment = await Comment.setStatus({ id, status }); if (status === 'ACCEPTED') { pubsub.publish('commentAccepted', comment); } else if (status === 'REJECTED') { pubsub.publish('commentRejected', comment); } else if (status === 'NONE') { pubsub.publish('commentReset', comment); } }, addTag: async (_, { tag }, { mutators: { Tag } }) => { await Tag.add(tag); }, removeTag: async (_, { tag }, { mutators: { Tag } }) => { await Tag.remove(tag); }, updateSettings: async ( _, { input: settings }, { mutators: { Settings } } ) => { await Settings.update(settings); }, createToken: async (_, { input }, { mutators: { Token } }) => ({ token: await Token.create(input), }), revokeToken: async (_, { input }, { mutators: { Token } }) => { await Token.revoke(input); }, forceScrapeAsset: async (_, { id }, { mutators: { Asset } }) => { await Asset.scrape(id); }, delUser: async (_, { id }, { mutators: { User } }) => { await User.del(id); }, changePassword: async (_, { input }, { mutators: { User } }) => { await User.changePassword(input); }, }; module.exports = RootMutation;