カスタムロジックの追加

Objective

After completing this lesson, you will be able to .before イベントハンドラを使用してプログラムチェックを実装します。

カスタムサービス実装

ほとんどの標準タスクおよびユースケースは汎用サービスプロバイダによってカバーされるため、サービス実装コードを追加する必要性が大幅に削減され、縮小されます。

残りのケースでは、ドメイン固有のプログラムチェックなど、ドメインおよびアプリケーションに固有の実際のカスタムロジックに削減されます。

たとえば、AdminService による新しい作成者の作成時に、渡された生年月日が死亡日より前であることを確認する検証をプログラムします。

カスタムサービス実装を追加する最も簡単な方法は、それぞれのサービス定義が含まれている .cds ファイルの横に等号の .js ファイルを配置することです。つまり、ここでは admin-service.js という名前のファイルをプロジェクトの srv フォルダに配置します。このフォルダには、AdminService の定義に使用されるファイル admin-service.cds も含まれているためです (以下の図を参照)。

注記

または、 .cds ファイル内のサービス定義に @impl アノテーションを付けることもできます。このアノテーションを使用して、サービス実装が含まれている別の .js ファイルを明示的に参照します。

.js ファイルに必要なカスタムロジックを実装するには、さまざまな方法があります。最も一般的な方法は、cds.ApplicationService のサブクラスを使用して、即座に利用可能な一般的な実装を活用することです。これは、cds.ApplicationService クラスがデフォルトのサービスプロバイダ実装であり、すでに説明した汎用プロバイダをサービス定義に追加するためです。

cds.ApplicationService のサブクラスを登録するには、最初に @sap/cds モジュールをコードの定数 cds に割り当てます (1 行目)。@sap/cds モジュールは、すべての CAP Node.js API へのアクセスを提供する cds ファサードオブジェクトです。

次に、cds.ApplicationService のサブクラスを 4 行目から 6 行目で登録します。このサブクラスでは、後でカスタムロジックを実装します。サブクラスの名称は任意です。ここではサービスインタフェースのように呼ばれています。AdminService

9 行目では、AdminService クラスを他のモジュールにインポートできるようにします。これは、Node.js でコードを構造化する一般的な手法です。

注記

端末に cds watch を入力してアプリケーションを起動すると、追加されたサービス実装ファイルが以下のような出力を介してログに表示されます。

Code Snippet
1
[cds] - serving AdminService { path: '/admin', impl: 'srv/admin-service.js' }

イベントハンドラ

カスタムサービス実装は、カスタムイベントハンドラを使用して実行されます。これにより、さまざまなタイプのハンドラが区別されます。

ビデオを視聴して、さまざまなイベントハンドラの概要を把握します。

.before Event Handlers の登録

実装するチェックには、Authors エンティティでの CREATE および UPDATE 操作に対して登録する必要がある前ハンドラが必要です。

カスタムイベントハンドラを登録するには、登録された実装クラスで継承された init() メソッドを上書きします (以下の図を参照)。実装で super.init() を呼び出し、サブクラスによるハンドラの登録を許可することを忘れないでください。

init() メソッドに before ハンドラを登録するには、継承された before() メソッドを this.before() から呼び出します。 これを行うには、以下のインタフェースを提供する必要があります。個々のパラメータの詳細な説明については、CAP 文書を参照してください

Code Snippet
12345
function before ( event : string | string[] | '*', entity? : CSN definition | CSN definition[] | string | string[] | '*', handler : function )

この例では、名前付き関数this.validateLifeData が Authors エンティティでの CREATE および UPDATE 操作に対して登録されています。この機能の実装については、後で説明します。

登録が行われるエンティティは、文字列として before() メソッドに渡すことができます。ただし、代わりに CSN 定義をここで渡すことが推奨されます。サービスを介して公開されるエンティティの CSN 定義は、this.entities プロパティから簡単に使用可能です。

この例では、Authors エンティティに必要な CSN 定義が、構成解除割当によってオーサー定数に割り当てられています。

注記

構成解除割当構文は JavaScript 標準です。配列からの値、またはオブジェクトのプロパティを個別の変数に解凍できるようにする JavaScript 式です。

受信データのチェック

最後に、ハンドラとして登録されている validateLifeData 関数を AdminService クラスに実装する方法について説明します。

ハンドラは通常、cds.Request のインスタンスである 1 つの引数を受け取っていました。このインスタンスは、ハンドラの実装に使用できるプロパティとメソッドを提供します。この例では、引数に req という名前を付けました (以下の図を参照)。

ここでは、CREATE 要求および UPDATE 要求に関して、interface パラメータの data プロパティに要求の HTTP 本文が含まれます。構造解除割当を使用して、HTTP 本文から渡された値を定数 dateOfBirth および dateOfDeath に割り当てます。

死亡日が生年月日より前の場合は、req.error() メソッドを使用して対応するエラーメッセージを発行します。

注記

req.error() メソッドでは、プロパティ req.errors のすべてのエラーが収集され、UI に同時に表示することができます。前のフェーズの後に req.errors がある場合、要求処理は中止され、対応するエラー応答がクライアントに返されます。

ヒント

req.error() メソッドに渡されるリテラルは、バックチック (`) 文字で区切られます。このようなテンプレートリテラルでは、${name_of_the_variable} という構文を使用して、変数値を文字列に埋め込むことができます。

デモおよび演習: .before イベントハンドラの提供

注記

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

演習の開始点として、前の演習問題 "非正規化ビューに基づくサービスの定義" の結果を使用します (正常に完了した場合)。または、以下の GitHub リポジトリのブランチ 10_denormalized_views を開始点として使用することもできます。

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

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

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

.before イベントハンドラを指定する方法については、ビデオを視聴してください。