Skip to content

Commit 9b09977

Browse files
authored
Merge pull request #4918 from Particular/john/sp_end
New endpoint to support migration of SI to SP
2 parents 703c13a + ed60f9f commit 9b09977

File tree

24 files changed

+300
-60
lines changed

24 files changed

+300
-60
lines changed

src/ServiceControl.Audit.Persistence.InMemory/InMemoryAuditDataStore.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public async Task<QueryResult<SagaHistory>> QuerySagaHistoryById(Guid input, Can
4242
return await Task.FromResult(new QueryResult<SagaHistory>(sagaHistory, new QueryStatsInfo(string.Empty, 1)));
4343
}
4444

45-
public async Task<QueryResult<IList<MessagesView>>> GetMessages(bool includeSystemMessages, PagingInfo pagingInfo, SortInfo sortInfo, CancellationToken cancellationToken)
45+
public async Task<QueryResult<IList<MessagesView>>> GetMessages(bool includeSystemMessages, PagingInfo pagingInfo, SortInfo sortInfo, DateTimeRange timeSentRange, CancellationToken cancellationToken)
4646
{
4747
var matched = messageViews
4848
.Where(w => !w.IsSystemMessage || includeSystemMessages)
@@ -51,7 +51,7 @@ public async Task<QueryResult<IList<MessagesView>>> GetMessages(bool includeSyst
5151
return await Task.FromResult(new QueryResult<IList<MessagesView>>(matched, new QueryStatsInfo(string.Empty, matched.Count)));
5252
}
5353

54-
public async Task<QueryResult<IList<MessagesView>>> QueryMessages(string keyword, PagingInfo pagingInfo, SortInfo sortInfo, CancellationToken cancellationToken)
54+
public async Task<QueryResult<IList<MessagesView>>> QueryMessages(string keyword, PagingInfo pagingInfo, SortInfo sortInfo, DateTimeRange timeSentRange, CancellationToken cancellationToken)
5555
{
5656
var messages = GetMessageIdsMatchingQuery(keyword);
5757

@@ -61,15 +61,15 @@ public async Task<QueryResult<IList<MessagesView>>> QueryMessages(string keyword
6161
return await Task.FromResult(new QueryResult<IList<MessagesView>>(matched, new QueryStatsInfo(string.Empty, matched.Count())));
6262
}
6363

64-
public async Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndpointAndKeyword(string endpoint, string keyword, PagingInfo pagingInfo, SortInfo sortInfo, CancellationToken cancellationToken)
64+
public async Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndpointAndKeyword(string endpoint, string keyword, PagingInfo pagingInfo, SortInfo sortInfo, DateTimeRange timeSentRange, CancellationToken cancellationToken)
6565
{
6666
var messages = GetMessageIdsMatchingQuery(keyword);
6767

6868
var matched = messageViews.Where(w => w.ReceivingEndpoint.Name == endpoint && messages.Contains(w.MessageId)).ToList();
6969
return await Task.FromResult(new QueryResult<IList<MessagesView>>(matched, new QueryStatsInfo(string.Empty, matched.Count)));
7070
}
7171

72-
public async Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndpoint(bool includeSystemMessages, string endpointName, PagingInfo pagingInfo, SortInfo sortInfo, CancellationToken cancellationToken)
72+
public async Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndpoint(bool includeSystemMessages, string endpointName, PagingInfo pagingInfo, SortInfo sortInfo, DateTimeRange timeSentRange, CancellationToken cancellationToken)
7373
{
7474
var matched = messageViews.Where(w => w.ReceivingEndpoint.Name == endpointName).ToList();
7575
return await Task.FromResult(new QueryResult<IList<MessagesView>>(matched, new QueryStatsInfo(string.Empty, matched.Count)));

src/ServiceControl.Audit.Persistence.RavenDB/Extensions/RavenQueryExtensions.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,26 @@ static class RavenQueryExtensions
1919
return source;
2020
}
2121

22+
public static IQueryable<MessagesViewIndex.SortAndFilterOptions> FilterBySentTimeRange(this IQueryable<MessagesViewIndex.SortAndFilterOptions> source, DateTimeRange range)
23+
{
24+
if (range == null)
25+
{
26+
return source;
27+
}
28+
29+
if (range.From.HasValue)
30+
{
31+
source = source.Where(m => m.TimeSent >= range.From);
32+
}
33+
34+
if (range.To.HasValue)
35+
{
36+
source = source.Where(m => m.TimeSent <= range.To);
37+
}
38+
39+
return source;
40+
}
41+
2242
public static IQueryable<TSource> Paging<TSource>(this IQueryable<TSource> source, PagingInfo pagingInfo)
2343
=> source.Skip(pagingInfo.Offset).Take(pagingInfo.PageSize);
2444

src/ServiceControl.Audit.Persistence.RavenDB/RavenAuditDataStore.cs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,12 @@ public async Task<QueryResult<SagaHistory>> QuerySagaHistoryById(Guid input, Can
3131
return sagaHistory == null ? QueryResult<SagaHistory>.Empty() : new QueryResult<SagaHistory>(sagaHistory, new QueryStatsInfo($"{stats.ResultEtag}", stats.TotalResults));
3232
}
3333

34-
public async Task<QueryResult<IList<MessagesView>>> GetMessages(bool includeSystemMessages, PagingInfo pagingInfo, SortInfo sortInfo, CancellationToken cancellationToken)
34+
public async Task<QueryResult<IList<MessagesView>>> GetMessages(bool includeSystemMessages, PagingInfo pagingInfo, SortInfo sortInfo, DateTimeRange timeSentRange, CancellationToken cancellationToken)
3535
{
3636
using var session = await sessionProvider.OpenSession(cancellationToken: cancellationToken);
3737
var results = await session.Query<MessagesViewIndex.SortAndFilterOptions>(GetIndexName(isFullTextSearchEnabled))
3838
.Statistics(out var stats)
39+
.FilterBySentTimeRange(timeSentRange)
3940
.IncludeSystemMessagesWhere(includeSystemMessages)
4041
.Sort(sortInfo)
4142
.Paging(pagingInfo)
@@ -45,12 +46,13 @@ public async Task<QueryResult<IList<MessagesView>>> GetMessages(bool includeSyst
4546
return new QueryResult<IList<MessagesView>>(results, stats.ToQueryStatsInfo());
4647
}
4748

48-
public async Task<QueryResult<IList<MessagesView>>> QueryMessages(string searchParam, PagingInfo pagingInfo, SortInfo sortInfo, CancellationToken cancellationToken)
49+
public async Task<QueryResult<IList<MessagesView>>> QueryMessages(string searchParam, PagingInfo pagingInfo, SortInfo sortInfo, DateTimeRange timeSentRange, CancellationToken cancellationToken)
4950
{
5051
using var session = await sessionProvider.OpenSession(cancellationToken: cancellationToken);
5152
var results = await session.Query<MessagesViewIndex.SortAndFilterOptions>(GetIndexName(isFullTextSearchEnabled))
5253
.Statistics(out var stats)
5354
.Search(x => x.Query, searchParam)
55+
.FilterBySentTimeRange(timeSentRange)
5456
.Sort(sortInfo)
5557
.Paging(pagingInfo)
5658
.ToMessagesView()
@@ -59,13 +61,14 @@ public async Task<QueryResult<IList<MessagesView>>> QueryMessages(string searchP
5961
return new QueryResult<IList<MessagesView>>(results, stats.ToQueryStatsInfo());
6062
}
6163

62-
public async Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndpointAndKeyword(string endpoint, string keyword, PagingInfo pagingInfo, SortInfo sortInfo, CancellationToken cancellationToken)
64+
public async Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndpointAndKeyword(string endpoint, string keyword, PagingInfo pagingInfo, SortInfo sortInfo, DateTimeRange timeSentRange, CancellationToken cancellationToken)
6365
{
6466
using var session = await sessionProvider.OpenSession(cancellationToken: cancellationToken);
6567
var results = await session.Query<MessagesViewIndex.SortAndFilterOptions>(GetIndexName(isFullTextSearchEnabled))
6668
.Statistics(out var stats)
6769
.Search(x => x.Query, keyword)
6870
.Where(m => m.ReceivingEndpointName == endpoint)
71+
.FilterBySentTimeRange(timeSentRange)
6972
.Sort(sortInfo)
7073
.Paging(pagingInfo)
7174
.ToMessagesView()
@@ -74,13 +77,14 @@ public async Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndp
7477
return new QueryResult<IList<MessagesView>>(results, stats.ToQueryStatsInfo());
7578
}
7679

77-
public async Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndpoint(bool includeSystemMessages, string endpointName, PagingInfo pagingInfo, SortInfo sortInfo, CancellationToken cancellationToken)
80+
public async Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndpoint(bool includeSystemMessages, string endpointName, PagingInfo pagingInfo, SortInfo sortInfo, DateTimeRange timeSentRange, CancellationToken cancellationToken)
7881
{
7982
using var session = await sessionProvider.OpenSession(cancellationToken: cancellationToken);
8083
var results = await session.Query<MessagesViewIndex.SortAndFilterOptions>(GetIndexName(isFullTextSearchEnabled))
8184
.Statistics(out var stats)
8285
.IncludeSystemMessagesWhere(includeSystemMessages)
8386
.Where(m => m.ReceivingEndpointName == endpointName)
87+
.FilterBySentTimeRange(timeSentRange)
8488
.Sort(sortInfo)
8589
.Paging(pagingInfo)
8690
.ToMessagesView()

src/ServiceControl.Audit.Persistence.Tests.RavenDB/RetentionTests.cs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,13 @@ public async Task AuditMessageRetention()
2828
{
2929
var message = MakeMessage("MyMessageId");
3030

31-
await IngestProcessedMessagesAudits(
32-
message
33-
);
31+
await IngestProcessedMessagesAudits(message);
3432

35-
var queryResultBeforeExpiration = await DataStore.QueryMessages("MyMessageId", new PagingInfo(), new SortInfo("Id", "asc"), TestContext.CurrentContext.CancellationToken);
33+
var queryResultBeforeExpiration = await DataStore.QueryMessages("MyMessageId", new PagingInfo(), new SortInfo("Id", "asc"), cancellationToken: TestContext.CurrentContext.CancellationToken);
3634

3735
await Task.Delay(4000);
3836

39-
var queryResultAfterExpiration = await DataStore.QueryMessages("MyMessageId", new PagingInfo(), new SortInfo("Id", "asc"), TestContext.CurrentContext.CancellationToken);
37+
var queryResultAfterExpiration = await DataStore.QueryMessages("MyMessageId", new PagingInfo(), new SortInfo("Id", "asc"), cancellationToken: TestContext.CurrentContext.CancellationToken);
4038

4139
Assert.That(queryResultBeforeExpiration.Results, Has.Count.EqualTo(1));
4240
Assert.Multiple(() =>

src/ServiceControl.Audit.Persistence.Tests/AuditTests.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ await IngestProcessedMessagesAudits(
3030
message
3131
);
3232

33-
var queryResult = await DataStore.QueryMessages("MyMessageId", new PagingInfo(), new SortInfo("Id", "asc"), TestContext.CurrentContext.CancellationToken);
33+
var queryResult = await DataStore.QueryMessages("MyMessageId", new PagingInfo(), new SortInfo("Id", "asc"), cancellationToken: TestContext.CurrentContext.CancellationToken);
3434

3535
Assert.That(queryResult.Results, Has.Count.EqualTo(1));
3636
Assert.That(queryResult.Results[0].MessageId, Is.EqualTo("MyMessageId"));
@@ -40,7 +40,7 @@ await IngestProcessedMessagesAudits(
4040
public async Task Handles_no_results_gracefully()
4141
{
4242
var nonExistingMessage = Guid.NewGuid().ToString();
43-
var queryResult = await DataStore.QueryMessages(nonExistingMessage, new PagingInfo(), new SortInfo("Id", "asc"), TestContext.CurrentContext.CancellationToken);
43+
var queryResult = await DataStore.QueryMessages(nonExistingMessage, new PagingInfo(), new SortInfo("Id", "asc"), cancellationToken: TestContext.CurrentContext.CancellationToken);
4444

4545
Assert.That(queryResult.Results, Is.Empty);
4646
}
@@ -73,7 +73,7 @@ await IngestProcessedMessagesAudits(
7373
);
7474

7575
var queryResult = await DataStore.QueryMessages("MyMessageType", new PagingInfo(),
76-
new SortInfo("message_id", "asc"), TestContext.CurrentContext.CancellationToken);
76+
new SortInfo("message_id", "asc"), cancellationToken: TestContext.CurrentContext.CancellationToken);
7777

7878
Assert.That(queryResult.Results, Has.Count.EqualTo(2));
7979
}
@@ -158,7 +158,7 @@ public async Task Deduplicates_messages_in_same_batch()
158158

159159
await configuration.CompleteDBOperation();
160160

161-
var queryResult = await DataStore.GetMessages(false, new PagingInfo(), new SortInfo("message_id", "asc"), TestContext.CurrentContext.CancellationToken);
161+
var queryResult = await DataStore.GetMessages(false, new PagingInfo(), new SortInfo("message_id", "asc"), cancellationToken: TestContext.CurrentContext.CancellationToken);
162162

163163
Assert.That(queryResult.QueryStats.TotalCount, Is.EqualTo(1));
164164
}
@@ -182,7 +182,7 @@ public async Task Deduplicates_messages_in_different_batches()
182182

183183
await configuration.CompleteDBOperation();
184184

185-
var queryResult = await DataStore.GetMessages(false, new PagingInfo(), new SortInfo("message_id", "asc"), TestContext.CurrentContext.CancellationToken);
185+
var queryResult = await DataStore.GetMessages(false, new PagingInfo(), new SortInfo("message_id", "asc"), cancellationToken: TestContext.CurrentContext.CancellationToken);
186186

187187
Assert.That(queryResult.QueryStats.TotalCount, Is.EqualTo(1));
188188
}
@@ -205,7 +205,7 @@ public async Task Does_not_deduplicate_with_different_processing_started_header(
205205

206206
await configuration.CompleteDBOperation();
207207

208-
var queryResult = await DataStore.GetMessages(false, new PagingInfo(), new SortInfo("message_id", "asc"), TestContext.CurrentContext.CancellationToken);
208+
var queryResult = await DataStore.GetMessages(false, new PagingInfo(), new SortInfo("message_id", "asc"), cancellationToken: TestContext.CurrentContext.CancellationToken);
209209

210210
Assert.That(queryResult.QueryStats.TotalCount, Is.EqualTo(2));
211211
}

src/ServiceControl.Audit.Persistence/IAuditDataStore.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ public interface IAuditDataStore
1414
{
1515
Task<QueryResult<IList<KnownEndpointsView>>> QueryKnownEndpoints(CancellationToken cancellationToken);
1616
Task<QueryResult<SagaHistory>> QuerySagaHistoryById(Guid input, CancellationToken cancellationToken);
17-
Task<QueryResult<IList<MessagesView>>> GetMessages(bool includeSystemMessages, PagingInfo pagingInfo, SortInfo sortInfo, CancellationToken cancellationToken);
18-
Task<QueryResult<IList<MessagesView>>> QueryMessages(string searchParam, PagingInfo pagingInfo, SortInfo sortInfo, CancellationToken cancellationToken);
19-
Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndpointAndKeyword(string endpoint, string keyword, PagingInfo pagingInfo, SortInfo sortInfo, CancellationToken cancellationToken);
20-
Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndpoint(bool includeSystemMessages, string endpointName, PagingInfo pagingInfo, SortInfo sortInfo, CancellationToken cancellationToken);
17+
Task<QueryResult<IList<MessagesView>>> GetMessages(bool includeSystemMessages, PagingInfo pagingInfo, SortInfo sortInfo, DateTimeRange timeSentRange = null, CancellationToken cancellationToken = default);
18+
Task<QueryResult<IList<MessagesView>>> QueryMessages(string searchParam, PagingInfo pagingInfo, SortInfo sortInfo, DateTimeRange timeSentRange = null, CancellationToken cancellationToken = default);
19+
Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndpointAndKeyword(string endpoint, string keyword, PagingInfo pagingInfo, SortInfo sortInfo, DateTimeRange timeSentRange = null, CancellationToken cancellationToken = default);
20+
Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndpoint(bool includeSystemMessages, string endpointName, PagingInfo pagingInfo, SortInfo sortInfo, DateTimeRange timeSentRange = null, CancellationToken cancellationToken = default);
2121
Task<QueryResult<IList<MessagesView>>> QueryMessagesByConversationId(string conversationId, PagingInfo pagingInfo, SortInfo sortInfo, CancellationToken cancellationToken);
2222
Task<MessageBodyView> GetMessageBody(string messageId, CancellationToken cancellationToken);
2323
Task<QueryResult<IList<AuditCount>>> QueryAuditCounts(string endpointName, CancellationToken cancellationToken);
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
namespace ServiceControl.Audit.Infrastructure;
2+
3+
using System;
4+
using System.Globalization;
5+
6+
public class DateTimeRange
7+
{
8+
public DateTime? From { get; }
9+
public DateTime? To { get; }
10+
11+
public DateTimeRange(string from = null, string to = null)
12+
{
13+
if (from != null)
14+
{
15+
From = DateTime.Parse(from, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
16+
}
17+
if (to != null)
18+
{
19+
To = DateTime.Parse(to, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
20+
}
21+
}
22+
23+
public DateTimeRange(DateTime? from = null, DateTime? to = null)
24+
{
25+
From = from;
26+
To = to;
27+
}
28+
}

src/ServiceControl.Audit.UnitTests/ApprovalFiles/APIApprovals.HttpApiRoutes.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,5 @@ GET /messages => ServiceControl.Audit.Auditing.MessagesView.GetMessagesControlle
1212
GET /messages/{id}/body => ServiceControl.Audit.Auditing.MessagesView.GetMessagesController:Get(String id, CancellationToken cancellationToken)
1313
GET /messages/search => ServiceControl.Audit.Auditing.MessagesView.GetMessagesController:Search(PagingInfo pagingInfo, SortInfo sortInfo, String q, CancellationToken cancellationToken)
1414
GET /messages/search/{keyword} => ServiceControl.Audit.Auditing.MessagesView.GetMessagesController:SearchByKeyWord(PagingInfo pagingInfo, SortInfo sortInfo, String keyword, CancellationToken cancellationToken)
15+
GET /messages2 => ServiceControl.Audit.Auditing.MessagesView.GetMessages2Controller:GetAllMessages(SortInfo sortInfo, Int32 pageSize, String endpointName, String from, String to, String q, CancellationToken cancellationToken)
1516
GET /sagas/{id} => ServiceControl.Audit.SagaAudit.SagasController:Sagas(PagingInfo pagingInfo, Guid id, CancellationToken cancellationToken)
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
namespace ServiceControl.Audit.Auditing.MessagesView;
2+
3+
using System.Collections.Generic;
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
using Infrastructure;
7+
using Infrastructure.WebApi;
8+
using Microsoft.AspNetCore.Mvc;
9+
using Persistence;
10+
11+
[ApiController]
12+
[Route("api")]
13+
public class GetMessages2Controller(IAuditDataStore dataStore) : ControllerBase
14+
{
15+
[Route("messages2")]
16+
[HttpGet]
17+
public async Task<IList<MessagesView>> GetAllMessages(
18+
[FromQuery] SortInfo sortInfo,
19+
[FromQuery(Name = "page_size")] int pageSize,
20+
[FromQuery(Name = "endpoint_name")] string endpointName,
21+
[FromQuery(Name = "from")] string from,
22+
[FromQuery(Name = "to")] string to,
23+
string q,
24+
CancellationToken cancellationToken)
25+
{
26+
QueryResult<IList<MessagesView>> result;
27+
var pagingInfo = new PagingInfo(pageSize: pageSize);
28+
if (string.IsNullOrWhiteSpace(endpointName))
29+
{
30+
if (string.IsNullOrWhiteSpace(q))
31+
{
32+
result = await dataStore.GetMessages(false, pagingInfo, sortInfo, new DateTimeRange(from, to), cancellationToken);
33+
}
34+
else
35+
{
36+
result = await dataStore.QueryMessages(q, pagingInfo, sortInfo, new DateTimeRange(from, to), cancellationToken);
37+
}
38+
}
39+
else
40+
{
41+
if (string.IsNullOrWhiteSpace(q))
42+
{
43+
result = await dataStore.QueryMessagesByReceivingEndpoint(false, endpointName, pagingInfo, sortInfo,
44+
new DateTimeRange(from, to), cancellationToken);
45+
}
46+
else
47+
{
48+
result = await dataStore.QueryMessagesByReceivingEndpointAndKeyword(endpointName, q, pagingInfo,
49+
sortInfo, new DateTimeRange(from, to), cancellationToken);
50+
}
51+
}
52+
53+
Response.WithTotalCount(result.QueryStats.TotalCount);
54+
55+
return result.Results;
56+
}
57+
}

0 commit comments

Comments
 (0)