Archived student lesson
Add Delete mutations
Part of End to End React with Prisma 2
Objective: Add all of the delete mutations we will need.
In this step we will add delete mutations for feeds, bundles, and savedArticles. Let’s start by adding the following resolver functions:
utils/api/resolvers.ts
// other imports and definitions
export const resolvers = {
// other resolver definitions
Mutation: {
// other mutations
deleteBundle: async (parent, { data: { id } }, { prisma, user }) => {
const bundle = await prisma.bundle.findOne({ where: { id }, include: { author: true, likes: true } });
await verifyOwnership(bundle, user);
await prisma.bundle.delete({ where: { id: bundle.id } });
return bundle;
},
deleteFeed: async (parent, { data: { id } }, { prisma, user }) => {
const feed = await prisma.feed.findOne({ where: { id }, include: { author: true, likes: true } });
await verifyOwnership(feed, user);
await prisma.feed.delete({ where: { id: feed.id } });
return feed;
},
deleteSavedArticle: async (parent, { data: { id } }, { prisma, user }) => {
const savedArticle = await prisma.savedArticle.findOne({ where: { id }, include: { author: true } });
await verifyOwnership(savedArticle, user);
return prisma.savedArticle.delete({ where: { id: savedArticle.id } });
},
}
Just like before, we want to always look up the item in question first and confirm that the owner of that item matches the owner trying to perform the delete operation. Next, let’s add these mutations to the type definitions file. Note that although we can look up bundles and feeds by their ids, we can only look up savedArticles by their url. When it comes to deleting feeds, bundles, and savedArticles though, we use an id in all cases.
utils/api/typeDefs.ts
# other type defs
input DeleteSavedArticleInput {
id: String
}
# other type defs
type Mutation {
deleteBundle(data: BundleInput): Bundle
deleteFeed(data: FeedInput): Feed
deleteSavedArticle(data: DeleteSavedArticleInput): SavedArticle
}
And with that, we have built our backend! The only thing left is to reset our database by calling the mutation { resetAll } mutation and to revert our context so that it will be ready for properly setting the user from the frontend. Restore the context function to look like this:
utils/api/context.ts
export const context = async ({ req }) => {
try {
const { user: auth0User } = await auth0.getSession(req)
let user = await prisma.user.findOne({ where: { auth0: auth0User.sub } })
if (!user) {
const { picture, nickname, sub } = auth0User
user = await prisma.user.create({
data: { id: uuidv4(), auth0: sub, nickname, picture },
})
}
return { user, prisma }
} catch (e) {
return { user: {}, prisma }
}
}