Skip to content

Commit df0a0d3

Browse files
committed
Feat: add governance query APIs and read side examples
1 parent bb17174 commit df0a0d3

23 files changed

Lines changed: 1902 additions & 104 deletions
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
using Queries.Scenarios;
2+
3+
await GovernanceQueriesScenario.Run();
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net10.0</TargetFramework>
6+
<ImplicitUsings>enable</ImplicitUsings>
7+
<Nullable>enable</Nullable>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<ProjectReference Include="..\..\..\src\ModularityKit.Mutator.Governance.csproj" />
12+
</ItemGroup>
13+
14+
</Project>
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# Governance Queries
2+
3+
This example shows the query-oriented read side of `ModularityKit.Mutator.Governance`.
4+
5+
It focuses on listing governed requests, approval work, and decision history without reconstructing those views manually from raw stored records.
6+
7+
## What it demonstrates
8+
9+
- querying governed requests with `MutationRequestQuery`
10+
- listing the pending approval queue through `IMutationRequestQueryStore`
11+
- listing pending requests by `PendingMutationReason`
12+
- querying requests by `StateId` and request category
13+
- listing recent approval-driven requests
14+
- projecting pending approval work with `MutationApprovalQuery`
15+
- projecting recent decision history with `MutationRequestDecisionQuery`
16+
- projecting recent execution outcomes separately from version resolution history
17+
- using the in-memory governance store as both write-side storage and query-side read model
18+
19+
## Key files
20+
21+
- [`Program.cs`](Program.cs)
22+
- [`Scenarios/GovernanceQueriesScenario.cs`](Scenarios/GovernanceQueriesScenario.cs)
23+
- [`Scenarios/GovernanceQueriesSampleData.cs`](Scenarios/GovernanceQueriesSampleData.cs)
24+
- [`Scenarios/RequestQueryScenario.cs`](Scenarios/RequestQueryScenario.cs)
25+
- [`Scenarios/ApprovalQueryScenario.cs`](Scenarios/ApprovalQueryScenario.cs)
26+
- [`Scenarios/DecisionQueryScenario.cs`](Scenarios/DecisionQueryScenario.cs)
27+
- [`src/Governance/Abstractions/Queries/Contracts/IMutationRequestQueryStore.cs`](../../../src/Governance/Abstractions/Queries/Contracts/IMutationRequestQueryStore.cs)
28+
- [`src/Governance/Abstractions/Queries/Model/MutationRequestQuery.cs`](../../../src/Governance/Abstractions/Queries/Model/MutationRequestQuery.cs)
29+
- [`src/Governance/Abstractions/Queries/Model/MutationApprovalQuery.cs`](../../../src/Governance/Abstractions/Queries/Model/MutationApprovalQuery.cs)
30+
- [`src/Governance/Abstractions/Queries/Model/MutationRequestDecisionQuery.cs`](../../../src/Governance/Abstractions/Queries/Model/MutationRequestDecisionQuery.cs)
31+
32+
## Run
33+
34+
```bash
35+
dotnet run --project Examples/Governance/Queries/Queries.csproj
36+
```
37+
38+
## Expected output
39+
40+
The sample prints:
41+
42+
- pending approval requests
43+
- pending external-check requests
44+
- requests filtered by request category
45+
- requests filtered by state
46+
- recent approval-driven requests
47+
- approval views filtered by approver
48+
- recent version-resolution decisions
49+
- recent execution outcomes
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using ModularityKit.Mutator.Governance.Abstractions.Queries.Contracts;
2+
using ModularityKit.Mutator.Governance.Abstractions.Queries.Model;
3+
4+
namespace Queries.Scenarios;
5+
6+
internal static class ApprovalQueryScenario
7+
{
8+
public static async Task Run(IMutationRequestQueryStore queryStore)
9+
{
10+
GovernanceQueriesSampleData.PrintSection("Pending Approvals For security-lead");
11+
GovernanceQueriesSampleData.PrintApprovals(await queryStore.GetPendingApprovalsAsync(new MutationApprovalQuery
12+
{
13+
ApproverIds = new HashSet<string> { "security-lead" }
14+
}));
15+
}
16+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using ModularityKit.Mutator.Governance.Abstractions.Queries.Contracts;
2+
using ModularityKit.Mutator.Governance.Abstractions.Queries.Model;
3+
4+
namespace Queries.Scenarios;
5+
6+
internal static class DecisionQueryScenario
7+
{
8+
public static async Task Run(IMutationRequestQueryStore queryStore)
9+
{
10+
GovernanceQueriesSampleData.PrintSection("Recent Version Resolution Decisions");
11+
GovernanceQueriesSampleData.PrintDecisions(await queryStore.GetRecentDecisionsAsync(
12+
MutationRequestDecisionQuery.RecentVersionResolutions(),
13+
take: 5));
14+
15+
GovernanceQueriesSampleData.PrintSection("Recent Execution Outcomes");
16+
GovernanceQueriesSampleData.PrintDecisions(await queryStore.GetRecentDecisionsAsync(
17+
MutationRequestDecisionQuery.RecentExecutionOutcomes(),
18+
take: 5));
19+
}
20+
}

0 commit comments

Comments
 (0)