public UpdaterServiceResponse <bool> UploadWebresource(ConnectionDetail connectionDetail, WebResource webResource)
        {
            var response = new UpdaterServiceResponse <bool>();

            try
            {
                Console.WriteLine("Requesting WR update");
                var client = connectionDetail.GetCrmServiceClient(true);
                var update = new Entity("webresource", webResource.Id.Value)
                {
                    Attributes =
                    {
                        { "content", webResource.Content }
                    }
                };
                client.Update(update);

                response.IsSuccessful = true;
                return(response);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                response.Error        = ex.ToString();
                response.IsSuccessful = false;
                return(response);
            }
        }
        public UpdaterServiceResponse <bool> IsWebResourceExists(ConnectionDetail connectionDetail, string webResourceName)
        {
            var response = new UpdaterServiceResponse <bool>();

            try
            {
                Console.WriteLine("Requesting Is WebResource Exists");
                var             client = connectionDetail.GetCrmServiceClient(true);
                QueryExpression query  = new QueryExpression
                {
                    EntityName = "webresource",
                    ColumnSet  = new ColumnSet(new string[] { "name" }),
                    Criteria   = new FilterExpression()
                };
                query.Criteria.AddCondition("name", ConditionOperator.Equal, webResourceName);
                //query.Criteria.AddCondition("solutionid", ConditionOperator.Equal, _connectionDetail.SolutionId);

                var isWebResourceExistsResponse = client.RetrieveMultiple(query);
                var entity = isWebResourceExistsResponse.Entities.FirstOrDefault();

                response.Payload      = entity == null ? false : true;
                response.IsSuccessful = true;
                return(response);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                response.Error        = ex.ToString();
                response.IsSuccessful = false;
                return(response);
            }
        }
        public UpdaterServiceResponse <bool> CreateWebresource(ConnectionDetail connectionDetail, WebResource webResource, string solution)
        {
            var response = new UpdaterServiceResponse <bool>();

            try
            {
                Console.WriteLine("Requesting WR create");
                var client            = connectionDetail.GetCrmServiceClient(true);
                var webResourceEntity = new Entity("webresource");
                webResourceEntity["name"]            = webResource.Name;
                webResourceEntity["displayname"]     = webResource.DisplayName;
                webResourceEntity["description"]     = webResource.Description;
                webResourceEntity["content"]         = webResource.Content;
                webResourceEntity["webresourcetype"] = new OptionSetValue(webResource.Type);

                CreateRequest createRequest = new CreateRequest
                {
                    Target = webResourceEntity
                };
                createRequest.Parameters.Add("SolutionUniqueName", solution);
                client.Execute(createRequest);

                response.IsSuccessful = true;
                return(response);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                response.Error        = ex.ToString();
                response.IsSuccessful = false;
                return(response);
            }
        }
        public UpdaterServiceResponse <ConnectionResult> ValidateConnection(ConnectionDetail connectionDetail)
        {
            Console.WriteLine("Connection validation requested");
            var response = new UpdaterServiceResponse <ConnectionResult>();

            try
            {
                var client = connectionDetail.GetCrmServiceClient(true);

                var webApplicationUrl = client.ConnectedOrgPublishedEndpoints[EndpointType.WebApplication];
                var webAppURi         = new Uri(webApplicationUrl);

                response.IsSuccessful = true;
                response.Payload      = new ConnectionResult()
                {
                    IsReady                    = client.IsReady,
                    LastCrmError               = client.LastCrmError,
                    Organization               = client.ConnectedOrgUniqueName,
                    OrganizationFriendlyName   = client.ConnectedOrgFriendlyName,
                    OrganizationVersion        = client.ConnectedOrgVersion.ToString(),
                    OrganizationDataServiceUrl = client.ConnectedOrgPublishedEndpoints[EndpointType.OrganizationDataService],
                    OrganizationServiceUrl     = client.ConnectedOrgPublishedEndpoints[EndpointType.OrganizationService],
                    WebApplicationUrl          = webApplicationUrl,
                    TenantId                   = client.TenantId,
                    EnvironmentId              = client.EnvironmentId,
                    ServerName                 = webAppURi.Host,
                    ServerPort                 = webAppURi.Port,
                    UserName                   = connectionDetail.UserName?.Length > 0
                                ? connectionDetail.UserName
                                : client.OAuthUserId?.Length > 0
                                    ? client.OAuthUserId
                                    : connectionDetail.AzureAdAppId != Guid.Empty
                                        ? connectionDetail.AzureAdAppId.ToString("B")
                                        : null
                };

                return(response);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                response.Payload = new ConnectionResult()
                {
                    IsReady      = false,
                    LastCrmError = ex.Message
                };
                response.IsSuccessful = false;
                response.Error        = ex.ToString();

                return(response);
            }
        }
        public UpdaterServiceResponse <IEnumerable <WebResource> > RetrieveWebResources(ConnectionDetail connectionDetail, List <string> webResourceNames)
        {
            var response = new UpdaterServiceResponse <IEnumerable <WebResource> >();

            try
            {
                Console.WriteLine("Requesting WR retrieve");
                var client = connectionDetail.GetCrmServiceClient(true);
                var query  = new QueryExpression("webresource")
                {
                    ColumnSet    = new ColumnSet("name", "content"),
                    LinkEntities =
                    {
                        new LinkEntity("webresource",                     "solutioncomponent",     "webresourceid", "objectid", JoinOperator.Inner)
                        {
                            LinkCriteria =
                            {
                                Conditions =
                                {
                                    new ConditionExpression("solutionid", ConditionOperator.Equal, connectionDetail.SelectedSolution.SolutionId)
                                }
                            }
                        }
                    }
                };

                if (webResourceNames != null && webResourceNames.Count > 0)
                {
                    query.Criteria = new FilterExpression(LogicalOperator.Or);
                    query.Criteria.Conditions.AddRange(webResourceNames.Select(x => new ConditionExpression("name", ConditionOperator.Equal, x)));
                }
                var retrieveWebresourcesResponse = client.RetrieveMultiple(query);
                var webResources = retrieveWebresourcesResponse.Entities.ToList();

                response.Payload = webResources.Select(x => new WebResource()
                {
                    Id      = x.Id,
                    Name    = x.GetAttributeValue <string>("name"),
                    Content = x.GetAttributeValue <string>("content")
                });
                response.IsSuccessful = true;
                return(response);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                response.Error        = ex.ToString();
                response.IsSuccessful = false;
                return(response);
            }
        }
        public UpdaterServiceResponse <SolutionDetail> RetrieveSolution(ConnectionDetail connectionDetail, Guid solutionId)
        {
            var response = new UpdaterServiceResponse <SolutionDetail>();

            try
            {
                Console.WriteLine("Requesting Solution retrieve");
                var             client = connectionDetail.GetCrmServiceClient(true);
                QueryExpression query  = new QueryExpression
                {
                    EntityName = "solution",
                    ColumnSet  = new ColumnSet(new string[] { "friendlyname", "uniquename", "publisherid" }),
                    Criteria   = new FilterExpression()
                };
                query.Criteria.AddCondition("isvisible", ConditionOperator.Equal, true);
                query.Criteria.AddCondition("solutionid", ConditionOperator.Equal, solutionId);

                query.LinkEntities.Add(new LinkEntity("solution", "publisher", "publisherid", "publisherid", JoinOperator.Inner));
                query.LinkEntities[0].Columns.AddColumns("customizationprefix");
                query.LinkEntities[0].EntityAlias = "publisher";

                var retrieveSolutionResponse = client.RetrieveMultiple(query);
                var entity = retrieveSolutionResponse.Entities.FirstOrDefault();
                if (entity == null)
                {
                    return(null);
                }
                var solution = new SolutionDetail()
                {
                    SolutionId      = entity.Id,
                    PublisherPrefix = entity.GetAttributeValue <AliasedValue>("publisher.customizationprefix") == null ? null : entity.GetAttributeValue <AliasedValue>("publisher.customizationprefix").Value.ToString()
                };

                response.Payload      = solution;
                response.IsSuccessful = true;
                return(response);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                response.Error        = ex.ToString();
                response.IsSuccessful = false;
                return(response);
            }
        }
        public UpdaterServiceResponse <List <SolutionDetail> > GetSolutionsList(ConnectionDetail connectionDetail)
        {
            Console.WriteLine("Solution list requested");
            var response = new UpdaterServiceResponse <List <SolutionDetail> >();

            try
            {
                var client = connectionDetail.GetCrmServiceClient(true);

                QueryExpression query = new QueryExpression
                {
                    EntityName = "solution",
                    ColumnSet  = new ColumnSet(new string[] { "friendlyname", "uniquename", "publisherid" }),
                    Criteria   = new FilterExpression()
                };
                query.Criteria.AddCondition("isvisible", ConditionOperator.Equal, true);
                query.AddOrder("friendlyname", OrderType.Ascending);

                query.LinkEntities.Add(new LinkEntity("solution", "publisher", "publisherid", "publisherid", JoinOperator.Inner));
                query.LinkEntities[0].Columns.AddColumns("customizationprefix");
                query.LinkEntities[0].EntityAlias = "publisher";

                var solutionEntities = client.RetrieveMultiple(query).Entities;
                var solutions        = solutionEntities.Select(x => new SolutionDetail()
                {
                    UniqueName      = x.GetAttributeValue <string>("uniquename"),
                    FriendlyName    = x.GetAttributeValue <string>("friendlyname"),
                    PublisherPrefix = x.GetAttributeValue <Microsoft.Xrm.Sdk.AliasedValue>("publisher.customizationprefix") == null ? null : x.GetAttributeValue <Microsoft.Xrm.Sdk.AliasedValue>("publisher.customizationprefix").Value.ToString(),
                    SolutionId      = x.Id
                }).ToList();
                response.Payload      = solutions;
                response.IsSuccessful = true;
                return(response);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                response.IsSuccessful = false;
                response.Error        = ex.ToString();
                return(response);
            }
        }
        public UpdaterServiceResponse <bool> PublishWebResources(ConnectionDetail connectionDetail, IEnumerable <Guid> webResourcesIds)
        {
            var response = new UpdaterServiceResponse <bool>();

            try
            {
                Console.WriteLine("Requesting WR publish");
                var client     = connectionDetail.GetCrmServiceClient(true);
                var orgContext = new OrganizationServiceContext(client);

                if (webResourcesIds == null || !webResourcesIds.Any())
                {
                    throw new ArgumentNullException("webresourcesId");
                }

                var request = new OrganizationRequest {
                    RequestName = "PublishXml"
                };
                request.Parameters = new ParameterCollection();
                request.Parameters.Add(new KeyValuePair <string, object>("ParameterXml",
                                                                         string.Format("<importexportxml><webresources>{0}</webresources></importexportxml>",
                                                                                       string.Join("", webResourcesIds.Select(a => string.Format("<webresource>{0}</webresource>", a)))
                                                                                       )));

                orgContext.Execute(request);

                response.IsSuccessful = true;
                return(response);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                response.Error        = ex.ToString();
                response.IsSuccessful = false;
                return(response);
            }
        }