-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathRedisMutationRequestStore.cs
More file actions
169 lines (154 loc) · 8.09 KB
/
Copy pathRedisMutationRequestStore.cs
File metadata and controls
169 lines (154 loc) · 8.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
using ModularityKit.Mutator.Governance.Abstractions.Lifecycle.Model;
using ModularityKit.Mutator.Governance.Abstractions.Queries.Contracts;
using ModularityKit.Mutator.Governance.Abstractions.Queries.Model.Approvals;
using ModularityKit.Mutator.Governance.Abstractions.Queries.Model.Decisions;
using ModularityKit.Mutator.Governance.Abstractions.Queries.Model.Requests;
using ModularityKit.Mutator.Governance.Abstractions.Requests.Model;
using ModularityKit.Mutator.Governance.Abstractions.Storage;
using ModularityKit.Mutator.Governance.Redis.Storage.Persistence;
using ModularityKit.Mutator.Governance.Redis.Storage.Queries;
using ModularityKit.Mutator.Governance.Redis.Storage.Queries.Reading;
namespace ModularityKit.Mutator.Governance.Redis.Storage;
/// <summary>
/// Implementation of governed mutation request storage and query access.
/// </summary>
public sealed class RedisMutationRequestStore : IMutationRequestStore, IMutationRequestQueryStore
{
private readonly RedisMutationRequestPersistence _persistence;
private readonly RedisMutationRequestQueryReader _queryReader;
internal RedisMutationRequestStore(
RedisMutationRequestPersistence persistence,
RedisMutationRequestQueryReader queryReader)
{
_persistence = persistence ?? throw new ArgumentNullException(nameof(persistence));
_queryReader = queryReader ?? throw new ArgumentNullException(nameof(queryReader));
}
/// <summary>
/// Creates governed mutation request in storage.
/// </summary>
/// <param name="request">The request to create.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The persisted mutation request.</returns>
public Task<MutationRequest> Create(
MutationRequest request,
CancellationToken cancellationToken = default)
=> _persistence.Create(request, cancellationToken);
/// <summary>
/// Attempts to store governed mutation request update using optimistic concurrency.
/// </summary>
/// <param name="request">The request to store.</param>
/// <param name="expectedRevision">The expected current revision.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The persisted request if the update succeeds; otherwise <see langword="null" />.</returns>
public Task<MutationRequest?> TryStore(
MutationRequest request,
long expectedRevision,
CancellationToken cancellationToken = default)
=> _persistence.TryStore(request, expectedRevision, cancellationToken);
/// <summary>
/// Reads governed mutation request by identifier.
/// </summary>
/// <param name="requestId">The request identifier.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The request if it exists; otherwise <see langword="null" />.</returns>
public Task<MutationRequest?> Get(
string requestId,
CancellationToken cancellationToken = default)
=> _persistence.Get(requestId, cancellationToken);
/// <summary>
/// Reads governed mutation requests for specific state identifier.
/// </summary>
/// <param name="stateId">The state identifier.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The matching requests.</returns>
public Task<IReadOnlyList<MutationRequest>> GetByStateId(
string stateId,
CancellationToken cancellationToken = default)
=> _queryReader.GetByStateId(stateId, cancellationToken);
/// <summary>
/// Reads pending governed mutation requests, optionally narrowed by reason.
/// </summary>
/// <param name="reason">The optional pending reason.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The matching requests.</returns>
public Task<IReadOnlyList<MutationRequest>> GetPending(
PendingMutationReason? reason = null,
CancellationToken cancellationToken = default)
=> _queryReader.GetPending(reason, cancellationToken);
/// <summary>
/// Reads pending governed mutation requests for specific state identifier.
/// </summary>
/// <param name="stateId">The state identifier.</param>
/// <param name="reason">The optional pending reason.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The matching requests.</returns>
public Task<IReadOnlyList<MutationRequest>> GetPendingByStateId(
string stateId,
PendingMutationReason? reason = null,
CancellationToken cancellationToken = default)
=> _queryReader.GetPendingByStateId(stateId, reason, cancellationToken);
/// <summary>
/// Reads governed mutation requests matching the supplied query.
/// </summary>
/// <param name="query">The request query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The matching requests.</returns>
public Task<IReadOnlyList<MutationRequest>> QueryAsync(
MutationRequestQuery query,
CancellationToken cancellationToken = default)
=> _queryReader.QueryAsync(query, cancellationToken);
/// <summary>
/// Reads pending governed mutation requests using an optional additional query filter.
/// </summary>
/// <param name="query">The optional request query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The matching pending requests.</returns>
public Task<IReadOnlyList<MutationRequest>> GetPendingRequestsAsync(
MutationRequestQuery? query = null,
CancellationToken cancellationToken = default)
=> _queryReader.GetPendingRequestsAsync(query, cancellationToken);
/// <summary>
/// Reads the pending approval queue using an optional additional query filter.
/// </summary>
/// <param name="query">The optional request query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The matching pending approval-queue requests.</returns>
public Task<IReadOnlyList<MutationRequest>> GetPendingApprovalQueueAsync(
MutationRequestQuery? query = null,
CancellationToken cancellationToken = default)
=> _queryReader.GetPendingApprovalQueueAsync(query, cancellationToken);
/// <summary>
/// Recently reads approval active governed mutation requests.
/// </summary>
/// <param name="query">The optional request query.</param>
/// <param name="take">The optional result limit.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The matching requests.</returns>
public Task<IReadOnlyList<MutationRequest>> GetRecentApprovalsAsync(
MutationRequestQuery? query = null,
int? take = null,
CancellationToken cancellationToken = default)
=> _queryReader.GetRecentApprovalsAsync(query, take, cancellationToken);
/// <summary>
/// Reads pending approval views using an optional approval query filter.
/// </summary>
/// <param name="query">The optional approval query.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The matching approval views.</returns>
public Task<IReadOnlyList<MutationApprovalView>> GetPendingApprovalsAsync(
MutationApprovalQuery? query = null,
CancellationToken cancellationToken = default)
=> _queryReader.GetPendingApprovalsAsync(query, cancellationToken);
/// <summary>
/// Reads recent decision views using an optional decision query filter.
/// </summary>
/// <param name="query">The optional decision query.</param>
/// <param name="take">The optional result limit.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>The matching decision views.</returns>
public Task<IReadOnlyList<MutationRequestDecisionView>> GetRecentDecisionsAsync(
MutationRequestDecisionQuery? query = null,
int? take = null,
CancellationToken cancellationToken = default)
=> _queryReader.GetRecentDecisionsAsync(query, take, cancellationToken);
}