import { inputObjectType, FieldResolver, mutationField, arg, objectType, } from '@nexus/schema'; import { AuthenticationError, UserInputError } from 'apollo-server-micro'; import { authenticateQuery } from '../../../schema/authenticate-query'; import { isManualRecipeCollection, isSmartRecipeCollection } from '../utils'; export const RemoveFiltersFromCollectionIT = inputObjectType({ name: 'RemoveFiltersFromCollectionInput', definition(t) { t.id('recipeCollectionId', { required: true }); t.list.id('filters', { description: 'Array of Filter IDs', required: true, }); }, }); export const RemoveFiltersFromCollectionPayload = objectType({ name: 'RemoveFiltersFromCollectionPayload', definition(t) { t.field('recipeCollection', { type: 'SmartRecipeCollection', description: 'The Updated Collection', }); t.list.id('removedFilters', { description: 'Array of Recipe IDs successfully removed from the collection', }); t.list.id('rejectedFilters', { description: 'Array of Recipe IDs not able to be deleted from to the collection', }); }, }); export const removeFiltersFromCollection: FieldResolver< 'Mutation', 'removeFiltersFromCollection' > = async (root, args, ctx, info) => { const { user, abilities } = authenticateQuery(ctx); const { recipeCollectionId, filters } = 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 on Smart Collections' ); } const removedFilters: string[] = []; const rejectedFilters: string[] = []; filters.forEach(async id => { try { await collection.removeFilter(id); removedFilters.push(id); } catch (e) { rejectedFilters.push(id); } }); await collection.save(); // await collection.populate('nodes.recipe').execPopulate(); return { removedFilters, rejectedFilters, recipeCollection: collection, }; }; export const RemoveFiltersFromCollectionMF = mutationField( 'removeFiltersFromCollection', { type: 'RemoveFiltersFromCollectionPayload', args: { input: arg({ type: 'RemoveFiltersFromCollectionInput', }), }, resolve: removeFiltersFromCollection, } );