Cmdlets/UpdateWebResource.cs

using Microsoft.Xrm.Tooling.Connector;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Management.Automation;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
 
namespace Xrm.DevOps.Tools.Cmdlets
{
    [Cmdlet(VerbsData.Update, "WebResource")]
    public class UpdateWebResource: Cmdlet
    {
        [Parameter(Mandatory = true)]
        public string ConnectionString { get; set; }
 
        [Parameter(Mandatory = true)]
        public string Folder { get; set; }
 
        [Parameter(Mandatory = false)]
        public string SearchPattern { get; set; }
 
        [Parameter(Mandatory = false)]
        public bool IncludeExtensionInSearch { get; set; } = false;
 
        [Parameter(Mandatory = false )]
        public string SolutionName { get; set; }
 
 
        CrmServiceClient _client;
 
        protected override void BeginProcessing()
        {
            _client = new CrmServiceClient(ConnectionString);
        }
 
        protected override void ProcessRecord()
        {
            //https://github.com/WaelHamze/xrm-ci-framework/blob/master/MSDYNV9/Xrm.Framework.CI/Xrm.Framework.CI.PowerShell.Cmdlets/SetXrmWebResourcesFromFolder.cs
            var resourceFiles = new HashSet<string>();
            var patterns = string.IsNullOrWhiteSpace(SearchPattern) ? new string[1] { "*" } : SearchPattern.Split(',');
 
            foreach (var pattern in patterns)
            {
                WriteVerbose($"Processing pattern {pattern}...");
 
                Directory.GetFiles(Folder, pattern.Trim(), SearchOption.AllDirectories).ToList()
                    .ForEach((item) => resourceFiles.Add(item));
            }
 
            if (resourceFiles.Count == 0)
            {
                WriteVerbose($"There are no files in folder '{Folder}' matching patterns {SearchPattern}");
                return;
            }
            else
                WriteVerbose($"Found {resourceFiles.Count} resource files.");
 
            // Buscando no Dynamics
            foreach (var resourceFile in resourceFiles)
            {
                WriteVerbose($"Processing file: {Path.GetFileName(resourceFile)}");
 
                string webResourceToSearch = string.Empty;
 
                if (IncludeExtensionInSearch)
                {
                    webResourceToSearch = Path.GetFileName(resourceFile);
                }
                else
                {
                    webResourceToSearch = Path.GetFileNameWithoutExtension(resourceFile);
                }
 
                Entity webResource = GetWebResourceByName(webResourceToSearch);
 
                if (Guid.Empty == webResource.Id)
                    continue;
 
                // update in context
                var fileContent = Convert.ToBase64String(File.ReadAllBytes(resourceFile));
                 
                if (webResource.GetAttributeValue<string>("content")?.GetHashCode() != fileContent.GetHashCode())
                {
                    webResource.Attributes["content"] = fileContent;
 
                    Microsoft.Xrm.Sdk.Messages.UpdateRequest updateRequest = new Microsoft.Xrm.Sdk.Messages.UpdateRequest
                    {
                        Target = webResource
                    };
                    if (!string.IsNullOrEmpty(SolutionName))
                    {
                        updateRequest.Parameters.Add("SolutionUniqueName", SolutionName);
                    }
 
                    var response = _client.Execute(updateRequest);
                }
 
            }
        }
 
        private Entity GetWebResourceByName(string webResourceName)
        {
            Entity resource = new Entity();
            var query = new QueryExpression
            {
                EntityName = "webresource",
                ColumnSet = new ColumnSet("name","content"),
                Criteria = new FilterExpression
                {
                    Conditions =
                    {
                        new ConditionExpression("name", ConditionOperator.Equal, webResourceName)
                    }
                }
            };
 
            var response = _client.RetrieveMultiple(query);
 
            if (response.Entities.Count > 0)
            {
                resource = response.Entities.First();
            }
            else
            {
                WriteVerbose("WebResource not found.");
            }
 
            return resource;
        }
 
 
        protected override void EndProcessing()
        {
 
        }
 
    }
}