Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  1. Create a webapi directory in your plugin directory. For example, for my local_todo plugin, this would be in /server/local/todo/.

  2. Under the webapi directory, create an ajax directory.

  3. Create a schema.graphqls file under the ajax directory.

  4. In schema.graphqls, let’s define the todo_item type by adding the following:

    Code Block
    languagegraphql
    type local_todo_item {
        id: core_id
        title: String
        completed_at: core_date
    }

    This adds a new type with id, title and completed_at, which we will have access to when using this type.

...

  • In schema.graphqls define the result we’ll get back from the query by defining the following type:

    Code Block
    languagegraphql
    type local_todo_items_result {
        items: [local_todo_item!]!
    }

    Notice here we’ve used ! in two places. This indicates the field is non-nullable. We’ve used this here to say that we always expect an array, by putting the exclamation mark on the outside of the array [...]!. We also used it to to say that the elements of the array cannot be null [my_type!].

  • Now we have the result defined, let’s define the query. We do this by extending the type Query and adding our query into it. Let’s do this:

    Code Block
    languagegraphql
    extend type Query {
        local_todo_items: local_todo_items_result!
    }

    This defines that the query local_todo_items should return the local_todo_items_result type we defined earlier.

...

  • Create the persisted query file in webapi/ajax/items.graphql with the following:

    Code Block
    languagegraphql
    query local_todo_items {
        local_todo_items {
            items {
                id
                title
                completed_at
            }
        }
    }

...

  • First we’ll create the directory for the query resolver by creating the following directory: /server/local/todo/classes/webapi/resolver/query

  • Now let’s create the query resolver class, items.php in the directory we just created:

    Code Block
    languagephp
    <?php
    
    namespace local_todo\webapi\resolver\query;
    
    use core\webapi\execution_context;
    use core\webapi\query_resolver;
    use local_todo\entity\item;
    
    class items extends query_resolver {
    
        /**
         * @inheritDoc
         * @throws \coding_exception
         */
        public static function resolve(array $args, execution_context $ec) {
            global $USER;
    
            $items = item::repository()
                ->where('user_id', $USER->id)
                ->order_by('id')
                ->get();
    
            return ['items' => $items];
        }
    }

    In this file we’ve defined the query resolve and we’re using the ORM of local_todo to return a list of items.

  • Now we create the type resolver directory /server/local/todo/classes/webapi/resolver/type/ and the type resolver for item item.php in the directory:

    Code Block
    languagephp
    <?php
    
    namespace local_todo\webapi\resolver\type;
    
    use core\webapi\execution_context;
    use core\webapi\type_resolver;
    
    class item extends type_resolver {
        /**
         * @param string $field - The field being requested 
         * @param $source - In the case, source will be our `item` entity class as it's what's returned from the query resolver
         * @param array $args
         * @param execution_context $ec
         * @return mixed|void
         */
        public static function resolve(string $field, $source, array $args, execution_context $ec) {
            return $source->$field;
        }
    }

...