Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 39 additions & 11 deletions src/SelfService/Application/ComplianceApplicationService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,18 @@ public async Task<CostCentreComplianceDetailsResult> GetRogueCapabilitiesComplia
);
}

public async Task<ComplianceSummaryResult> GetComplianceSummary()
{
var all = await BuildComplianceDetailsForCapabilities("all", _ => true);
return new ComplianceSummaryResult
{
TotalCapabilities = all.TotalCapabilities,
FullyCompliantCapabilities = all.CompliantCount,
NonCompliantCapabilities = all.NonCompliantCount,
UnknownCapabilities = all.UnknownCount,
};
}

public async Task<RequirementsComplianceResult> GetRequirementsCompliance()
{
var allCapabilitiesDetails = await BuildComplianceDetailsForCapabilities("all", _ => true);
Expand Down Expand Up @@ -236,15 +248,30 @@ private static RequirementComplianceSummaryResult BuildRequirementSummary(
List<CostCentreCapabilityComplianceResult> capabilities
)
{
var categories = capabilities
.Select(capability =>
capability.Categories.FirstOrDefault(category => category.CategoryName == definition.CategoryName)
)
.Where(category => category != null)
.Select(category => category!)
var matched = capabilities
.Select(cap => new
{
cap,
category = cap.Categories.FirstOrDefault(c => c.CategoryName == definition.CategoryName),
})
.Where(x => x.category != null)
.Select(x => new { x.cap, category = x.category! })
.ToList();

var metadataSource = categories.FirstOrDefault();
var metadataSource = matched.Select(x => x.category).FirstOrDefault();

var byCostCentre = matched
.GroupBy(x => ExtractCostCentre(x.cap.JsonMetadata))
.OrderBy(g => g.Key)
.Select(g => new RequirementByCostCentreResult
{
CostCentre = g.Key,
TotalCapabilities = g.Count(),
CompliantCount = g.Count(x => x.category.Status == ComplianceStatus.Compliant),
NonCompliantCount = g.Count(x => x.category.Status == ComplianceStatus.NonCompliant),
UnknownCount = g.Count(x => x.category.Status == ComplianceStatus.Unknown),
})
.ToList();

return new RequirementComplianceSummaryResult
{
Expand All @@ -253,10 +280,11 @@ List<CostCentreCapabilityComplianceResult> capabilities
DisplayName = metadataSource?.DisplayName ?? definition.CategoryName,
Description = metadataSource?.Description,
HelpUrl = metadataSource?.HelpUrl,
TotalCapabilities = categories.Count,
CompliantCount = categories.Count(category => category.Status == ComplianceStatus.Compliant),
NonCompliantCount = categories.Count(category => category.Status == ComplianceStatus.NonCompliant),
UnknownCount = categories.Count(category => category.Status == ComplianceStatus.Unknown),
TotalCapabilities = matched.Count,
CompliantCount = matched.Count(x => x.category.Status == ComplianceStatus.Compliant),
NonCompliantCount = matched.Count(x => x.category.Status == ComplianceStatus.NonCompliant),
UnknownCount = matched.Count(x => x.category.Status == ComplianceStatus.Unknown),
ByCostCentre = byCostCentre,
};
}

Expand Down
18 changes: 18 additions & 0 deletions src/SelfService/Application/ComplianceModels.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,11 +69,28 @@ public class CostCentreCapabilityComplianceResult
public List<ComplianceCategoryResult> Categories { get; set; } = new();
}

public class ComplianceSummaryResult
{
public int TotalCapabilities { get; set; }
public int FullyCompliantCapabilities { get; set; }
public int NonCompliantCapabilities { get; set; }
public int UnknownCapabilities { get; set; }
}

public class RequirementsComplianceResult
{
public List<RequirementComplianceSummaryResult> Items { get; set; } = new();
}

public class RequirementByCostCentreResult
{
public string? CostCentre { get; set; }
public int TotalCapabilities { get; set; }
public int CompliantCount { get; set; }
public int NonCompliantCount { get; set; }
public int UnknownCount { get; set; }
}

public class RequirementComplianceSummaryResult
{
public string RequirementId { get; set; } = null!;
Expand All @@ -85,6 +102,7 @@ public class RequirementComplianceSummaryResult
public int CompliantCount { get; set; }
public int NonCompliantCount { get; set; }
public int UnknownCount { get; set; }
public List<RequirementByCostCentreResult> ByCostCentre { get; set; } = new();
}

public class RequirementComplianceDetailsResult : RequirementComplianceSummaryResult
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ namespace SelfService.Application;

public interface IComplianceApplicationService
{
Task<ComplianceSummaryResult> GetComplianceSummary();
Task<CapabilityComplianceResult> GetCapabilityCompliance(CapabilityId capabilityId);
Task<CostCentreComplianceResult> GetCostCentreCompliance(string costCentre);
Task<CostCentreComplianceDetailsResult> GetCostCentreComplianceDetails(string costCentre);
Expand Down
50 changes: 39 additions & 11 deletions src/SelfService/Application/StubComplianceApplicationService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,18 @@ public async Task<CostCentreComplianceDetailsResult> GetRogueCapabilitiesComplia
);
}

public async Task<ComplianceSummaryResult> GetComplianceSummary()
{
var all = await BuildComplianceDetailsForCapabilities("all", _ => true);
return new ComplianceSummaryResult
{
TotalCapabilities = all.TotalCapabilities,
FullyCompliantCapabilities = all.CompliantCount,
NonCompliantCapabilities = all.NonCompliantCount,
UnknownCapabilities = all.UnknownCount,
};
}

public async Task<RequirementsComplianceResult> GetRequirementsCompliance()
{
var allCapabilitiesDetails = await BuildComplianceDetailsForCapabilities("all", _ => true);
Expand Down Expand Up @@ -291,15 +303,30 @@ private static RequirementComplianceSummaryResult BuildRequirementSummary(
List<CostCentreCapabilityComplianceResult> capabilities
)
{
var categories = capabilities
.Select(capability =>
capability.Categories.FirstOrDefault(category => category.CategoryName == definition.CategoryName)
)
.Where(category => category != null)
.Select(category => category!)
var matched = capabilities
.Select(cap => new
{
cap,
category = cap.Categories.FirstOrDefault(c => c.CategoryName == definition.CategoryName),
})
.Where(x => x.category != null)
.Select(x => new { x.cap, category = x.category! })
.ToList();

var metadataSource = categories.FirstOrDefault();
var metadataSource = matched.Select(x => x.category).FirstOrDefault();

var byCostCentre = matched
.GroupBy(x => ExtractCostCentre(x.cap.JsonMetadata))
.OrderBy(g => g.Key)
.Select(g => new RequirementByCostCentreResult
{
CostCentre = g.Key,
TotalCapabilities = g.Count(),
CompliantCount = g.Count(x => x.category.Status == ComplianceStatus.Compliant),
NonCompliantCount = g.Count(x => x.category.Status == ComplianceStatus.NonCompliant),
UnknownCount = g.Count(x => x.category.Status == ComplianceStatus.Unknown),
})
.ToList();

return new RequirementComplianceSummaryResult
{
Expand All @@ -308,10 +335,11 @@ List<CostCentreCapabilityComplianceResult> capabilities
DisplayName = metadataSource?.DisplayName ?? definition.CategoryName,
Description = metadataSource?.Description,
HelpUrl = metadataSource?.HelpUrl,
TotalCapabilities = categories.Count,
CompliantCount = categories.Count(category => category.Status == ComplianceStatus.Compliant),
NonCompliantCount = categories.Count(category => category.Status == ComplianceStatus.NonCompliant),
UnknownCount = categories.Count(category => category.Status == ComplianceStatus.Unknown),
TotalCapabilities = matched.Count,
CompliantCount = matched.Count(x => x.category.Status == ComplianceStatus.Compliant),
NonCompliantCount = matched.Count(x => x.category.Status == ComplianceStatus.NonCompliant),
UnknownCount = matched.Count(x => x.category.Status == ComplianceStatus.Unknown),
ByCostCentre = byCostCentre,
};
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,25 @@

namespace SelfService.Infrastructure.Api.Compliance;

public class ComplianceSummaryApiResource
{
public int TotalCapabilities { get; set; }
public int FullyCompliantCapabilities { get; set; }
public int NonCompliantCapabilities { get; set; }
public int UnknownCapabilities { get; set; }

public static ComplianceSummaryApiResource From(ComplianceSummaryResult result)
{
return new ComplianceSummaryApiResource
{
TotalCapabilities = result.TotalCapabilities,
FullyCompliantCapabilities = result.FullyCompliantCapabilities,
NonCompliantCapabilities = result.NonCompliantCapabilities,
UnknownCapabilities = result.UnknownCapabilities,
};
}
}

public class CapabilityComplianceApiResource
{
public string CapabilityId { get; set; } = null!;
Expand Down Expand Up @@ -160,6 +179,27 @@ public static RequirementsComplianceApiResource From(RequirementsComplianceResul
}
}

public class RequirementByCostCentreApiResource
{
public string? CostCentre { get; set; }
public int TotalCapabilities { get; set; }
public int CompliantCount { get; set; }
public int NonCompliantCount { get; set; }
public int UnknownCount { get; set; }

public static RequirementByCostCentreApiResource From(RequirementByCostCentreResult result)
{
return new RequirementByCostCentreApiResource
{
CostCentre = result.CostCentre,
TotalCapabilities = result.TotalCapabilities,
CompliantCount = result.CompliantCount,
NonCompliantCount = result.NonCompliantCount,
UnknownCount = result.UnknownCount,
};
}
}

public class RequirementComplianceSummaryApiResource
{
public string RequirementId { get; set; } = null!;
Expand All @@ -171,6 +211,7 @@ public class RequirementComplianceSummaryApiResource
public int CompliantCount { get; set; }
public int NonCompliantCount { get; set; }
public int UnknownCount { get; set; }
public List<RequirementByCostCentreApiResource> ByCostCentre { get; set; } = new();

public static RequirementComplianceSummaryApiResource From(RequirementComplianceSummaryResult result)
{
Expand All @@ -185,6 +226,7 @@ public static RequirementComplianceSummaryApiResource From(RequirementCompliance
CompliantCount = result.CompliantCount,
NonCompliantCount = result.NonCompliantCount,
UnknownCount = result.UnknownCount,
ByCostCentre = result.ByCostCentre.Select(RequirementByCostCentreApiResource.From).ToList(),
};
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@ public ComplianceController(IComplianceApplicationService complianceService)
_complianceService = complianceService;
}

[HttpGet("summary")]
public async Task<IActionResult> GetComplianceSummary()
{
var result = await _complianceService.GetComplianceSummary();
return Ok(ComplianceSummaryApiResource.From(result));
}

[HttpGet("capabilities/{id}")]
public async Task<IActionResult> GetCapabilityCompliance([FromRoute] string id)
{
Expand Down
Loading