Example #1
0
        private async Task <JObject> KeenWebApiRequest(string operation = "", Dictionary <string, string> parms = null)
        {
            var parmVals = parms == null ? "" : string.Join("&", from p in parms.Keys
                                                            where !string.IsNullOrEmpty(parms[p])
                                                            select string.Format("{0}={1}", p, Uri.EscapeDataString(parms[p])));

            var url = string.Format("{0}{1}{2}",
                                    _serverUrl,
                                    string.IsNullOrWhiteSpace(operation) ? "" : "/" + operation,
                                    string.IsNullOrWhiteSpace(parmVals) ? "" : "?" + parmVals);

            using (var client = new HttpClient())
            {
                client.DefaultRequestHeaders.Add("Authorization", _prjSettings.MasterKey);

                var responseMsg = await client.GetAsync(url).ConfigureAwait(false);

                var responseString = await responseMsg.Content.ReadAsStringAsync().ConfigureAwait(false);

                var response = JObject.Parse(responseString);

                // error checking, throw an exception with information from the json
                // response if available, then check the HTTP response.
                KeenUtil.CheckApiErrorCode((dynamic)response);
                if (!responseMsg.IsSuccessStatusCode)
                {
                    throw new KeenException("Request failed with status: " + responseMsg.StatusCode);
                }

                return(response);
            }
        }
Example #2
0
        public async Task DeleteDatasetAsync(string datasetName)
        {
            if (string.IsNullOrWhiteSpace(datasetName))
            {
                throw new KeenException("A dataset name is required.");
            }

            if (string.IsNullOrWhiteSpace(_masterKey))
            {
                throw new KeenException("An API MasterKey is required to get dataset results.");
            }

            var responseMsg = await _keenHttpClient
                              .DeleteAsync(GetDatasetUrl(datasetName), _masterKey)
                              .ConfigureAwait(continueOnCapturedContext: false);

            var responseString = await responseMsg
                                 .Content
                                 .ReadAsStringAsync()
                                 .ConfigureAwait(continueOnCapturedContext: false);

            if (HttpStatusCode.NoContent != responseMsg.StatusCode)
            {
                var response = JObject.Parse(responseString);

                KeenUtil.CheckApiErrorCode(response);

                throw new KeenException($"Request failed with status: {responseMsg.StatusCode}");
            }
        }
Example #3
0
        public async Task <DatasetDefinition> GetDefinitionAsync(string datasetName)
        {
            if (string.IsNullOrWhiteSpace(datasetName))
            {
                throw new KeenException("A dataset name is required.");
            }

            if (string.IsNullOrWhiteSpace(_readKey))
            {
                throw new KeenException("An API ReadKey is required to get dataset results.");
            }

            var responseMsg = await _keenHttpClient
                              .GetAsync(GetDatasetUrl(datasetName), _readKey)
                              .ConfigureAwait(continueOnCapturedContext: false);

            var responseString = await responseMsg
                                 .Content
                                 .ReadAsStringAsync()
                                 .ConfigureAwait(continueOnCapturedContext: false);

            var response = JObject.Parse(responseString);

            KeenUtil.CheckApiErrorCode(response);

            if (!responseMsg.IsSuccessStatusCode)
            {
                throw new KeenException($"Request failed with status: {responseMsg.StatusCode}");
            }

            return(JsonConvert.DeserializeObject <DatasetDefinition>(responseString,
                                                                     SerializerSettings));
        }
Example #4
0
        public async Task DefaultHeaders_Success()
        {
            object responseData = new[] { new { result = 2 } };

            var handler = new FuncHandler()
            {
                PreProcess = (req, ct) =>
                {
                    // Make sure the default headers are in place
                    Assert.IsTrue(req.Headers.Contains("Keen-Sdk"));
                    Assert.AreEqual(KeenUtil.GetSdkVersion(), req.Headers.GetValues("Keen-Sdk").Single());

                    Assert.IsTrue(req.Headers.Contains("Authorization"));

                    var key = req.Headers.GetValues("Authorization").Single();
                    Assert.IsTrue(SettingsEnv.ReadKey == key ||
                                  SettingsEnv.WriteKey == key ||
                                  SettingsEnv.MasterKey == key);
                },
                ProduceResultAsync = (req, ct) =>
                {
                    return(CreateJsonStringResponseAsync(responseData));
                },
                DeferToDefault = false
            };

            var client = new KeenClient(SettingsEnv, new TestKeenHttpClientProvider()
            {
                ProvideKeenHttpClient =
                    (url) => KeenHttpClientFactory.Create(url,
                                                          new HttpClientCache(),
                                                          null,
                                                          new DelegatingHandlerMock(handler))
            });

            // Try out all the endpoints
            Assert.DoesNotThrow(() => client.GetSchemas());

            // Remaining operations expect an object, not an array of objects
            responseData = new { result = 2 };

            var @event = new { AProperty = "AValue" };

            Assert.DoesNotThrow(() => client.AddEvent("AddEventTest", @event));
            Assert.DoesNotThrow(() => client.AddEvents("AddEventTest", new[] { @event }));

            Assert.DoesNotThrow(() => client.DeleteCollection("DeleteColTest"));
            Assert.IsNotNull(client.GetSchema("AddEventTest"));

            // Currently all the queries/extraction go through the same KeenWebApiRequest() call.
            var count = await client.QueryAsync(
                QueryType.Count(),
                "testCollection",
                "",
                QueryRelativeTimeframe.ThisMonth());

            Assert.IsNotNull(count);
            Assert.AreEqual("2", count);
        }
Example #5
0
        public void GetSdkVersion_Success()
        {
            string sdkVersion = KeenUtil.GetSdkVersion();

            Assert.IsNotNull(sdkVersion);
            Assert.IsNotEmpty(sdkVersion);
            Assert.IsTrue(sdkVersion.StartsWith(".net"));
        }
Example #6
0
        public void GetSdkVersion_Success()
        {
            // TODO : Decide on a better place for this when we break out tests and do a CC push.
            string sdkVersion = KeenUtil.GetSdkVersion();

            Assert.IsNotNull(sdkVersion);
            Assert.IsNotEmpty(sdkVersion);
            Assert.IsTrue(sdkVersion.StartsWith(".net"));
        }
Example #7
0
        public async Task <JObject> GetResultsAsync(string datasetName,
                                                    string indexBy,
                                                    string timeframe)
        {
            if (string.IsNullOrWhiteSpace(datasetName))
            {
                throw new KeenException("A dataset name is required.");
            }

            if (string.IsNullOrWhiteSpace(indexBy))
            {
                throw new KeenException("A value to index by is required.");
            }

            if (string.IsNullOrWhiteSpace(timeframe))
            {
                throw new KeenException("A timeframe by is required.");
            }

            if (string.IsNullOrWhiteSpace(_readKey))
            {
                throw new KeenException("An API ReadKey is required to get dataset results.");
            }

            var datasetResultsUrl = $"{GetDatasetUrl(datasetName)}/results";

            // Absolute timeframes can have reserved characters like ':', and index_by can be
            // any valid JSON member name, which can have all sorts of stuff, so we escape here.
            var url = $"{datasetResultsUrl}?" +
                      $"index_by={Uri.EscapeDataString(indexBy)}" +
                      $"&timeframe={Uri.EscapeDataString(timeframe)}";

            var responseMsg = await _keenHttpClient
                              .GetAsync(url, _readKey)
                              .ConfigureAwait(continueOnCapturedContext: false);

            var responseString = await responseMsg
                                 .Content
                                 .ReadAsStringAsync()
                                 .ConfigureAwait(continueOnCapturedContext: false);

            var response = JObject.Parse(responseString);

            KeenUtil.CheckApiErrorCode(response);

            if (!responseMsg.IsSuccessStatusCode)
            {
                throw new KeenException($"Request failed with status: {responseMsg.StatusCode}");
            }

            return(response);
        }
Example #8
0
        public async Task <JObject> GetResultsAsync(string datasetName,
                                                    string indexBy,
                                                    string timeframe)
        {
            if (string.IsNullOrWhiteSpace(datasetName))
            {
                throw new KeenException("A dataset name is required.");
            }

            if (string.IsNullOrWhiteSpace(indexBy))
            {
                throw new KeenException("A value to index by is required.");
            }

            if (string.IsNullOrWhiteSpace(timeframe))
            {
                throw new KeenException("A timeframe by is required.");
            }

            if (string.IsNullOrWhiteSpace(_masterKey))
            {
                throw new KeenException("An API masterkey is required to get dataset results.");
            }

            var datasetResultsUrl = $"{GetDatasetUrl(datasetName)}/results";

            var url = $"{datasetResultsUrl}?index_by={indexBy}&timeframe={timeframe}";

            var responseMsg = await _keenHttpClient
                              .GetAsync(url, _masterKey)
                              .ConfigureAwait(continueOnCapturedContext: false);

            var responseString = await responseMsg
                                 .Content
                                 .ReadAsStringAsync()
                                 .ConfigureAwait(continueOnCapturedContext: false);

            var response = JObject.Parse(responseString);

            KeenUtil.CheckApiErrorCode(response);

            if (!responseMsg.IsSuccessStatusCode)
            {
                throw new KeenException($"Request failed with status: {responseMsg.StatusCode}");
            }

            return(response);
        }
Example #9
0
        private async Task <JObject> KeenWebApiRequest(string operation = "",
                                                       Dictionary <string, string> parms = null)
        {
            if (string.IsNullOrWhiteSpace(_key))
            {
                throw new KeenException("An API ReadKey or MasterKey is required.");
            }

            var parmVals = (parms == null) ?
                           "" : string.Join("&", from p in parms.Keys
                                            where !string.IsNullOrEmpty(parms[p])
                                            select string.Format("{0}={1}",
                                                                 p,
                                                                 Uri.EscapeDataString(parms[p])));

            var url = string.Format("{0}{1}{2}",
                                    _queryRelativeUrl,
                                    string.IsNullOrWhiteSpace(operation) ? "" : "/" + operation,
                                    string.IsNullOrWhiteSpace(parmVals) ? "" : "?" + parmVals);

            var responseMsg = await _keenHttpClient.GetAsync(url, _key).ConfigureAwait(false);

            var responseString = await responseMsg
                                 .Content
                                 .ReadAsStringAsync()
                                 .ConfigureAwait(false);

            var response = JObject.Parse(responseString);

            // error checking, throw an exception with information from the json
            // response if available, then check the HTTP response.
            KeenUtil.CheckApiErrorCode(response);

            if (!responseMsg.IsSuccessStatusCode)
            {
                throw new KeenException("Request failed with status: " +
                                        responseMsg.StatusCode);
            }

            return(response);
        }
Example #10
0
        public async Task <DatasetDefinitionCollection> ListDefinitionsAsync(
            int limit        = 10,
            string afterName = null)
        {
            if (string.IsNullOrWhiteSpace(_readKey))
            {
                throw new KeenException("An API ReadKey is required to get dataset results.");
            }

            // limit is just an int, so no need to encode here.
            var datasetResultsUrl = $"{_cachedDatasetRelativeUrl}?limit={limit}";

            if (!string.IsNullOrWhiteSpace(afterName))
            {
                // afterName should be a valid dataset name, which can only be
                // alphanumerics, '_' and '-', so we don't escape here.
                datasetResultsUrl += $"&after_name={afterName}";
            }

            var responseMsg = await _keenHttpClient
                              .GetAsync(datasetResultsUrl, _readKey)
                              .ConfigureAwait(continueOnCapturedContext: false);

            var responseString = await responseMsg
                                 .Content
                                 .ReadAsStringAsync()
                                 .ConfigureAwait(continueOnCapturedContext: false);

            var response = JObject.Parse(responseString);

            KeenUtil.CheckApiErrorCode(response);

            if (!responseMsg.IsSuccessStatusCode)
            {
                throw new KeenException($"Request failed with status: {responseMsg.StatusCode}");
            }

            return(JsonConvert.DeserializeObject <DatasetDefinitionCollection>(responseString,
                                                                               SerializerSettings));
        }
Example #11
0
        public async Task <DatasetDefinition> CreateDatasetAsync(DatasetDefinition dataset)
        {
            if (string.IsNullOrWhiteSpace(_masterKey))
            {
                throw new KeenException("An API MasterKey is required to get dataset results.");
            }

            // Validate
            if (null == dataset)
            {
                throw new KeenException("An instance of DatasetDefinition must be provided");
            }

            // This throws if dataset is not valid.
            dataset.Validate();

            var content = JsonConvert.SerializeObject(dataset, SerializerSettings);

            var responseMsg = await _keenHttpClient
                              .PutAsync(GetDatasetUrl(dataset.DatasetName), _masterKey, content)
                              .ConfigureAwait(continueOnCapturedContext: false);

            var responseString = await responseMsg
                                 .Content
                                 .ReadAsStringAsync()
                                 .ConfigureAwait(continueOnCapturedContext: false);

            var response = JObject.Parse(responseString);

            KeenUtil.CheckApiErrorCode(response);

            if (!responseMsg.IsSuccessStatusCode)
            {
                throw new KeenException($"Request failed with status: {responseMsg.StatusCode}");
            }

            return(JsonConvert.DeserializeObject <DatasetDefinition>(responseString,
                                                                     SerializerSettings));
        }
Example #12
0
        public async Task <DatasetDefinitionCollection> ListDefinitionsAsync(
            int limit        = 10,
            string afterName = null)
        {
            if (string.IsNullOrWhiteSpace(_masterKey))
            {
                throw new KeenException("An API masterkey is required to get dataset results.");
            }

            var datasetResultsUrl = $"{_cachedDatasetRelativeUrl}?limit={limit}";

            if (!string.IsNullOrWhiteSpace(afterName))
            {
                datasetResultsUrl += $"&after_name={afterName}";
            }

            var responseMsg = await _keenHttpClient
                              .GetAsync(datasetResultsUrl, _masterKey)
                              .ConfigureAwait(continueOnCapturedContext: false);

            var responseString = await responseMsg
                                 .Content
                                 .ReadAsStringAsync()
                                 .ConfigureAwait(continueOnCapturedContext: false);

            var response = JObject.Parse(responseString);

            KeenUtil.CheckApiErrorCode(response);

            if (!responseMsg.IsSuccessStatusCode)
            {
                throw new KeenException($"Request failed with status: {responseMsg.StatusCode}");
            }

            return(JsonConvert.DeserializeObject <DatasetDefinitionCollection>(responseString,
                                                                               SERIALIZER_SETTINGS));
        }