@aircall/exception-gql
TypeScript icon, indicating that this package has built-in type declarations

0.2.0 • Public • Published

Getting Started

Installation

yarn add @aircall/exception @aircall/exception-gql
# Optional
yarn add @aircall/exception-zod

Usage

GraphQL Middleware

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

Zod Middleware

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 extending Exception 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.

/@aircall/exception-gql/

    Package Sidebar

    Install

    npm i @aircall/exception-gql

    Weekly Downloads

    1,011

    Version

    0.2.0

    License

    none

    Unpacked Size

    7.59 kB

    Total Files

    7

    Last publish

    Collaborators

    • xdurand
    • aircall-ci
    • kamalbennani