public void Post([FromBody] ApiMetadataDTO apiMetadata)
        {
            if (ModelState.IsValid)
            {
                Console.WriteLine("API Management Synchronizer");
                Console.WriteLine("===========================");

                Console.WriteLine(string.Format("API Name: {0}", apiMetadata.ApiName));
                Console.WriteLine(string.Format("Azure Api Version: {0}", apiMetadata.AzureApiVersion));
                Console.WriteLine(string.Format("Swagger Url: {0}", apiMetadata.SwaggerUrl));
                Console.WriteLine(string.Format("Tenant Name: {0}", apiMetadata.TenantName));

                // Actions
                Console.Write("Getting Existing Apis...");
                var apiInfo = this._apiManagementClient.GetAsociatedApi(apiMetadata).Result;

                if (apiInfo.ApiExists())
                {
                    // Upgrade Api
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.Write("OK");
                    Console.ResetColor();

                    Console.ForegroundColor = ConsoleColor.Yellow;
                    Console.WriteLine(" - Api Found: {0}", apiInfo.ApiAid);
                    Console.ResetColor();

                    Console.Write("Deploying API: {0} to Management API...", apiInfo.ApiAid);
                    this._apiManagementClient.UpgradeSwaggerApi(apiInfo.ApiAid, apiMetadata).Wait();
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("Sync");
                    Console.ResetColor();

                    // Checking Policies
                    Console.Write("Getting API Policies...");
                    var policy = this._apiManagementClient.GetPolicy(apiInfo.ApiAid, apiMetadata).Result;

                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.Write("OK");
                    Console.ResetColor();

                    if (!policy)
                    {
                        Console.ForegroundColor = ConsoleColor.Blue;
                        Console.WriteLine("Policy does not exists for API.");
                        Console.ResetColor();
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.Yellow;
                        Console.WriteLine(" - Policy already set.");
                        Console.ResetColor();
                    }
                }
            }
            else
            {
                Console.WriteLine("Incomming Request is invalid.");
            }
        }
        public async Task UpgradeSwaggerApi(string aid, ApiMetadataDTO metadata)
        {
            using (var httpClient = await this._httpClientFactory.Create(UrisTemplate.GetBaseApiManagementUri(metadata.TenantName)))
            {
                httpClient.DefaultRequestHeaders.Add("If-Match", "*");

                var requestParams = new Dictionary <string, string>()
                {
                    { "link", metadata.SwaggerUrl }
                };

                var content      = new StringContent(JsonConvert.SerializeObject(requestParams), Encoding.UTF8, "application/vnd.swagger.link+json");
                var httpResponse = await httpClient.PutAsync(UrisTemplate.GetSwaggerImportUri(aid, metadata.AzureApiVersion), content);

                httpResponse.EnsureSuccessStatusCode();
            }
        }
        public async Task <AsociatedApi> GetAsociatedApi(ApiMetadataDTO metadata)
        {
            using (var httpClient = await this._httpClientFactory.Create(UrisTemplate.GetBaseApiManagementUri(metadata.TenantName)))
            {
                var httpResponse = await httpClient.GetAsync(UrisTemplate.GetAllApisUri(metadata.AzureApiVersion)).ConfigureAwait(false);

                httpResponse.EnsureSuccessStatusCode();

                var apis = JsonConvert.DeserializeObject <ApisRootObject>(
                    await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false)
                    );

                var apiObj = apis.value.Where(api => api.name.ToLower() == metadata.ApiName.ToLower()).FirstOrDefault();

                return(new AsociatedApi(apiObj.id));
            }
        }
        public async Task <bool> GetPolicy(string aid, ApiMetadataDTO metadata)
        {
            using (var httpClient = await this._httpClientFactory.Create(UrisTemplate.GetBaseApiManagementUri(metadata.TenantName)))
            {
                var httpResponse = await httpClient.GetAsync(UrisTemplate.GetPolicyTemplate(aid, metadata.AzureApiVersion));

                try
                {
                    httpResponse.EnsureSuccessStatusCode();
                }
                catch (WebException)
                {
                    if (httpResponse.StatusCode == HttpStatusCode.NotFound)
                    {
                        return(false);
                    }
                }
            }

            return(true);
        }