Блог

🚀 Выпущена новая версия 0.8 Gato GraphQL!

Leonardo Losoviz
Автор: Leonardo Losoviz ·

Версия 0.8 Gato GraphQL теперь доступна для скачивания! 🎉

Это огромный релиз, сосредоточенный на трёх областях:

  1. Рефакторинг кодовой базы для поддержки расширений
  2. Более полное соответствие спецификации GraphQL
  3. Завершение схемы GraphQL

Кроме того, он поддерживает новый WordPress 5.8 и содержит множество исправлений ошибок и улучшений.

Обратите внимание, что этот релиз содержит breaking changes!

Ниже представлены заметки к релизу. Быстрые ссылки:


Поддержка WordPress 5.8

WordPress 5.8 объявляет устаревшими несколько filter hooks, включая allowed_block_types и block_categories (используемые этим плагином).

Затронутые hooks были заменены:

  1. allowed_block_types => allowed_block_types_all
  2. block_categories => block_categories_all

Улучшенная поддержка PHP 8.0

Этот релиз исправляет ряд проблем при использовании PHP 8.0.

Упрощённая кодовая база с использованием container services повсюду

Кодовая база GraphQL-сервера была рефакторизована: теперь используется service container для регистрации всех элементов схемы (type resolvers, field resolvers, interface resolvers, custom scalar resolvers и другие).

Это важная веха, вводящая единый подход к разработке плагина и его расширений, значительно упрощающая их код и документацию.

Наконец можно приступить к написанию документации о создании пользовательских расширений для Gato GraphQL. Работа над ней начнётся в ближайшее время и будет опубликована в разделе руководств.

Кэш сохраняется в wp-content

Плагин кэширует результаты на диск для оптимизации производительности.

Ранее кэшированные файлы хранились в системной папке, скрытой от администратора. Теперь они хранятся в wp-content/graphql-api/cache/.

Введён GraphQL-endpoint с «фиксированной схемой» для работы редактора WordPress

Теперь в wp-admin есть 2 endpoint'а:

  1. GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINT
  2. GRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT

С GRAPHQL_API_ADMIN_CONFIGURABLESCHEMA_ENDPOINT схема GraphQL изменяется в соответствии с пользовательскими настройками: включено ли пространство имён, включены ли типы/директивы и т.д.

С GRAPHQL_API_ADMIN_FIXEDSCHEMA_ENDPOINT схема GraphQL не изменяется пользовательскими настройками и всегда отображает все типы, поля и директивы, включая «unrestricted» поля администратора.

Фиксированный endpoint позволяет блокам Gutenberg запрашивать все поля независимо от того, включены ли они пользователем, с неограниченным доступом.

Расширенная поддержка типов полей в схеме

Поддержка списков как типов полей расширена; теперь поддерживаются следующие возможности:

  • Списки с non-null элементами: [String!]
  • Списки списков: [[String]]
  • Любые их комбинации: [[String!]!]

Input coercion: принятие одного значения там, где ожидается список

Теперь можно передать одно значение в GraphQL-запросе там, где ожидается список, как определено в спецификации GraphQL.

Например, эти queries теперь эквивалентны:

query InputSingleValue {
  posts(filter: { ids: 1 }) {
    title
  }
}
 
query InputListOfSingleItem {
  posts(filter: { ids: [1] }) {
    title
  }
}

Дополнительное завершение схемы WordPress

В схему GraphQL добавлены дополнительные сущности из модели данных WordPress:

Схема GraphQL

Рассмотрим, какие новые элементы были добавлены.

Категории

Категории отображены через новый тип PostCategory и новые поля:

  • Root.postCategories: [PostCategory]
  • Root.postCategory: PostCategory
  • Post.categories: [PostCategory]

Например, этот запрос получает категории для записей:

{
  posts {
    id
    title
    categories {
      id
      name
      url
    }
  }
}

Также добавлено поле mutation для назначения категорий записям:

  • MutationRoot.setCategoriesOnPost: Post

И добавлен input categories к полям mutation для записей:

  • MutationRoot.createPost
  • MutationRoot.updatePost
  • Post.update (когда включены nested mutations)

Meta

Теперь можно запрашивать значения meta для custom post, пользователя, комментария и таксономии через новые поля:

  • Post.metaValue: AnyScalar
  • Post.metaValues: [AnyScalar]
  • User.metaValue: AnyScalar
  • User.metaValues: [AnyScalar]
  • Comment.metaValue: AnyScalar
  • Comment.metaValues: [AnyScalar]
  • PostCategory.metaValue: AnyScalar
  • PostCategory.metaValues: [AnyScalar]
  • PostTag.metaValue: AnyScalar
  • PostTag.metaValues: [AnyScalar]

Например, этот запрос получает meta last_name для пользователей:

{
  users {
    id
    lastName: metaValue(key: "last_name")
  }
}

Поскольку значения meta могут быть чем угодно (string, integer, float или boolean), они отображены через вновь введённый универсальный скалярный тип AnyScalar.

Значения meta могут быть публичными или приватными. Какие meta-ключи можно запрашивать, необходимо явно настроить на странице настроек:

Определение записей
Определение записей

По умолчанию список разрешённых meta-ключей пуст.

Меню

Меню отображены через новый тип Menu и новое поле Root.menu.

{
  menu(by: { id: 176 }) {
    itemDataEntries
  }
}

Settings

Настройки сайта (хранящиеся в таблице wp_options) можно запрашивать через новое поле Root.option: AnyScalar.

Например, этот запрос получает название сайта:

{
  siteName: optionValue(name: "blogname")
}

Какие опции могут быть доступны, необходимо явно настроить на странице настроек:

Определение записей для Settings

По умолчанию можно запрашивать только следующие опции:

  • "home"
  • "blogname"
  • "blogdescription"

User posts

Авторизованные пользователи могут получать свои собственные записи для любого статуса (publish, pending, draft или trash) через новые поля:

  • Root.myPosts: [Post]
  • Root.myPostCount: Int
  • Root.myPost: Post

Например, теперь можно выполнить этот запрос:

# Log yourself in first
mutation LogIn {
  loginUser(usernameOrEmail: "test", password: "pass") {
    id
    name
  }
}
 
# Then retrieve your posts
query GetMyPosts {
  myPosts {
    id
    title
    url
    status
    author {
      name
    }
  }
}

Добавлены «unrestricted» поля администратора в схему GraphQL

Схема GraphQL должна соблюдать баланс между публичными и приватными полями, чтобы не раскрывать конфиденциальную информацию в публичном API.

Новый модуль Schema for the Admin добавляет «unrestricted» поля администратора в схему GraphQL, которые могут раскрывать приватные данные:

Root:

  • unrestrictedPost
  • unrestrictedPosts
  • unrestrictedPostCount
  • unrestrictedCustomPost
  • unrestrictedCustomPosts
  • unrestrictedCustomPostCount
  • unrestrictedGenericCustomPost
  • unrestrictedGenericCustomPosts
  • unrestrictedGenericCustomPostCount
  • unrestrictedPage
  • unrestrictedPages
  • unrestrictedPageCount
  • unrestrictedUsers
  • roles
  • capabilities

User:

  • unrestrictedPosts
  • unrestrictedPostCount
  • unrestrictedCustomPosts
  • unrestrictedCustomPostCount
  • roles
  • capabilities

PostCategory:

  • unrestrictedPosts
  • unrestrictedPostCount

PostTag:

  • unrestrictedPosts
  • unrestrictedPostCount

Например, для доступа к данным записей сейчас есть поле posts, которое раскрывает только публичные данные, возвращая опубликованные записи.

Теперь также можно получить данные записей через поле unrestrictedPosts, которое раскрывает публичные и приватные данные, возвращая записи с любым статусом ("publish", "draft", "pending", "trash").

{
  unrestrictedPosts(status: [draft, pending]) {
    id
    title
    status
    author {
      id
      name
    }
  }
}

Введён скалярный тип AnyScalar

Скалярный тип AnyScalar представляет любой из встроенных скаляров (String, Int, Boolean, Float или ID).

Он используется во вновь введённых полях option и metaValue(s), поскольку заранее неизвестен тип возвращаемых данных, а объединение скалярных типов ещё не поддерживается спецификацией GraphQL.

Settings в расширенном формате

Опции на странице Settings разделены по вкладкам. Начиная с v0.8, их также можно просматривать все вместе на одной длинной странице.

Чтобы включить это поведение, снимите флажок "Have all options in this Settings page be organized under tabs, one tab per module." в Settings и нажмите "Save Changes":

Флажок для включения/отключения вкладок в Settings

После этого все settings будут отображаться вместе в расширенном формате:

Settings в расширенном формате


Breaking changes

Релиз v0.8 вносит breaking changes по сравнению с предыдущей версией.

Configuration breaking changes

Для следующих CPT был перестроен блок «Options»:

  • Schema Configurations
  • Custom Endpoints
  • Persisted Queries

В предыдущей v0.7 единый блок Options для этих сущностей содержал множество элементов конфигурации. Начиная с v0.8, этот блок разделён на несколько независимых блоков, каждый из которых содержит свою конфигурацию.

Например, в v0.7 (помимо включения/отключения endpoint'а) блок Custom Endpoint Options позволял настраивать клиенты GraphiQL и Interactive Schema:

Опции в Custom Endpoint

Начиная с v0.8, эта конфигурация добавляется через блоки GraphiQL и Interactive Schema:

Опции в Custom Endpoint

Конфигурация, хранящаяся в блоках Options для всех 3 CPT, не переносится автоматически в новый формат. Поэтому перед обновлением до v0.8 запишите сохранённую конфигурацию и воспроизведите её после обновления до новой версии.

Приносим извинения за неудобства.

Кроме того, необходимо нажать кнопку «Reset the template» в редакторе WordPress для всех записей 3 CPT.

Reset the template в редакторе WordPress

Удалённые нестандартные директивы

Нестандартные директивы удалены из плагина:

  • @default
  • @removeIfNull
  • @export

Удалённые модули

Следующие модули удалены из плагина:

  • Field Deprecation
  • Configuration Cache
  • Schema Cache
  • Multiple Query Execution
  • Proactive Feedback
  • Schema Editing Access
  • Embeddable fields

Предстоящий Roadmap

Теперь, когда v0.8 выпущен, можно начать планировать дальнейший путь.

Текущий план выглядит следующим образом:

Выпустить v0.9 в сентябре 2021 года, включая:

  • Custom scalars
  • Обновлённую схему GraphQL с использованием custom scalars там, где это уместно (напр.: Post.date будет возвращать тип Date вместо String)
  • Дополнительные улучшения для поддержки расширений

А затем выпустить v1.0 в конце года или в начале 2022 года, включая:

  • Демонстрацию плагина-расширения
  • Полные руководства по документированию создания расширений
  • Запуск плагина Gato GraphQL на wp.org

Чтобы получать уведомления о текущем состоянии, вы можете подписаться на рассылку.


Возникли проблемы?

Если у вас возникли какие-либо проблемы при установке или запуске v0.8, пожалуйста, создайте issue в репозитории.


Подпишитесь на нашу рассылку

Будьте в курсе всех обновлений Gato GraphQL.