Fornecimento de ações e funções

Objective

After completing this lesson, you will be able to declarar e implementar operações personalizadas específicas de domínio

Ações e funções de modelagem no CDS

Anteriormente, discutimos exemplos de manipuladores de eventos antes e depois. Vejamos um caso de uso para manipuladores.

Um manipulador on realmente atende a solicitações, por exemplo, lendo ou escrevendo dados de ou para bancos de dados. Em nosso exemplo, queremos usar um manipulador de on para implementar uma operação personalizada específica de domínio.

Assista ao vídeo para ver como o CAP suporta a implementação de operações personalizadas específicas de domínio.

Nota

A SAP recomenda preferir ações/funções não vinculadas, pois elas são muito mais simples de implementar e chamar.

Como exemplo, queremos implementar uma ação não vinculada chamada submitOrder para o CatalogService. Ele é utilizado para efetuar ordens (de uma forma muito simplificada). Declaramos essa ação na definição de serviço, conforme mostrado na figura a seguir.

A ação submitOrder tem dois parâmetros de entrada. O primeiro parâmetro chamado livro é usado para identificar o livro a ser ordenado. O parâmetro é tipificado usando o tipo de dados do elemento ID da entidade Livros definida no modelo de domínio importado.

O segundo parâmetro quantidade é do tipo Integer e indica o número de itens a serem pedidos.

Um objeto com uma propriedade chamada estoque é definido como o tipo de reação. Esta característica é tipificada utilizando o tipo de dados do elemento de estoque da entidade Books domain model. O valor da propriedade deve ser o novo estoque para o livro após a ordem ter sido executada.

Nota

Outros exemplos para definir ações e funções não vinculadas e vinculadas em modelos CDS podem ser encontrados na documentação do CAP.

Em seguida, vejamos como implementar a ação submitOrder declarada.

Implementar ações/funções

As ações e funções podem ser implementadas como nos manipuladores de eventos. Os manipuladores para ações e funções são muito semelhantes aos manipuladores de eventos que já usamos para eventos CRUD.

Registramos o manipulador on para nossa ação submitOrder não vinculada no método init() da classe de implementação para o CatalogService (consulte a figura a seguir). Para isso, chamamos o método herdado on() via this.on().

No exemplo mostrado, registramos a função nomeada this.reduceStock como a implementação para a ação submitOrder. Para isso, o nome da ação é transferido para o método on() como primeiro parâmetro e a função como o segundo parâmetro. Abordaremos a implementação da função reduceStock mais detalhadamente na próxima seção.

Nota

Consulte a documentação CAP para obter informações sobre como registrar manipuladores para ações/funções vinculadas.

Implementação de método preliminar

A ideia para implementar o método reduceStock é a seguinte.

Atualizamos o estoque do livro pedido de acordo com a quantidade transferida no banco de dados e retornamos o estoque atualizado por meio do parâmetro de retorno da ação.

Devem ser executadas as seguintes validações:

  • A quantidade aprovada deve ser superior ou igual a 1.
  • O ID do livro transferido deve existir no banco de dados.
  • O estoque para o registro deve ser superior ou igual à quantidade pedida.

Se uma dessas validações falhar, deve ser emitida uma mensagem de erro.

Para implementar essa lógica, precisamos acessar o banco de dados. No entanto, não aprenderemos a fazer isso até a próxima lição. Por isso, vamos nos restringir aqui a uma implementação preliminar incompleta do método reduceStock (veja a figura a seguir).

Primeiro, atribuímos a definição CSN da entidade Livros à constante Livros por meio de uma atribuição de desestruturação. Usaremos essa constante posteriormente para acessar o banco de dados.

Em manipuladores recebem, entre outras coisas, uma instância de cds.Request como um argumento. No exemplo mostrado, chamamos esse argumento de req. A característica de dados do objeto obrigatório é utilizada para acessar os valores do registro de parâmetros e da quantidade da ação. Utilizamos aqui uma atribuição de desestruturação para atribuir os valores transferidos ao livro e à quantidade de constantes.

Se a quantidade aprovada for inferior a 1, emitimos uma mensagem de erro correspondente utilizando o método req.error() .

Por enquanto, simplesmente retornamos 10 como o estoque atualizado. Ajustaremos isso de acordo mais tarde.

Nota

Como alternativa ao registro de um manipulador, ações e funções também podem ser implementadas como métodos JavaScript convencionais em uma classe de implementação de serviço. O nome do método deve corresponder ao nome da ação/função. A implementação para nossa ação submitOrder teria o seguinte aspecto:

JavaScript
1234567891011121314
class CatalogService extends cds.ApplicationService { submitOrder(book, quantity) { const { Books } = this.entities; if (quantity < 1) { return req.error('The quantity must be at least 1.'); } let stock = 10; return { stock }; } }

Tal implementação de estilo de método de uma ação/função não está registrada no método init() .

Chamar ações/funções

Uso programático via APIs

As ações e funções podem ser chamadas dentro da codificação. O CAP fornece duas opções diferentes para esse uso programático: uma API genérica e uma API tipificada. Para este último, o Node.js equipa instâncias de serviço geradas com métodos específicos cujos nomes e parâmetros correspondem à declaração das ações/funções no modelo de serviço. Esses métodos gerados automaticamente fornecem uma forma conveniente de chamar ações/funções.

Nota

Exemplos para a utilização programática de ações/funções podem ser encontrados na documentação CAP.

Solicitações HTTP

Ações e funções também podem ser acessadas diretamente por meio de solicitações HTTP. As funções são chamadas por meio de solicitações GET, enquanto as ações são abordadas por meio de solicitações POST.

Por exemplo, uma solicitação HTTP para chamar nossa ação submitOrder não vinculada pode ter o seguinte aspecto:

Code Snippet
1234567
POST <service_url>/submitOrder Content-Type: application/json { "book": "0ec991dc-95c5-4d8f-91e6-f81a92744781", "quantity": 2 }

Nota

Outros exemplos de requisições HTTP para chamar ações/funções desvinculadas e vinculadas podem ser encontrados na documentação CAP.

Demonstração e exercício: definir e implementar uma ação personalizada

Nota

Como exercício, execute as instruções passo a passo na demonstração a seguir no SAP Business Application Studio.

Como ponto de partida para o exercício, utilize o resultado do exercício anterior Fornecer um . após o manipulador de eventos se você o tiver concluído com êxito. Como alternativa, você também pode utilizar o ramo 12_.after_event_handler do seguinte repositório GitHub como ponto de partida:

https://github.com/SAP-samples/cap-development-learning-journey

A implementação completa da simulação pode ser encontrada no ramo 13_custom_action do repositório GitHub.

Informações detalhadas sobre o conteúdo do repositório e como usá-lo podem ser encontradas aqui.

Assista ao vídeo para ver como definir e implementar uma ação personalizada.