1. Web のスクリプト

Web スクリプトの例

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

これは、アセットの集約データ、関連するアセット タイプ、および関連するタグを読み取る Action スクリプトの例です。このスクリプトは、Web API を使用して実行されるように設計されています。

ユース ケース

アセット メタデータは、プロパティとリレーションの両方に保存できます。リレーションは、関連付けられたタグとアセット タイプをアセットにリンクします。これらの関連エンティティには、独自のメタデータもあります。このスクリプトを使用すると、ユーザーは 1 回の Web API 呼び出しで、このすべてのデータを取得できるため、Web サーバーに対して複数のラウンド トリップを行う必要がありません。

スクリプト

using System.Linq;
using System.Net;
using Newtonsoft.Json.Linq;
using System.Globalization;

var enUsCulture = CultureInfo.GetCultureInfo("en-US");

var data = Context.Data as JObject;
var assetId = data?["assetId"]?.Value<long>();

if (assetId == null) 
{
SetError(HttpStatusCode.BadRequest, "No asset-id has been specified."); // Bad request 
return;  
}

var loadConfig = new EntityLoadConfiguration(
CultureLoadOption.Default, 
new PropertyLoadOption("Title", "FileName"), 
new RelationLoadOption("TagToAsset", "AssetTypeToAsset"));

var asset = await MClient.Entities.GetAsync(assetId.Value, loadConfig);

if (asset == null)
{
SetError(HttpStatusCode.NotFound, "Asset not found.");
return;
}

var result = new JObject(
new JProperty("title", asset.GetPropertyValue<string>("Title")),
new JProperty("filename", asset.GetPropertyValue<string>("FileName"))
);

var tagIds = asset.GetRelation<IChildToManyParentsRelation>("TagToAsset").Parents;

if (tagIds.Any()) 
{
var tags = await MClient.Entities.GetManyAsync(tagIds);
var tagNames = tags.Select(t => t.GetPropertyValue<string>("TagName"));

if (tagNames.Any())
{
result["tags"] = new JArray(tagNames);
}
}

var typeId = asset.GetRelation<IChildToOneParentRelation>("AssetTypeToAsset").Parent;

if (typeId.HasValue) 
{
var type = await MClient.Entities.GetAsync(typeId.Value);

if (type != null) 
{
result["type"] = type.GetPropertyValue<string>("Label", enUsCulture);
}
}

Context.Result = result;

void SetError(HttpStatusCode statusCode, string message)
{
Context.StatusCode = statusCode;
Context.Result = new JObject(new JProperty("error", message));
}

スクリプトの説明

  1. スクリプトで使用するライブラリをインクルードします。

    using System.Linq;
    using System.Net;
    using Newtonsoft.Json.Linq;
    using System.Globalization;
  2. いくつかのプロパティは多言語です。そのため、言語ごとに異なる値を保持できます。この例では、en-US の値のみが読み込まれます。

    var enUsCulture = CultureInfo.GetCultureInfo("en-US");
  3. 要求からのデータは、Context.Data に指定されています。この場合は JToken です。このスクリプトでは、それが assetId プロパティを含む JObject であると想定しています。このプロパティには、データを取得するアセットの ID が含まれています。アセット ID をデータから抽出できなかった場合は、http ステータス コード 400 (Bad Request) と、わかりやすいエラー メッセージを返します。

    var data = Context.Data as JObject;
    var assetId = data?["assetId"]?.Value<long>();
    
    if (assetId == null) 
    {
    SetError(HttpStatusCode.BadRequest, "No asset-id has been specified."); // Bad request 
    return;  
    }
  4. 指定された ID を持つアセットを読み込みます。[Title] プロパティ、** FileName** プロパティ、[TagToAsset] リレーション、および [AssetTypeToAsset] リレーションのみが対象です。アセットが見つからなかった場合は、http ステータス コード 404 (Not Found) と、わかりやすいエラー メッセージを返します。

    var loadConfig = new EntityLoadConfiguration(
    CultureLoadOption.Default, 
    new PropertyLoadOption("Title", "FileName"), 
    new RelationLoadOption("TagToAsset", "AssetTypeToAsset"));
    
    var asset = await MClient.Entities.GetAsync(assetId.Value, loadConfig);
    
    if (asset == null)
    {
    SetError(HttpStatusCode.NotFound, "Asset not found.");
    return;
    }
  5. 新しい JObject を作成し、これが最終的にスクリプトの結果として返されます。すぐに Title プロパティと FileName プロパティの値を追加します。

    var result = new JObject(
    new JProperty("title", asset.GetPropertyValue<string>("Title")),
    new JProperty("filename", asset.GetPropertyValue<string>("FileName"))
    );
  6. アセットに関連付けられているタグを読み込みます。すぐにタグから TagName プロパティを取得し、それらを JArray に入れると、これが結果に追加されます。

    var tagIds = asset.GetRelation<IChildToManyParentsRelation>("TagToAsset").Parents;
    
    if (tagIds.Any()) 
    {
    var tags = await MClient.Entities.GetManyAsync(tagIds);
    var tagNames = tags.Select(t => t.GetPropertyValue<string>("TagName"));
    
    if (tagNames.Any())
    {
    result["tags"] = new JArray(tagNames);
    }
    }
  7. アセットに関連付けられているアセット タイプを読み込みます。すぐにアセット タイプから [Label] プロパティを抽出して、その値を結果に入れます。

    注意

    [Label] は多言語プロパティです。そのため、英語での値を取得するには、en-US カルチャを指定します。

    var typeId = asset.GetRelation<IChildToOneParentRelation>("AssetTypeToAsset").Parent;
    
    if (typeId.HasValue) 
    {
    var type = await MClient.Entities.GetAsync(typeId.Value);
    
    if (type != null) 
    {
    result["type"] = type.GetPropertyValue<string>("Label", enUsCulture);
    }
    }
  8. 結果オブジェクトをコンテキストに保存します。これは、それをユーザーに返すようにスクリプトに指示します。

    Context.Result = result;
  9. SetError は、スクリプトからエラーを返すために使用されるヘルパー関数です。指定された http ステータス コードとエラー メッセージをコンテキストに保存します。これは、それをユーザーに返すようにスクリプトに指示します。

    void SetError(HttpStatusCode statusCode, string message)
    {
    Context.StatusCode = statusCode;
    Context.Result = new JObject(new JProperty("error", message));
    }

設定

  1. アクション スクリプトを作成し、パブリッシュして有効にします。

  2. 次のエンドポイントに対して HTTP POST 呼び出しを実行します (https://my-url/api/scripts/my-script-identifier/execute)。my-urlmy-script-identifier を必ず正しい値で置き換えてください。

    Content-Type ヘッダーが application/json に設定されていることを確認してください。

    スクリプトの本文として次のテンプレートを使用します。

    {
    "assetId": my-asset-id
    }
この記事を改善するための提案がある場合は、 お知らせください!