Persisted Queries
Persisted QueriesPersisted Queries

Persisted Queries

Included in the “Power Extensions” bundle

Usa consultas GraphQL para crear endpoints predefinidos como en REST, obteniendo los beneficios de ambas APIs.

Descripción

Con REST, creas múltiples endpoints, cada uno devolviendo un conjunto predefinido de datos.

VentajasDesventajas
✅ Es simple❌ Es tedioso crear todos los endpoints
✅ Se accede mediante GET o POST❌ Un proyecto puede sufrir cuellos de botella esperando a que los endpoints estén listos
✅ Se puede cachear en el servidor o CDN❌ Producir documentación es obligatorio
✅ Es seguro: solo se exponen los datos previstos❌ Puede ser lento (principalmente para apps móviles), ya que la aplicación puede necesitar varias peticiones para obtener todos los datos

Con GraphQL, proporcionas cualquier consulta a un único endpoint, que devuelve exactamente los datos solicitados.

VentajasDesventajas
✅ No hay under/over fetching de datos❌ Solo se accede mediante POST
✅ Puede ser rápido, ya que todos los datos se obtienen en una única petición❌ No se puede cachear en el servidor o CDN, lo que lo hace más lento y caro de lo que podría ser
✅ Permite iterar rápidamente el proyecto❌ Puede requerir reinventar la rueda, como subir archivos o cachear
✅ Puede ser auto-documentado❌ Hay que lidiar con complejidades adicionales, como el problema N+1
✅ Proporciona un editor para la consulta (GraphiQL) que simplifica la tarea 

Las persisted queries combinan estos 2 enfoques:

  • Utilizan GraphQL para crear y resolver consultas
  • Pero en lugar de exponer un único endpoint, exponen cada consulta predefinida bajo su propio endpoint

Por tanto, obtenemos múltiples endpoints con datos predefinidos, como en REST, pero creados utilizando GraphQL, obteniendo las ventajas de cada uno y evitando sus desventajas:

VentajasDesventajas
✅ Se accede mediante GET o POST❌ Es tedioso crear todos los endpoints
✅ Se puede cachear en el servidor o CDN❌ Un proyecto puede sufrir cuellos de botella esperando a que los endpoints estén listos
✅ Es seguro: solo se exponen los datos previstos❌ Producir documentación es obligatorio
✅ No hay under/over fetching de datos❌ Puede ser lento (principalmente para apps móviles), ya que la aplicación puede necesitar varias peticiones para obtener todos los datos
✅ Puede ser rápido, ya que todos los datos se obtienen en una única petición❌ Solo se accede mediante POST
✅ Permite iterar rápidamente el proyecto❌ No se puede cachear en el servidor o CDN, lo que lo hace más lento y caro de lo que podría ser
✅ Puede ser auto-documentado❌ Puede requerir reinventar la rueda, como subir archivos o cachear
✅ Proporciona un editor para la consulta (GraphiQL) que simplifica la tarea❌ Hay que lidiar con complejidades adicionales, como el problema N+1 👈🏻 este problema es resuelto por el motor subyacente

Editor de persisted query

Ejecutando la Persisted Query

Una vez que la persisted query se publica, podemos ejecutarla mediante su permalink.

La persisted query puede ejecutarse directamente en el navegador, ya que se accede mediante GET, y obtendremos los datos solicitados en formato JSON:

Ejecutando una persisted query en el navegador

Creando una Persisted Query

Al hacer clic en el enlace Persisted Queries del menú, se muestra la lista de todas las persisted queries creadas:

Persisted queries con descripción
Persisted queries con descripción

Una persisted query es un custom post type (CPT). Para crear una nueva persisted query, haz clic en el botón "Añadir Nueva persisted query GraphQL", lo que abrirá el editor de WordPress:

Creando una nueva Persisted Query

La entrada principal es el cliente GraphiQL, que viene con el Explorer por defecto. Hacer clic en los campos del panel lateral izquierdo los añade a la consulta, y hacer clic en el botón "Run" ejecuta la consulta:

GraphiQL Explorer

Cuando la consulta está lista, publícala, y su permalink se convertirá en su endpoint. El enlace al endpoint (y al source) se muestra en el panel lateral "Resumen del Endpoint de Persisted Query":

Resumen del Endpoint de Persisted Query

Añadiendo ?view=source al permalink, se mostrará la persisted query y su configuración (siempre que el usuario haya iniciado sesión y el rol del usuario tenga acceso):

Source de la persisted query

Por defecto, el endpoint de la persisted query tiene la ruta /graphql-query/, y este valor es configurable mediante los Ajustes:

Ajustes de Persisted query
Ajustes de Persisted query

Configuración del esquema

La definición de qué elementos contiene el esquema, y qué acceso tendrán los usuarios al mismo, se define en la configuración del esquema.

Por tanto, debemos crear una configuración del esquema, y luego seleccionarla desde el desplegable:

Seleccionando la configuración del esquema

Organizando Persisted Queries por Categoría

En el panel lateral "Categorías de endpoint" podemos añadir categorías para ayudar a gestionar la Persisted Query:

Categorías de endpoint al editar una Persisted Query

Por ejemplo, podemos crear categorías para gestionar endpoints por cliente, aplicación, o cualquier otra información necesaria:

Lista de categorías de endpoint

En la lista de Persisted Queries podemos visualizar sus categorías y, haciendo clic en cualquier enlace de categoría, o usando el filtro de la parte superior, solo se mostrarán todas las entradas de esa categoría:

Lista de Persisted Queries con sus categorías

Persisted queries privadas

Estableciendo el estado de la Persisted Query como private, el endpoint solo podrá ser accedido por el usuario administrador. Esto evita que nuestros datos sean compartidos involuntariamente con usuarios que no deben tener acceso a ellos.

Por ejemplo, podemos crear Persisted Queries privadas que ayuden a gestionar la aplicación, como obtener datos para crear informes con nuestras métricas.

Persisted Query privada

Persisted queries protegidas con contraseña

Si creamos una Persisted Query para un cliente específico, podemos asignarle una contraseña, para proporcionar un nivel adicional de seguridad y que solo ese cliente acceda al endpoint.

Persisted Query protegida con contraseña

Cuando se accede por primera vez a una persisted query protegida con contraseña, nos encontramos con una pantalla que solicita la contraseña:

Persisted Query protegida con contraseña: Primer acceso

Una vez que se proporciona y valida la contraseña, solo entonces el usuario accederá al endpoint previsto.

Haciendo dinámica la persisted query mediante parámetros URL

El valor para cada variable puede establecerse mediante un parámetro URL (con el nombre de la variable) al ejecutar la persisted query. Si la opción "¿Anulan los parámetros URL a las variables?" está habilitada, entonces el parámetro URL tendrá prioridad. De lo contrario, el valor definido en el diccionario de variables tendrá prioridad (si existe).

Por ejemplo, en esta consulta, el número de resultados se controla mediante la variable $limit, con un valor por defecto de 3:

Usando variables en persisted query

Al ejecutar esta persisted query, pasando ?limit=5 ejecutará la consulta devolviendo 5 resultados:

Anulando el valor de las variables en persisted query