public async Task RecuringCheckApiJob()
        {
            foreach (var apiInfo in Database.ApiInfoRepo.GetAll().ToArray())
            {
                var monitoring = await RunMonitoring(ApiInfoViewModel.FromEntity(apiInfo));

                await Database.MonitoringRepo.CreateAsync(monitoring);
            }
        }
        public async Task <IEnumerable <ResultViewModel> > GetResults(int?apiId = null)
        {
            int standardExecTime           = int.Parse(Configuration["Params:StardardExecTime"]);
            List <ResultViewModel> results = new List <ResultViewModel>();
            var apiInfos = apiId.HasValue ? Database.ApiInfoRepo.Get(ai => ai.Id.Equals(apiId.Value)) : Database.ApiInfoRepo.GetAll();

            apiInfos.ToList().ForEach(api =>
            {
                ResultViewModel result = new ResultViewModel()
                {
                    ApiServiceViewModel = ApiInfoViewModel.FromEntity(api),
                    StandardExecTime    = standardExecTime
                };
                results.Add(result);
            });

            foreach (var result in results)
            {
                var checkApi = await this.RunMonitoring(result.ApiServiceViewModel);

                result.Accessible = checkApi.Accessible;
                if (result.ApiServiceViewModel.CheckExecTime)
                {
                    result.ExecTimeInSeconds = checkApi.ExecTimeInMilliseconds;

                    if (apiId.HasValue)
                    {
                        var filteredMonitoringsForHour = Database.MonitoringRepo.Get(m => m.ApiInfoId.Equals(result.ApiServiceViewModel.Id))
                                                         .Where(m => (DateTime.Now - m.ExecStart.Value).TotalMinutes <= 60);
                        result.MaxExecTimePerLastHour = filteredMonitoringsForHour
                                                        .Any(m => m.ExecTimeInMilliseconds.Value / 2.0 > result.StandardExecTime)
                                                                ? filteredMonitoringsForHour.Max(m => m.ExecTimeInMilliseconds)
                                                                : null;
                        var filteredMonitoringsForDay = Database.MonitoringRepo.Get(m => m.ApiInfoId.Equals(result.ApiServiceViewModel.Id))
                                                        .Where(m => (DateTime.Now - m.ExecStart.Value).TotalHours <= 24);
                        result.MaxExecTimePerLastDay = filteredMonitoringsForDay
                                                       .Any(m => m.ExecTimeInMilliseconds.Value / 2.0 > result.StandardExecTime)
                                                                    ? filteredMonitoringsForDay.Max(m => m.ExecTimeInMilliseconds)
                                                                    : null;
                    }
                }
                result.FailCountPerLastHour = Database.MonitoringRepo.Get(m => m.ApiInfoId.Equals(result.ApiServiceViewModel.Id))
                                              .Count(m => !m.Accessible && (DateTime.Now - m.ExecStart.Value).TotalMinutes <= 60);
                result.FailCountPerLastDay = Database.MonitoringRepo.Get(m => m.ApiInfoId.Equals(result.ApiServiceViewModel.Id))
                                             .Count(m => !m.Accessible && (DateTime.Now - m.ExecStart.Value).TotalHours <= 24);
            }

            return(results);
        }
            public async Task <IActionResult> ApiInfo()
            {
                ApiInfoViewModel apiInfo = new ApiInfoViewModel
                {
                    Configuration = Configuration.AsEnumerable(),
                    Controllers   = GetType().Assembly.GetTypes()
                                    .Where(type => type.IsSubclassOf(typeof(ControllerBase)))
                                    .Select(ct => new ControllerInfoViewModel
                    {
                        Name    = ct.Name.Replace("Controller", ""),
                        Actions = ct.GetMethods(BindingFlags.Public | BindingFlags.Instance)
                                  .Where(m => m.DeclaringType.ToString() == ct.UnderlyingSystemType.ToString())
                                  .Select(m => m.Name.ToString())
                    }
                                            )
                };

                return(Ok(JsonConvert.SerializeObject(apiInfo)));
            }
        public async Task <Monitoring> RunMonitoring(ApiInfoViewModel apiInfoViewModel)
        {
            Monitoring res        = new Monitoring();
            HttpClient httpClient = new HttpClient();

            if (apiInfoViewModel.CheckExecTime)
            {
                httpClient.DefaultRequestHeaders.Add("AccessKey", "test_05fc5ed1-0199-4259-92a0-2cd58214b29c");
            }
            Stopwatch timer = new Stopwatch();

            res.ExecStart = DateTime.Now;
            try
            {
                timer.Start();
                var response = await httpClient.GetAsync(apiInfoViewModel.Url);

                timer.Stop();
                if (apiInfoViewModel.CheckExecTime)
                {
                    res.ExecTimeInMilliseconds = timer.ElapsedMilliseconds;
                }
                res.Accessible = response.IsSuccessStatusCode;
            }
            catch (HttpRequestException ex)
            {
                timer.Stop();
                if (apiInfoViewModel.CheckExecTime)
                {
                    res.ExecTimeInMilliseconds = null;
                }
                res.Accessible = false;
            }


            res.ApiInfoId = apiInfoViewModel.Id;
            return(res);
        }