アクションと機能の提供

Objective

After completing this lesson, you will be able to ドメイン固有のカスタム操作の宣言および実装

CDS でのアクションと機能のモデリング

以前は、イベントハンドラの前後の例について説明しました。次に、ハンドラでのユースケースを見てみましょう。

ハンドラは、データベースとの間でデータの読込や書込を行うなどして、実際に要求を実行します。この例では、ハンドラを使用して、ドメイン固有のカスタム操作を実装します。

CAP でドメイン固有のカスタム操作の実装がサポートされる仕組みについては、ビデオを視聴してください。

注記

SAP では、バインドされていないアクション/関数のほうが実装と呼出がより簡単であるため、これらのアクション/関数を使用することをお奨めします。

例として、カタログサービスsubmitOrder というバインドされていないアクションを実装します。これは、(非常に簡略化された) 発注に使用されます。このアクションは、以下の図に示すように、サービス定義内で宣言します。

submitOrder アクションには 2 つの受信パラメータがあります。book という最初のパラメータは、順序付けられるブックを識別するために使用されます。パラメータは、インポートされたドメインモデルで定義された Books エンティティの ID 要素のデータ型を使用して型指定されます。

2 つ目のパラメータ quantity の型は Integer で、オーダーする品目の数を指定します。

在庫というプロパティを持つオブジェクトは、応答タイプとして定義されます。このプロパティは、Books ドメインモデルエンティティの株式要素のデータ型を使用して型指定されます。プロパティの値は、オーダーが実行された後の帳簿の新規在庫である必要があります。

注記

CDS モデルでバインドされていないバインドされたアクションと関数を定義するその他の例については、CAP 文書を参照してください

次に、宣言された submitOrder アクションを実装する方法について説明します。

アクション/機能の実装

アクションと関数は、イベントハンドラと同様に実装できます。アクションおよび関数のハンドラは、すでに CRUD イベントに使用しているイベントハンドラとよく似ています。

CatalogService の実装クラスの init() メソッドに、バインドされていない submitOrder アクションのオンハンドラを登録します (以下の図を参照)。このために、継承された on() メソッドを this.on() から呼び出します。

この例では、submitOrder アクションの実装として名前付き関数 this.reduceStock を登録します。これを行うために、アクションの名称が第 1 パラメータとしてメソッド on() に渡され、2 つ目のパラメータとして機能が渡されます。reduceStock 関数の実装については、次のセクションで詳しく説明します。

注記

バインドされたアクション/関数のハンドラを登録する方法については、CAP 文書を参照してください

事前メソッド実装

reduceStock メソッドを実装するアイデアは、以下のとおりです。

発注済帳簿の在庫をデータベースの受渡数量に応じて更新し、アクションのリターンパラメータを使用して更新された在庫を返品します。

以下のチェックが実行されます。

  • 合格数量は 1 以上である必要があります。
  • 渡されたブック ID がデータベースに存在する必要があります。
  • 帳簿の在庫は発注数量以上である必要があります。

これらのチェックのいずれかが失敗した場合は、エラーメッセージが発行される必要があります。

このロジックを実装するには、データベースにアクセスする必要があります。ただし、この方法は、次のレッスンまで学習しません。したがって、ここでは、在庫削減メソッドの不完全な事前実装に限定します (以下の図を参照)。

最初に、ブックエンティティの CSN 定義を、構造解除割当によってブック定数に割り当てます。この定数は、後でデータベースへのアクセスに使用します。

ハンドラ、特に cds.Request のインスタンスを引数として受け取ります。この例では、この引数を req と呼んでいます。req オブジェクトの data プロパティを使用して、パラメータ book および quantity of the action の値にアクセスします。ここでは、構成解除割当を使用して、渡された値を定数帳簿および数量に割り当てます。

渡された数量が 1 未満の場合は、メソッド req.error() を使用して対応するエラーメッセージが発行されます。

現時点では、10 個を更新在庫として返品します。これは、後で適宜調整します。

注記

ハンドラでの登録の代替として、アクションと関数を従来の JavaScript メソッドとしてサービス実装クラスに実装することもできます。メソッド名は、アクション/機能の名称と一致する必要があります。submitOrder アクションの実装は以下のようになります。

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

このようなアクション/機能のメソッドスタイルの実装は、init() メソッドに登録されていません。

アクション/機能の呼出

API を介したプログラムによる使用

アクションと機能は、コーディング内で呼び出すことができます。CAP には、このプログラムで使用する 2 つの異なるオプション (汎用 API と型指定された API) が用意されています。後者の場合、Node.js は、生成されたサービスインスタンスを、その名前とパラメータがサービスモデルでのアクション/機能の宣言に対応する特定のメソッドとともに備えています。これらの自動生成されたメソッドにより、アクション/機能を呼び出す便利な方法が提供されます。

注記

アクション/機能をプログラムで使用する例については、CAP 文書を参照してください

HTTP 要求

アクションと機能は、HTTP 要求を介して直接アクセスすることもできます。関数は GET 要求を介して呼び出され、アクションは POST 要求によって処理されます。

たとえば、バインドされていない submitOrder アクションを呼び出す HTTP 要求は、次のようになります。

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

注記

バインド解除およびバインドされたアクション/機能を呼び出す HTTP 要求の例については、CAP 文書を参照してください

デモと演習:カスタムアクションの定義と実装

注記

演習問題として、SAP Business Application Studio で、以下のデモのステップバイステップの手順を実行します。

演習の開始点として、前の演習問題 .after イベントハンドラが正常に完了している場合は、その結果を使用します。または、以下の GitHub リポジトリのブランチ 12_.after_event_handler を開始ポイントとして使用することもできます。

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

シミュレーションの完全な実装は、GitHub リポジトリの 13_custom_action ブランチにあります。

リポジトリのコンテンツとその使用方法の詳細については、ここを参照してください。

カスタムアクションを定義および実装する方法については、ビデオを視聴してください。