Commonly Used Sitecore Commerce Pipelines

VP, Sitecore Practice
  • Twitter
  • LinkedIn

Commonly Used Sitecore Commerce Pipelines

**While writing new Sitecore Commerce plugins, I noticed that there a few pipelines that were required in almost all blocks. So i thought of putting together a list of pipelines so that it can be useful for someone who is new to Sitecore Commerce Plugins.

IDoesEntityExistPipeline** - Useful in checking if an entity of a type and an identifier exists in database or not. It can also create one if you set the parameter to shouldCreate=true

Input - FindEntityTypeArgument - type of entity, identifier and shouldCreate (true/false)

Returns - Bool

For example: To find if a particular inventory set exists or not :

// arg.Name = habitat_inventory or name of your inventory set.
string id = CommerceEntity.IdPrefix() + arg.Name;
var doesExist = await currentBlock._doesEntityExistPipeline.Run(new FindEntityArgument(typeof(InventorySet), id, false), context);

IPersistEntityPipeline - If you are creating an entity, then to persist it to database, you will need to use this pipeline.

Input - PersistEntityArgument - The entity to be persisted and the context.

Returns - PersistEntityArgument

InventorySet inventorySet = new InventorySet();
//set values for inventorySet 
PersistEntityArgument persistEntityArgument = await currentBlock._persistEntityPipeline.Run(new PersistEntityArgument(inventorySet), context);

IAddListEntitiesPipeline - Creates an entry in the table [SitecoreCommerce9_SharedEnvironments].[dbo].[CommerceLists] with the given CommerceEntityId . Maintains relationship with the commerce entity and lists

For example, the following command, creates an entry in the table CommerceLists that looks like this

ListEntitiesArgument entitiesArgument1 = new ListEntitiesArgument((IEnumerable<string>)new string[1] ?{   inventorySet.Id   }, CommerceEntity.ListName());
ListEntitiesArgument entitiesArgument2 = await inventorySetBlock._addListEntitiesPipeline.Run(entitiesArgument1, context);

We can then use the FindEntityInList pipeline to retrieve this entry.

IFindEntitiesInListPipeline - Returns a list of Commerce Entity matching the conditions in argument.

Input - FindEntitiesInListArgument - type of entity to look for, listname, skip count and take count

Output - FindEntitiesInListArgument - List of Commerce Entities if found matching the criteria in input.

Example:

FindEntitiesInListArgument result= await currentBlock._findEntitiesInListPipeline.Run(new FindEntitiesInListArgument(typeof(InventorySet), string.Format("{0}", (object)CommerceEntity.ListName()), 0, int.MaxValue), context);

The above statement will return a list of all Inventory sets from the table [SitecoreCommerce9_SharedEnvironments].[dbo].[CommerceLists]. You can then iterate and cast the item you want to InventorySet and get data.

if (result!= null)
       ? {

           CommerceList list = result.List;

           if (list != null)

              list.Items.ForEach((Action)(item =>

              {

               ? InventorySet inventorySet = (InventorySet)item;

               ? //just an example but you can add any custom logic.

  inventorySets.Add(inventorySet);

              }));

       ? }

IGetEnvironmentCachePipeline - Get an item that is in the cache.

Input - EnvironmentCacheArgument - Cache Name

Output : Cache

string cacheKey = string.Format("{0}|{1}|{2}", (object)context.CommerceContext.Environment.Name, (object)context.CommerceContext.CurrentLanguage(), (object)(context.CommerceContext.CurrentShopName()   ""));
ProductCachePolicy cachePolicy = context.GetPolicy();
ICache cache = (ICache)null;
List sellableItems = (List)null;
if (cachePolicy.AllowCaching)
 {
  IGetEnvironmentCachePipeline cachePipeline = currentBlock._cachePipeline;
  EnvironmentCacheArgument environmentCacheArgument = new EnvironmentCacheArgument();
  environmentCacheArgument.CacheName = cachePolicy.CatalogsCacheName
  cache = await cachePipeline.Run(environmentCacheArgument, context);
  sellableItems = await cache.Get(cacheKey) as List;
  if (sellableItems != null)
 ? {
    //custom code to iterate over sellable items
 ? }              
 }
 else
 {
  sellableItems = new List();
  FindEntitiesInListArgument entitiesInListArgument = 
   ?foreach (CommerceEntity commerceEntity in 
	(await currentBlock._findEntitiesInListPipeline.Run(entitiesInListArgument,
	 (IPipelineExecutionContextOptions)context.ContextOptions)).List.Items)
   ?{
     //custom code to iterate over sellable items
   ?}
   ?if (cachePolicy.AllowCaching)
   ?{
     if (cache != null)
       await cache.Set(cacheKey,
	 (ICachable)new Cachable>(sellableItems, 1L), 
	cachePolicy.GetCacheEntryOptions());
   ?}
 

Last but not the least, IFindEntityPipeline - Finds an entity of a given type and id. If not found, it can also create an entity without persisting it to the database.

Input - FindEntityArgument - type of entity to find, identifier and shouldCreate if not found

Output - CommerceEntity

CommerceEntity.IdPrefix

Example

To find a sellable item with and Id = 6003213

	(new FindEntityArgument(typeof(SellableItem),
 $"{CommerceEntity.IdPrefix()}6003213", false), context);
             var sellableItem = entity as SellableItem
               if (sellableItem == null)
                {
                    await commerceContext.AddMessage(
                        commerceContext.GetPolicy().Error,
                        "EntityNotFound",
                        new object[] { "6002321" },
                        $"Entity  was not found.");
                    return false;
                }
               //if sellableItem not null then do;
               if ((entity is SellableItem))
                {
                    SellableItem sellableItem = entity as SellableItem;
                    var variants = sellableItem.GetComponent();

                    if (variants != null && variants.ChildComponents.Count > 0)
                    {
                        foreach (ItemVariationComponent variant in 
					variants.ChildComponents)
                        {
                            var variantData = (ItemVariationComponent)variant;

                        }                       ?
                    }                   
                }

Related Blogs

Latest Blogs