import { inputObjectType, FieldResolver, mutationField, arg } from '@nexus/schema'; import { Error } from 'mongoose'; import { ApolloError, AuthenticationError, UserInputError, } from 'apollo-server-micro'; import { authenticateQuery } from '../../../schema/authenticate-query'; import { isSmartRecipeCollection } from '../utils'; export const AddFiltersToCollectionIT = inputObjectType({ name: 'AddFiltersToCollectionInput', definition(t) { t.id('recipeCollectionId', { required: true }); t.list.field('filters', { type: 'RecipeFilterInput', description: 'Array of Filters', required: true, }); t.int('order', { description: 'The index to place the filters withing the list', }); }, }); export const addFiltersToCollection: FieldResolver< 'Mutation', 'addFiltersToCollection' > = async (root, args, ctx, info) => { const { user, abilities } = authenticateQuery(ctx); const { recipeCollectionId, filters, order } = args.input; const collection = await user .getRecipeCollections() .accessibleBy(abilities) .findOne({ _id: recipeCollectionId }) .exec(); if (collection === null) { throw new AuthenticationError( 'You do not have permission to update this Collection' ); } if (!isSmartRecipeCollection(collection)) { throw new UserInputError( 'This mutation is only allowed for Smart Collections' ); } try { await collection.addFilters(filters); } catch (e) { throw new UserInputError(e.message); } try { await collection.save(); } catch (e) { if (e instanceof Error.ValidationError) { throw new UserInputError('Invalid Filter input', { errors: Object.keys(e.errors).reduce( (acc, cur) => { const error = e.errors[cur]; return (acc[cur] = { message: error.message, }); }, {} as any ), }); } else { throw new ApolloError('Unable to save collection'); } } return collection; }; export const AddFiltersToCollectionMF = mutationField( 'addFiltersToCollection', { type: 'SmartRecipeCollection', args: { input: arg({ type: 'AddFiltersToCollectionInput', }), }, resolve: addFiltersToCollection, } );