M.PCMです。製品 - 製品ギャラリー - 追加されたアセットの公開リンクを作成し、アセットの並べ替え順序を保存します

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

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

次のコードを使用して、追加されたアセットの公開リンクを作成し、アセットのソート順を保存するアクションを作成します。

using System;
using System.Linq;
using System.Threading.Tasks;
using Stylelabs.M.Sdk;
using System.Globalization;
using System.Text;
using System.Collections.Generic;

LogScriptCalled(Context, MClient);

//Get the Product ID
var productId = Context.TargetId.Value;

string changedAssetIds, strExecutionId;

//Get the newly added assets from the Property Bag
Context.PropertyBag.TryGetValue($"{productId}-executionId", out strExecutionId);
Context.PropertyBag.TryGetValue($"{productId}-{strExecutionId}", out changedAssetIds);

LogInfo(Context, MClient, $"Changed Asset Ids are { changedAssetIds }");

var productLoadConfiguration = new EntityLoadConfiguration(CultureLoadOption.Default,
    new PropertyLoadOption("ProductGalleryAssetsInSortedOrder"),
    new RelationLoadOption("ProductToGalleryAsset"));

var productEntity =
    await MClient.Entities.GetAsync(productId, productLoadConfiguration).ConfigureAwait(false);

if (productEntity == null)
{
    LogInfo(Context, MClient, "Product entity is null");
    return;
}

var productGalleryAssetsInSortedOrderProp = productEntity.GetProperty<ICultureInsensitiveProperty>("ProductGalleryAssetsInSortedOrder");

if (productGalleryAssetsInSortedOrderProp ==  null)
{
    LogInfo(Context, MClient, "ProductGalleryAssetsInSortedOrder property does not exist");
    return;
}

var changedAssetIdsList = changedAssetIds.Split(',').Select(c => long.Parse(c));

var assetLoadConfig = new EntityLoadConfiguration(
    CultureLoadOption.Default,
    PropertyLoadOption.None,
    RelationLoadOption.None
);

var changedAssetEntities = await MClient.Entities.GetManyAsync(changedAssetIdsList, assetLoadConfig);

if (changedAssetEntities.Count <= 0)
{
    LogInfo(Context, MClient, "Changed Asset entities for this product does not exist");
    return;
}

var changedAssetEntityIdentifiersString = string.Join(",",changedAssetEntities.Select(c => c.Identifier).ToArray());
LogInfo(Context, MClient, $"Changed Asset entities identifiers {changedAssetEntityIdentifiersString}");

var productGalleryAssetsInSortedOrderVal = productGalleryAssetsInSortedOrderProp.GetValue<string>();
LogInfo(Context, MClient, $"ProductGalleryAssetsInSortedOrder property value {productGalleryAssetsInSortedOrderVal}");

if (!string.IsNullOrWhiteSpace(productGalleryAssetsInSortedOrderVal))
{
    //var productGalleryStoredSortOrderIds = new HashSet<string>(productGalleryAssetsInSortedOrderVal.Split(','));

    //changedAssetEntityIdentifiersList.RemoveAll(a =>
    //                productGalleryStoredSortOrderIds.Any(
    //                    a2 => a2.Equals(a, StringComparison.CurrentCultureIgnoreCase)));

    var changedAssetEntityIdentifiersArray = changedAssetEntityIdentifiersString.Split(',');

    foreach (var changedAssetEntityIdentifier in changedAssetEntityIdentifiersArray)
    {
        if (productGalleryAssetsInSortedOrderVal.Trim().Contains(changedAssetEntityIdentifier, StringComparison.CurrentCultureIgnoreCase))
        {
            LogInfo(Context, MClient, $"ProductGalleryAssetsInSortedOrder property contains asset identifier {changedAssetEntityIdentifier}");
            changedAssetEntityIdentifiersString = changedAssetEntityIdentifiersString.Replace(changedAssetEntityIdentifier, "");
        }
        else
        {
            LogInfo(Context, MClient, $"ProductGalleryAssetsInSortedOrder property does not contain asset identifier {changedAssetEntityIdentifier}");
        }
    }

    if (!string.IsNullOrWhiteSpace(changedAssetEntityIdentifiersString))
    {
        changedAssetEntityIdentifiersString = changedAssetEntityIdentifiersString.Replace(",,", ",");

        if (changedAssetEntityIdentifiersString.StartsWith(","))
            changedAssetEntityIdentifiersString = changedAssetEntityIdentifiersString.Substring(1);

        if (changedAssetEntityIdentifiersString.EndsWith(","))
            changedAssetEntityIdentifiersString = changedAssetEntityIdentifiersString.Substring(0, changedAssetEntityIdentifiersString.Length - 1);
    }

    LogInfo(Context, MClient, $"Changed Asset entities identifiers after match {changedAssetEntityIdentifiersString}");
}

//Check and create public links if new assets are added to Product Gallery
if (!string.IsNullOrWhiteSpace(changedAssetEntityIdentifiersString))
{
    //Loop though the assets
    foreach (var changedAssetIdentifier in changedAssetEntityIdentifiersString.Split(','))
    {
        var changedAssetEntity = changedAssetEntities.FirstOrDefault(a => a.Identifier == changedAssetIdentifier);

        if (changedAssetEntity == null)
        {
            LogInfo(Context, MClient, $"Asset with identifier '{changedAssetIdentifier}' does not exist");
            continue;
        }

        var assetId = changedAssetEntity.Id.Value;

        // Check if public links don't exist yet
        var query = Query.CreateQuery(entities => from e in entities
            where e.DefinitionName == "M.PublicLink"
                    && e.Parent("AssetToPublicLink") == assetId
                    && (e.Property("Resource") == "productgallery")
                    && e.Property("IsDisabled") == false
            select e);
        query.Take = 1;

        var result = await MClient.Querying.QueryIdsAsync(query);
        if (result.TotalNumberOfResults > 0)
        {
            LogInfo(Context, MClient, $"Public links already exist for asset with id '{assetId}'");
            continue;
        }

        // Create public links
        await CreateForRendition("productgallery", assetId);
        LogInfo(Context, MClient, $"Created public link 'productgallery' for asset with id '{assetId}'");
    }
}

//Update the Product property with assets identified in sorted order
await UpdateProduct(productEntity, productGalleryAssetsInSortedOrderProp).ConfigureAwait(false);

private async Task UpdateProduct(IEntity productEntity, ICultureInsensitiveProperty productGalleryAssetsInSortedOrderProp)
{
    var productToGalleryAssetRelation =
        productEntity.GetRelation<IParentToManyChildrenRelation>("ProductToGalleryAsset");

    var entityLoadConfiguration = new EntityLoadConfiguration(CultureLoadOption.Default,
        PropertyLoadOption.None, RelationLoadOption.None);

    var productGalleryAssetEntities =
        await MClient.Entities.GetManyAsync(productToGalleryAssetRelation.GetIds(), entityLoadConfiguration).ConfigureAwait(false);

    var sbProductGalleryAssetEntityIdentifiers = new StringBuilder();
    foreach (var assetId in productToGalleryAssetRelation.GetIds())
    {
        var productGalleryAssetEntity =
            productGalleryAssetEntities.FirstOrDefault(asset => asset.Id == assetId);

        if (productGalleryAssetEntity != null)
            sbProductGalleryAssetEntityIdentifiers.Append($"{productGalleryAssetEntity.Identifier},");
    }

    var productGalleryAssetEntityIdentifiers = string.Empty;

    if (sbProductGalleryAssetEntityIdentifiers.Length > 0 && sbProductGalleryAssetEntityIdentifiers.ToString().EndsWith(","))
        productGalleryAssetEntityIdentifiers = sbProductGalleryAssetEntityIdentifiers.ToString()
            .Substring(0, sbProductGalleryAssetEntityIdentifiers.Length - 1);

    LogInfo(Context, MClient, $"Product Gallery Assets Identifiers in sorted order {productGalleryAssetEntityIdentifiers}");
    productGalleryAssetsInSortedOrderProp.SetValue(productGalleryAssetEntityIdentifiers);

    await MClient.Entities.SaveAsync(productEntity).ConfigureAwait(false);
}

private async Task CreateForRendition(string rendition, long assetId)
{
    var publicLink = await MClient.EntityFactory.CreateAsync("M.PublicLink");

    if (publicLink.CanDoLazyLoading())
    {
        await publicLink.LoadMembersAsync(new PropertyLoadOption("Resource"), new RelationLoadOption("AssetToPublicLink")).ConfigureAwait(false);
    }

    publicLink.SetPropertyValue("Resource", rendition);

    var relation = publicLink.GetRelation<IChildToManyParentsRelation>("AssetToPublicLink");
    if (relation == null)
    {
        LogError(Context, MClient, "Unable to create public link: no AssetToPublicLink relation found.");
        return;
    }

    relation.Parents.Add(assetId);

    await MClient.Entities.SaveAsync(publicLink).ConfigureAwait(false);
    return;
}

#region Helpers

void LogScriptCalled(IActionScriptContext context, IMClient client)
{
    var executionId = Guid.NewGuid().ToString("N").Substring(0, 6);
    LogInfo(context, client, $"{executionId}: Execution started. Context: {context}");
}

void LogDebug(IActionScriptContext context, IMClient client, string message)
{
    client.Logger.Debug(LogPrefix(context) + message);
}

void LogInfo(IActionScriptContext context, IMClient client, string message)
{
    client.Logger.Info(LogPrefix(context) + message);
}

void LogError(IActionScriptContext context, IMClient client, string message)
{
    client.Logger.Error(LogPrefix(context) + message);
}

string LogPrefix(IActionScriptContext context)
{
    return $"{ (context?.TargetId != null ? context.TargetId.Value.ToString() : string.Empty)} | ";
}

#endregion
この記事を改善するための提案がある場合は、 お知らせください!