This is my module TweetResolver
(tweet-resolver.js) :
import Tweet from '../../models/Tweet';
import { requireAuth } from '../../services/auth';
export default {
getTweet: async (_, { _id }, { user }) => {
try {
await requireAuth(user);
return Tweet.findById(_id);
} catch (error) {
throw error;
}
},
getTweets: async (_, args, { user }) => {
try {
await requireAuth(user);
return Tweet.find({}).sort({ createdAt: -1 });
} catch (error) {
throw error;
}
},
createTweet: async (_, args, { user }) => {
try {
await requireAuth(user);
return Tweet.create(args);
} catch (error) {
throw error;
}
},
updateTweet: async (_, { _id, ...rest }, { user }) => {
try {
await requireAuth(user);
Tweet.findByIdAndUpdate(_id, rest, { new: true });
} catch (error) {
throw error;
}
},
deleteTweet: async (_, { _id }, { user }) => {
try {
await requireAuth(user);
await Tweet.findByIdAndRemove(_id);
return {
message: 'Tweet has been deleted'
}
} catch (error) {
throw error;
}
}
}
It is used in my graphql project like this:
import GraphQLDate from 'graphql-date';
import TweetResolvers from './tweet-resolvers';
import UserResolvers from './user-resolvers';
export default {
Date: GraphQLDate,
Query: {
getTweet: TweetResolvers.getTweet,
getTweets: TweetResolvers.getTweets
},
Mutation: {
createTweet: TweetResolvers.createTweet,
updateTweet: TweetResolvers.updateTweet,
deleteTweet: TweetResolvers.deleteTweet,
signup: UserResolvers.signup,
login: UserResolvers.login
}
}
Correct me if I am wrong, but I feel there is a lot of code duplication in my tweet-resolver.js
module.
Almost every method signature on this module is identical (as I only want authenticated users to be able to do anything via graphql).
Every execution is inside a try/catch block.
Is there a way to remove code duplication in this. Or is this style of coding acceptable?