SAP GraphQL en CAPm (node.js)

En esta entrada os hablaré de una de las nuevas features incorporadas en las librerías de CAPm y que de manera experimental ya podemos incluir en nuestros CAPm.

img

Pero antes, ¿qué es esto de GraphQL? Pues no es nada más que un lenguaje de consultas de información, pero entonces, ¿qué cambia con las queries en OData que tenemos actualmente? La principal diferencia es que seremos nosotros los que solicitaremos que información y como obtener la respuesta.

Esto nos sera útil cuando tenemos varias fuentes de información y queremos recopilar información de ellas y influir sobre el resultado.

Y después de esta brevísima introducción creo que lo mejor es pasar a un ejemplo practico para que veáis el potencial.

Añadir GraphQL a nuestro CAPm

Para esta demo partiremos del clásico ejemplo de nuestro BAS para montar nuestro ejemplo:

Creando el proyecto CAPm

Para este ejemplo utilizaremos la plantilla de bookshop que nos proporciona nuestro BAS. Así que este primer paso es crear un CAPm:

  • Creamos un nuevo proyecto «from template»
  • Añadimos el nombre del proyecto y seleccionamos que queremos los ficheros de ejemplo basico:

De momento no hemos hecho nada nuevo, este seria el resultado si por ejemplo ejecutamos el comando «cds watch»

Añadiendo dependencias entre entidades

El próximo paso para hacer mas visual el potencial de GraphQL crearemos una segunda entidad para añadir el autor al libro y así también tener los libros de cada autor.

Vamos al fichero: «/db/data-model.cds» y añadimos la entidad con los datos de autor:

entity Authors {
    key ID: Integer;
    name: String;
}

Lo siguiente es crear las relaciones entre las dos entidades, así que en la entidad Book le añadiremos la asociación con el autor y al autor la lista de libros:

entity Books {
  key ID : Integer;
  title  : String;
  stock  : Integer;
  author: Association to Authors;
}
entity Authors {
    key ID: Integer;
    name: String;
    books: Composition of many Books
                on books.author = $self;
}

Por último para poder exponer la entidad Authors en nuestro servicio la añadiremos el fichero «/srv/cat-service.cds»

using my.bookshop as my from '../db/data-model';

service CatalogService {
    @readonly entity Books as projection on my.Books;
    @readonly entity Authors as projection on my.Authors;
}

Añadiendo datos al modelo

Ahora crearemos los ficheros de datos para poder probar nuestro servicio. De entrada ya tendremos creado el fichero de libros, pero requerirá un cambio.

Vamos a la carpeta: «/db/data» y creamos el fichero «my.bookshop-Authors.csv». Este será el resultado:

El contenido del fichero de authors será:

ID;name
1;Pepe
2;Juan

Y para el fichero de books añadiremos el campo que nos ligará el libro con el autor:

ID;title;stock;author_ID
1;Wuthering Heights;100;1
2;Jane Eyre;500;1
3;Hello world;500;2

Ahora podemos hacer una pequeña prueba para ver si los datos se han guardado. De momento no tenemos nuestro endpoint «GraphQL» apunto, así que lo haremos con el estándar de OData (expands). Ejecutamos el comando «cds watch» vamos a nuestro servicio y añadimos a la URL: «/catalog/Books(1)?$expand=author«

Este será el resultado:

{"@odata.context":"$metadata#Books(author())/$entity","ID":1,"title":"Wuthering Heights","stock":100,"author_ID":1,"author":{"ID":1,"name":"Pepe"}}

Como vemos, tenemos los datos del libro y del autor. Vamos a añadir GraphQL.

Añadiendo GraphQL

Vamos a añadir la extensión para tener GraphQL. Lo primero sera instalar la librería necesaria, así que ejecutáremos en el terminal:

npm i -g @sap/cds-dk

Una vez ejecutado veremos en la consola este resultado:

Lo siguiente será añadir las librerias para GraphQL con el comando:

npm add graphql express-graphql @graphql-tools/schema

Y este sera el resultado:

Por último añadimos la configuración para activar la nueva feature. El último parámetro sera el nombre de la carpeta donde tenemos nuestro proyecto. Aquí remarcar que hay que salir de la carpeta del proyecto e ir a su raiz:

cds_features_graphql=true cds w bookshopGraphQL

Al ejecutar el comando también se nos activará de nuevo el servidor y podremos ver el resultado:

Probando nuestra API con GraphQL

Para probar nuestra API con Graphql accedemos al nuevo endpoint que nos ha aparecido «/graphql». Al acceder nos aparece el editor para realizar las consultas

En el editor añadiremos la sentencia para obtener los libros y los autores. Primero obtendremos el catalogo de libros, como si de un OData se tratará:

Ahora solicitaremos el autor asociado al libro:

Como vemos ahora tenemos la relación de libros y autores. Pero con poco esfuerzo podemos hacer la consulta a la inversa:

Incluso podemos solicitar con una sola petición las dos entidades y sus relaciones para optimizar el numero de llamadas:

Como truco extra, si queries fijar esta feature en vuestro proyecto podemos modificar el fichero package.json con lo siguiente:

    "features": {
        "graphql": true
    }

Este seria el resultado de como queda el fichero:


Como podéis ver, gracias a GraphQL podemos solicitar los datos de multiples entidades de manera fácil y con la estructura que más nos convenga.

Como siempre suscribete, dale a la campanita de notificaciones y comparte en redes para estar a la última. Vota Like / Dislike para aportar feedback.

2 respuestas a «SAP GraphQL en CAPm (node.js)»

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.