Mise à disposition d'actions et de fonctions

Objective

After completing this lesson, you will be able to déclarer et implémenter des opérations personnalisées spécifiques au domaine

Modélisation d'actions et de fonctions dans CDS

Auparavant, nous avons discuté d'exemples de gestionnaires d'événements avant et après. Examinons maintenant un cas d'utilisation pour les gestionnaires sur.

Un gestionnaire sur répond réellement aux demandes, par exemple en lisant ou en écrivant des données depuis ou vers des bases de données. Dans notre exemple, nous voulons utiliser un gestionnaire sur pour implémenter une opération personnalisée spécifique au domaine.

Regardez la vidéo pour découvrir comment CAP prend en charge la mise en œuvre d'opérations personnalisées spécifiques au domaine.

Remarque

SAP recommande de privilégier les actions/fonctions non liées, car elles sont beaucoup plus simples à implémenter et à appeler.

Par exemple, nous voulons implémenter une action non liée appelée submitOrder pour le CatalogService. Il est utilisé pour passer des commandes (de manière très simplifiée). Nous déclarons cette action dans la définition de service comme illustré dans la figure suivante.

L'action SubmitOrder a deux paramètres de réception. Le premier paramètre appelé livre est utilisé pour identifier le livre à ordonner. Le paramètre est typé à l'aide du type de données de l'élément ID de l'entité Books définie dans le modèle de domaine importé.

Le deuxième paramètre Quantité est de type Integer et indique le nombre de postes à commander.

Un objet avec une propriété appelée stock est défini comme type de réponse. Cette propriété est typée à l'aide du type de données de l'élément stock de l'entité de modèle de domaine Books. La valeur de la propriété doit être la nouvelle action pour le livre après l'exécution de l'ordre.

Remarque

D'autres exemples de définition d'actions et de fonctions non liées et liées dans les modèles CDS sont disponibles dans la documentation CAP.

Voyons maintenant comment implémenter l'action SubmitOrder déclarée.

Implémentation d'actions/fonctions

Les actions et les fonctions peuvent être implémentées comme dans les gestionnaires d'événements. Les gestionnaires d'actions et de fonctions sont très similaires aux gestionnaires d'événements que nous avons déjà utilisés pour les événements CLAS.

Nous enregistrons le gestionnaire On pour notre action unbound submitOrder dans la méthode init() de la classe d'implémentation pour le CatalogService (voir la figure suivante). Pour ce faire, nous appelons la méthode on() héritée via this.on().

Dans l'exemple illustré, nous enregistrons la fonction nommée this.reduceStock comme implémentation pour l'action submitOrder. Pour ce faire, le nom de l'action est transmis à la méthode on() comme premier paramètre et la fonction comme deuxième paramètre. Nous aborderons plus en détail la mise en œuvre de la fonction RéductionStock dans la section suivante.

Remarque

Pour plus d'informations sur l'enregistrement des gestionnaires pour les actions/fonctions liées, reportez-vous à la documentation CAP.

Implémentation de la méthode préliminaire

L'idée d'implémenter la méthode de réduction des stocks est la suivante.

Nous mettons à jour le stock du livre commandé en fonction de la quantité transmise sur la base de données et retournons le stock mis à jour via le paramètre de retour de l'action.

Les validations suivantes doivent être effectuées :

  • La quantité transmise doit être supérieure ou égale à 1.
  • L'ID de dossier transféré doit exister dans la base de données.
  • Le stock du livre doit être supérieur ou égal à la quantité commandée.

Si l'une de ces validations échoue, un message d'erreur doit être généré.

Pour implémenter cette logique, nous devons accéder à la base de données. Cependant, nous n'apprendrons pas à le faire avant la prochaine leçon. Nous nous limiterons donc ici à une implémentation préliminaire incomplète de la méthode de réduction des stocks (voir figure suivante).

Tout d'abord, nous affectons la définition CSN de l'entité Books à la constante Books via une affectation de déstructuration. Nous utiliserons cette constante ultérieurement pour accéder à la base de données.

Sur les gestionnaires reçoivent, entre autres, une instance de cds.Request comme argument. Dans l'exemple illustré, nous avons appelé cet argument req. La propriété de données de l'objet req est utilisée pour accéder aux valeurs des paramètres livre et quantité de l'action. Nous utilisons ici une affectation de déstructuration pour affecter les valeurs passées aux constantes livre et quantité.

Si la quantité transférée est inférieure à 1, nous éditons un message d'erreur correspondant à l'aide de la méthode req.error() .

Pour l'instant, nous retournons simplement 10 comme stock mis à jour. Nous l'ajusterons en conséquence plus tard.

Remarque

Comme alternative à l'enregistrement d'un gestionnaire sur, des actions et des fonctions peuvent également être implémentées comme méthodes JavaScript classiques sur une classe d'implémentation de service. Le nom de la méthode doit alors correspondre au nom de l'action/fonction. L'implémentation de notre action Soumettre l'ordre se présenterait alors comme suit :

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 }; } }

Une telle implémentation de type méthode d'une action/fonction n'est pas enregistrée dans la méthode init() .

Appel d'actions/fonctions

Utilisation programmatique via API

Les actions et les fonctions peuvent être appelées dans le codage. CAP fournit deux options différentes pour cette utilisation programmatique : une API générique et une API typée. Pour ce dernier, Node.js dote les instances de service générées de méthodes spécifiques dont les noms et paramètres correspondent à la déclaration des actions/fonctions dans le modèle de service. Ces méthodes générées automatiquement offrent un moyen pratique d'appeler des actions/fonctions.

Remarque

Vous trouverez des exemples d'utilisation programmatique d'actions/de fonctions dans la documentation CAP.

Requêtes HTTP

Les actions et les fonctions sont également accessibles directement via des requêtes HTTP. Les fonctions sont appelées via des requêtes GET, tandis que les actions sont traitées via des requêtes POST.

Par exemple, une requête HTTP pour appeler notre action unbound submitOrder peut ressembler à ceci :

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

Remarque

D'autres exemples de requêtes HTTP pour appeler des actions/fonctions non liées et liées sont disponibles dans la documentation CAP.

Démonstration et exercice : définition et mise en œuvre d'une action personnalisée

Remarque

Dans l'exercice, suivez les instructions étape par étape de la démonstration suivante dans SAP Business Application Studio.

Comme point de départ de l'exercice, utilisez le résultat de l'exercice précédent Fournir un gestionnaire d'événements après si vous l'avez terminé avec succès. Vous pouvez également utiliser la branche 12_.after_event_handler du référentiel GitHub suivant comme point de départ :

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

L'implémentation complète de la simulation se trouve dans la branche 13_custom_action du référentiel GitHub.

Vous trouverez ici des informations détaillées sur le contenu du référentiel et son utilisation.

Regardez la vidéo pour découvrir comment définir et implémenter une action personnalisée.