GraphQL Resolver

PHP Ports for GraphQL

1. Design and develop resolver for queries, process schema and presenters
2. Choose between pagination options and implement chosen one
3. Create ResultHandler and ErrorHandler (who said it would be easy)
4. Create endpoint

5. Send a query

TODO list:

Resolver.php

CreateWishlistResolver.php

Input types:

CreateWishlistResolver.php

WishlistSchema.php

wishlists (first: 10, after: "cursor") {

    edges {

        cursor,

        node {

             id,

             name,

             items {

                     id,    

                    type

             }

        }

    },

   totalCount,

    pageInfo {

         startCursor,

         endCursor,

         hasNextPage,

         hasPreviousPage

    }

}

Cursor

Offset

wishlists (first: $first, offset: $offset) {

    edges {

         id,

         name,    

         items {

             id,    

             type

         }

     },

     pageInfo {

         first,

         offset,

         total,

         hasNextPage,

         hasPreviousPage

     }

}

 

NodePresenter.php

CollectionPresenter.php

AbstractPresenter.php

ResultHandler.php

use GraphQL\Error\ClientAware;

GraphQLException.php

Request Clients

Controller.php

CruiseType {

    reservationNumber,

    checkInTime,

    departureTime,

    departureCity,

    departurePort,

    cruiseShip,

    cruiseLine,

    arrivalTime,

    checkOutTime,

    arrivalCity,

    arrivalPort,

    stops,

    bookingClass,

    additionalInformation

}

RailwayType {

    ticketNumber,

    departureTime,

    departureCity,

    trainNumber,

    trainPlace,

    arrivalTime,

    arrivalCity,

    bookingClass

}

 

BookingType {

    id

}

BookingType {

    … on CruiseType {

        reservationNumber,

        checkInTime,

        departureTime,

        departureCity,

        departurePort,

        cruiseShip,

        cruiseLine,

        arrivalTime,

        checkOutTime,

        arrivalCity,

        arrivalPort,

        stops,

        bookingClass,

        additionalInformation

    },

    … on RailwayTripType {

        ticketNumber,

        departureTime,

        departureCity,

        trainNumber,

        trainPlace,

        arrivalTime,

        arrivalCity,

        bookingClass

    }

}

UnionType

'bookingType' =>

$this->getBookingUnionType('BookingTypeInterfaceType')

SchemaDecorator.php

CreateWishlistResolver.php

File Upload

'args' => [ 'file' => new UploadType()]

FileUploaderResolver.php

mutation(

   $file: Upload

) {

   uploadYourFileHere(

       file: $file

   ) {

      File {

          path,        

          name

      }

}

FileUpload Mutation Example

Don't query unreliable data! You don't need it.

Wishlist {

    id,

    name

}

Wishlist {

    id,

    name,

    items {

        id,    

        type,

        name,

        category,

        price,

        currency

    }

}

Optimization

No recursions! You can do better than this!

Author {

    name,

    books {

        title,

        authors {

            name,

            books

        }

    }

}

wishlists (first: $first, offset: $offset) {  #fetches wishlists (N queries)

    edges {

         id,

         name,    

         items {  #fetches items for each wishlist (M queries per wishlist)

             id,    

             type

         }

     },

     pageInfo {

         first,

         offset,

         total,

         hasNextPage,

         hasPreviousPage

     }

} # therefore M*N queries

N + 1

Solutions

NoSQL

Cache