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'; import { RecipeFilterAttributeET, RecipeFilterActionET } from '.'; export const UpdateRecipeFilterIT = inputObjectType({ name: 'UpdateRecipeFilterInput', definition(t) { t.id('id', { required: true }); t.field('attribute', { type: RecipeFilterAttributeET }); t.field('action', { type: RecipeFilterActionET }); t.string('value'); }, }); export const UpdateFilterInCollectionIT = inputObjectType({ name: 'UpdateFilterInCollectionInput', definition(t) { t.id('recipeCollectionId', { required: true }); t.field('filter', { type: 'UpdateRecipeFilterInput', required: true }); t.int('order', { description: 'The new index of the recipe', }); }, }); export const updateFilterInCollection: FieldResolver< 'Mutation', 'updateFilterInCollection' > = async (root, args, ctx, info) => { const { user, abilities } = authenticateQuery(ctx); const { recipeCollectionId, filter, ...filterOptions } = 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.updateFilter(filter, filterOptions); } catch (error) { if (error instanceof Error.ValidatorError) { throw new UserInputError(error.message); } else { throw new ApolloError('Unable to update the collection'); } } await collection.save(); return collection; }; export const UpdatefilterInCollectionMF = mutationField( 'updateFilterInCollection', { type: 'SmartRecipeCollection', args: { input: arg({ type: 'UpdateFilterInCollectionInput', }), }, resolve: updateFilterInCollection, } );