using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using Umbraco.Web.Editors; using Umbraco.Web.WebApi.Filters; namespace Umbraco.Web.HealthCheck { /// /// The API controller used to display the health check info and execute any actions /// [UmbracoApplicationAuthorize(Core.Constants.Applications.Developer)] public class HealthCheckController : UmbracoAuthorizedJsonController { private readonly IHealthCheckResolver _healthCheckResolver; public HealthCheckController() { _healthCheckResolver = HealthCheckResolver.Current; } public HealthCheckController(IHealthCheckResolver healthCheckResolver) { _healthCheckResolver = healthCheckResolver; } /// /// Gets a grouped list of health checks, but doesn't actively check the status of each health check. /// /// Returns a collection of anonymous objects representing each group. public object GetAllHealthChecks() { var groups = _healthCheckResolver.HealthChecks .GroupBy(x => x.Group) .OrderBy(x => x.Key); var healthCheckGroups = new List(); foreach (var healthCheckGroup in groups) { var hcGroup = new HealthCheckGroup { Name = healthCheckGroup.Key, Checks = healthCheckGroup .OrderBy(x => x.Name) .ToList() }; healthCheckGroups.Add(hcGroup); } return healthCheckGroups; } [HttpGet] public object GetStatus(Guid id) { var check = _healthCheckResolver.HealthChecks.FirstOrDefault(x => x.Id == id); if (check == null) throw new InvalidOperationException("No health check found with ID " + id); try { //Core.Logging.LogHelper.Debug("Running health check: " + check.Name); return check.GetStatus(); } catch (Exception e) { Core.Logging.LogHelper.Error("Exception in health check: " + check.Name, e); throw; } } [HttpPost] public HealthCheckStatus ExecuteAction(HealthCheckAction action) { var check = _healthCheckResolver.HealthChecks.FirstOrDefault(x => x.Id == action.HealthCheckId); if (check == null) throw new InvalidOperationException("No health check found with id " + action.HealthCheckId); return check.ExecuteAction(action); } } }