yarn add @aircall/exception @aircall/exception-gql
# Optional
yarn add @aircall/exception-zod
import { InsufficientPermissionException, ResourceNotFoundException } from '@aircall/exception';
import { graphQLMiddleware } from '@aircall/exception-gql';
// Controller
export function deleteConversationController() {
return graphQLMiddleware(async (identity, { input }) => {
const [, lineID, companyID] = input.conversationID.split('|');
const identityCompanyID = identity.claims['custom:company_id'];
const line = await lineRepository.findOne(lineID);
if (!line) {
throw new ResourceNotFoundException({
resource: 'conversation'
});
}
const isAuthorized = await isAuthorizedToDeleteConversation(identity, input.conversationID);
if (!isAuthorized) {
throw new InsufficientPermissionException({
resource: 'conversation',
access: 'delete'
});
}
return {
conversationID: input.conversationID,
__typename: 'ConversationDeleted'
};
});
}
type Mutation {
deleteConversation(input: DeleteConversationInput!): DeleteConversationResult!
}
input DeleteConversationInput {
conversationID: ID!
}
union DeleteConversationResult =
ConversationDeleted
| ResourceNotFoundException
| InsufficientPermissionException
| GenericException
import * as z from 'zod';
import { InsufficientPermissionException, ResourceNotFoundException } from '@aircall/exception';
import { graphQLMiddleware } from '@aircall/exception-gql';
import { zodMiddleware } from '@aircall/exception-zod';
// Controller
const deleteConversationSchema = z.object({
input: z.object({
conversationID: z.string()
})
});
export function deleteConversationController() {
return graphQLMiddleware(
zodMiddleware(async (identity, { input }) => {
const schema = deleteConversationSchema.parse(input);
const [, lineID, companyID] = schema.input.conversationID.split('|');
// Rest of the business logic
})
);
}
Just by adding the
zodMiddleware
to the controller, any error thrown by the controller will be caught by the middleware and returned as a proper error extendingException
class.
Note: Any JS Error thrown inside of the controller which is not of type Exception will be caught by the GraphQL middleware and returned as a GenericException, so make sure that your GraphQL schema has a union type that includes
GenericException
.