2023年1月19日木曜日

Microsoft OneDriveを操作するAPEXアプリの作成(4) - RESTデータ・ソース

OneDriveにあるドライブ、ルート直下のファイルまたはフォルダ(DriveItems)の一覧、フォルダに含まれるDriveItemsを取得するRESTデータ・ソースを作成し、それらをソースとした対話モード・レポートを作成します。

共有コンポーネントRESTデータ・ソースを開きます。

作成をクリックします。

RESTデータ・ソースの作成最初からとします。

へ進みます。


RESTデータ・ソース・タイプとして簡易HTTPを選択します。

作成するRESTデータ・ソースの名前My Drivesとします。

URLエンドポイントとして、以下を指定します。所有しているドライブの一覧を取得します。

https://graph.microsoft.com/v1.0/me/drives

へ進みます。


入力したURLエンドポイントより、リモート・サーバーサービスURLパスが導出されます。

変更は不要です。そのままへ進みます。


ページ区切りタイプページ区切りなしから変更しません。

Microsoft Graph APIはODataに準拠していることより、ページングをサポートしていると考えられます。そういう仕様も考慮する場合は、ODataプラグインの利用を検討すべきでしょう。

へ進みます。


認証の設定に進みます。

認証が必要ですONにします。資格証明として認証スキームで使用しているMS Azure AD Cred for OneDriveを選択します。

OAuthトークンURLですが指定が必須になっています。APEX_WEB_SERVICE.MAKE_REST_SERVICEを呼び出す際には、そのような指定は無くても応答は返ってきているため、なぜこの値が必須なのか不明です。

適当な値を設定しても動くようですが、もっともそれらしい値を設定するよう努力します。

最初にトークンURLを確認します。Open ID Connectの検出URLをブラウザより直接呼び出します。

https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration

JSONの応答より、token_endpointを確認します。


token_endpointは以下になります。

https://login.microsoftonline.com/common/oauth2/v2.0/token

commonの部分を、このアプリケーションのテナントIDで置き換えます。Azure Active Directoryのアプリのページを開き、ディレクトリ(テナント)IDコピーします。

OAuthトークンURLに、commonをテナントIDで置き換えたURLを指定します。

検出をクリックすると、認証のエラーが発生します。そのため、RESTソースの手動作成をクリックします。


RESTデータ・ソースとしてMy Drivesが作成されます。

まだ設定は完了していないため、RESTデータ・ソースMy Drivesを開いて編集します。


操作POSTPUTDELETEは使用しないため、編集鉛筆アイコンをクリックして削除します。その後、データ・プロファイルの編集をクリックします。


データ・プロファイルを編集するダイアログが開きます。

データ・プロファイル行セレクタとしてvalueを指定します。再検出サンプル・レスポンスとしてGraph APIをテストしたときにJSON形式の応答を保存したファイルdrives.jsonを選択します。

以上の指定を行い、データ・プロファイルの再検出をクリックします。


サンプル・レスポンスよりが検出されます。データ・プロファイルの置換をクリックします。


データ・プロファイルの列が置き換わります。変更の適用をクリックします。


変更の適用をクリックし、RESTデータ・ソースMy Drivesの編集を完了します。


同様の手順で、ドライブのルート直下のファイルやフォルダを取得するRESTデータ・ソースを作成します。

RESTデータ・ソースの名前はMy Rootとします。URLエンドポイントの指定は以下になります。

https://graph.microsoft.com/v1.0/me/drive/root/children


データ・プロファイルサンプル・レスポンスとして使用するファイルは、root.jsonとして作成しているので、それを使用します。


RESTデータ・ソースとしてMy DrivesMy Rootが作成されました。

フォルダを選択した上で、ファイルの一覧を表示するRESTデータ・ソースを作成するにはフォルダのIDが必要です。この2つのRESTデータ・ソースを使った対話モード・レポートを作成し(特にMy Root)、次に作成するRESTデータ・ソースに必要なフォルダIDを表示させます。

ページの作成を実行します。


空白ページを選択します。


ページ定義名前Rootページ・モード標準、ナビゲーションはデフォルトから変更しません。デフォルトでは、ブレッドクラム、ナビゲーション・メニューともに作成されます。

ページの作成をクリックします。


ページが作成されたら、RESTデータ・ソースMy Drivesをソースとする、対話モード・レポートのリージョンを作成します。

識別タイトルMy Drivesタイプとして対話モード・レポートを選択します。ソース位置RESTソースRESTソースとしてMy Drivesを選択します。


同様にRESTソースMy Rootの対話モード・レポートを作成します。


以上でページは完成です。

変更を保存し、ページを実行します。

ルート直下にあるフォルダの行を見つけ、Id値を取得します。


取得したID値を含めた、以下のGraph APIのURLを実行し、データ・プロファイルを取得するためのサンプル・レスポンスを出力します。

https://graph.microsoft.com/v1.0/me/drive/items/<IDで置き換える>/children


このJSONの出力は、folder.jsonとして保存します。

RESTデータ・ソースMy Drivesを作成したのと同様の手順にて、RESTデータ・ソースMy Folderを作成します。

RESTデータ・ソースの名前My FolderURLエンドポイントはフォルダのIDの部分を:item_idとした、以下の値を指定します。

https://graph.microsoft.com/v1.0/me/drive/items/:item_id/children

:item_idはURLパラメータとして認識されるため、URLパラメータ1としてitem_idが検出されます。はデフォルトとしてJSONの出力時に使用したフォルダのIDを指定します。


これ以降は、My DrivesやMy Rootの作成手順と同じです。

最後にRESTデータ・ソースのパラメータとしてitem_idの設定が含まれていることを確認します。


以上でRESTデータ・ソースMy Folderが作成されました。

今回のアプリで使用するRESTデータ・ソース、My Drives、My Root、My Folderの3つが作成されました。


RESTデータ・ソースMy Folderを使った対話モード・レポートのページを作成します。

ページの作成を実行し、対話モード・レポートを選択します。


ページ定義名前Folderページ・モードは標準を選択します。データ・ソースとしてRESTデータ・ソースを選択し、RESTデータ・ソースMy Folderとします。ナビゲーションはデフォルトから変更しません。

ページの作成をクリックします。


対話モード・レポートのページが作成されます。

レポートにはパラメータitem_idが含まれています。デフォルトでは静的値として、サンプル・レスポンスの出力に使用したIDが設定されています。


ページを実行すると、指定されたフォルダに含まれるアイテムの一覧が表示されます。


一覧を表示するフォルダを選択できるようにします。

ページ・アイテムを作成します。このページ・アイテムに、一覧表示の対象とするフォルダのアイテムIDを保持します。

識別名前P3_ITEM_IDタイプ非表示とします。


対話モード・レポートのパラメータitem_idを選択し、タイプアイテムに変更します。アイテムとしてP3_ITEM_IDを選択します。


ルート直下のフォルダやファイルを一覧しているレポートMy Rootに表示されているフォルダ名をクリックして、このMy Folderのレポートを開かれるようにリンクを追加します。

対話モード・レポートMy Rootを選択し、ローカル後処理タイプSQL問合せに変更します。

変更後に表示されるSQL問合せに、列L_FOLDER_LINKとして以下を追加します。

,apex_page.get_url(
    p_page => 3
    ,p_items => 'P3_ITEM_ID'
    ,p_values => ID
) L_FOLDER_LINK

追加した列L_FOLDER_LINKはレポートに表示する必要はないため(また、OneDriveから取得できている列と間違えないように)、識別のタイプ非表示に変更します。


OneDriveが返す一覧にはDOWNLOADURLという属性があります。実体のあるファイルの場合、このURLにアクセスすることでファイルをダウンロードできます。DOWNLOADURLに値がない場合にフォルダと認識して、レポートMy Folderを表示させます。

レポートMy Rootの列NAMEを選択し、列の書式HTML式として以下を記述します。



以上で、対話モード・レポートMy Rootの列NAMEをクリックすることで、それがフォルダであればMy Folderのレポートを表示し、ファイルであればダウンロードが実行されるようになりました。

同様の変更をレポートFolderに対しても実施します。

レポートFolderを選択し、ローカル後処理のSQLとして列L_FOLDER_LINKを追加します。表示する対象は自分自身なので、つねに同じページに存在します。そのためp_pageには:APP_PAGE_IDを指定しています。

,apex_page.get_url(
    p_page => :APP_PAGE_ID
    ,p_items => 'P3_ITEM_ID'
    ,p_values => ID
) L_FOLDER_LINK




L_FOLDER_LINK識別タイプ非表示に変更します。


NAME列の書式HTML式を記述します。記述する内容はレポートMy Rootの列NAMEと同一です。


以上でRESTデータ・ソースの作成と、作成したRESTデータ・ソースを使用した対話モード・レポートの作成は完了です。

次の記事では、ファイルの作成、更新(アップロード)と削除を実装します。

続く