Exemplo n.º 1
0
        public override async Task <CrawlJobData> GetCrawlJobData(
            ProviderUpdateContext context,
            IDictionary <string, object> configuration,
            Guid organizationId,
            Guid userId,
            Guid providerDefinitionId)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            var dynamics365CrawlJobData = new Dynamics365CrawlJobData();

            if (configuration.ContainsKey(Dynamics365Constants.KeyName.Url))
            {
                dynamics365CrawlJobData.Url = configuration[Dynamics365Constants.KeyName.Url].ToString();
            }
            if (configuration.ContainsKey(Dynamics365Constants.KeyName.DeltaCrawlEnabled))
            {
                dynamics365CrawlJobData.DeltaCrawlEnabled = bool.Parse(configuration[Dynamics365Constants.KeyName.DeltaCrawlEnabled].ToString());
            }
            if (configuration.ContainsKey(Dynamics365Constants.KeyName.UserName))
            {
                dynamics365CrawlJobData.UserName = configuration[Dynamics365Constants.KeyName.UserName].ToString();
            }
            if (configuration.ContainsKey(Dynamics365Constants.KeyName.Password))
            {
                dynamics365CrawlJobData.Password = configuration[Dynamics365Constants.KeyName.Password].ToString();
            }
            dynamics365CrawlJobData.ClientId     = ConfigurationManager.AppSettings.GetValue <string>("Providers.Dynamics365ClientId", null);
            dynamics365CrawlJobData.ClientSecret = ConfigurationManager.AppSettings.GetValue <string>("Providers.Dynamics365ClientSecret", null);

            string apiVersion = "9.1";
            string webApiUrl  = $"{dynamics365CrawlJobData.Url}/api/data/v{apiVersion}/";

            if (dynamics365CrawlJobData.UserName != null && dynamics365CrawlJobData.Password != null)
            {
                Crawling.Dynamics365.Infrastructure.Dynamics365Client.RefreshToken(dynamics365CrawlJobData);
            }
            else
            {
                var clientCredential = new ClientCredential(dynamics365CrawlJobData.ClientId, dynamics365CrawlJobData.ClientSecret);
                var authParameters   = await AuthenticationParameters.CreateFromResourceUrlAsync(new Uri(webApiUrl));

                var authContext = new AuthenticationContext(authParameters.Authority);
                var authResult  = authContext.AcquireTokenAsync(authParameters.Resource, clientCredential).Result;
                dynamics365CrawlJobData.TargetApiKey = authResult.AccessToken;
            }

            return(await Task.FromResult(dynamics365CrawlJobData));
        }
Exemplo n.º 2
0
        public static void RefreshToken(Dynamics365CrawlJobData dynamics365CrawlJobData)
        {
            string apiVersion = "9.1";
            string webApiUrl  = $"{dynamics365CrawlJobData.Url}/api/data/v{apiVersion}/";

            var userCredential = new UserCredential(dynamics365CrawlJobData.UserName, dynamics365CrawlJobData.Password);
            var authParameters = AuthenticationParameters.CreateFromResourceUrlAsync(new Uri(webApiUrl)).Result;
            var authContext    = new AuthenticationContext(authParameters.Authority, false);
            var authResult     = authContext.AcquireTokenAsync(authParameters.Resource, dynamics365CrawlJobData.ClientId, userCredential).Result;
            var refreshToken   = authContext.AcquireTokenByRefreshTokenAsync(authResult.RefreshToken, dynamics365CrawlJobData.ClientId).Result;

            dynamics365CrawlJobData.ApiKey = refreshToken.AccessToken;
        }
Exemplo n.º 3
0
        public Dynamics365Client(ILogger log, Dynamics365CrawlJobData dynamics365CrawlJobData, IRestClient client) // TODO: pass on any extra dependencies
        {
            if (dynamics365CrawlJobData == null)
            {
                throw new ArgumentNullException(nameof(dynamics365CrawlJobData));
            }

            if (client == null)
            {
                throw new ArgumentNullException(nameof(client));
            }

            this.log    = log ?? throw new ArgumentNullException(nameof(log));
            this.client = client ?? throw new ArgumentNullException(nameof(client));
            _dynamics365CrawlJobData = dynamics365CrawlJobData ?? throw new ArgumentNullException(nameof(dynamics365CrawlJobData));


            // TODO use info from dynamics365CrawlJobData to instantiate the connection
            client.BaseUrl = new Uri(BaseUri);
            client.AddDefaultParameter("api_key", dynamics365CrawlJobData.Url, ParameterType.QueryString);
        }
Exemplo n.º 4
0
        public IEnumerable <T> Get <T>(string value, Dynamics365CrawlJobData dynamics365CrawlJobData)
        {
            DateTimeOffset lastCrawlFinishTime;

            if (_dynamics365CrawlJobData.LastCrawlFinishTime == DateTimeOffset.Parse("1/1/0001 12:00:00 AM +00:00"))
            {
                lastCrawlFinishTime = DateTimeOffset.Parse("01/01/1753 00:00:00");
            }
            else
            {
                lastCrawlFinishTime = _dynamics365CrawlJobData.LastCrawlFinishTime;
            }

            var filter = $"(createdon ge {lastCrawlFinishTime:yyyy-MM-ddThh:mm:ssZ} or modifiedon ge {lastCrawlFinishTime:yyyy-MM-ddThh:mm:ssZ})";

            var url = _dynamics365CrawlJobData.Url;

            if (_dynamics365CrawlJobData.DeltaCrawlEnabled)
            {
                url = _dynamics365CrawlJobData.Url + string.Format("/api/data/v9.1/{0}?$filter={1}", value, filter);
            }

            ResultList <T> resultList = null;

            while (true)
            {
                using (HttpClient httpClient = new HttpClient())
                {
                    try
                    {
                        httpClient.Timeout = new TimeSpan(0, 2, 0);
                        httpClient.DefaultRequestHeaders.Add("Prefer", "odata.maxpagesize=100");
                        httpClient.DefaultRequestHeaders.Add("OData-MaxVersion", "4.0");
                        httpClient.DefaultRequestHeaders.Add("OData-Version", "4.0");
                        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
                        httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", dynamics365CrawlJobData.ApiKey);
                        HttpResponseMessage responseMessage = httpClient.GetAsync(url).Result;
                        var content = responseMessage.Content.ReadAsStringAsync().Result;
                        if (responseMessage.StatusCode == HttpStatusCode.Unauthorized)
                        {
                            RefreshToken(dynamics365CrawlJobData);
                            continue;
                        }
                        else if (responseMessage.StatusCode != HttpStatusCode.OK)
                        {
                            log.Error(() => "Connection failed " + responseMessage.StatusCode);
                        }
                        resultList = JsonConvert.DeserializeObject <ResultList <T> >(content, new JsonSerializerSettings()
                        {
                            NullValueHandling = NullValueHandling.Ignore
                        });
                    }
                    catch (Exception e)
                    {
                        log.Error(() => e.Message);
                    }


                    if (resultList?.Value != null)
                    {
                        foreach (var item in resultList.Value)
                        {
                            yield return(item);
                        }
                    }
                    else
                    {
                        break;
                    }
                    if (resultList.NextLink == null)
                    {
                        break;
                    }
                }
            }
        }