Skip to content

Commit 6a89b62

Browse files
committed
Adding time sent range api
Also fixed a bug where the results could return more than the page size
1 parent 7b208cd commit 6a89b62

File tree

19 files changed

+267
-54
lines changed

19 files changed

+267
-54
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, string 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, string 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, string 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, string 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: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
namespace ServiceControl.Audit.Persistence.RavenDB.Extensions
22
{
33
using System;
4+
using System.Globalization;
45
using System.Linq;
56
using System.Linq.Expressions;
67
using Indexes;
@@ -19,6 +20,45 @@ static class RavenQueryExtensions
1920
return source;
2021
}
2122

23+
public static IQueryable<MessagesViewIndex.SortAndFilterOptions> FilterBySentTimeRange(this IQueryable<MessagesViewIndex.SortAndFilterOptions> source, string range)
24+
{
25+
if (string.IsNullOrWhiteSpace(range))
26+
{
27+
return source;
28+
}
29+
30+
var filters = range.Split(SplitChars, StringSplitOptions.None);
31+
DateTime from, to;
32+
try
33+
{
34+
35+
if (filters.Length == 2)
36+
{
37+
from = DateTime.Parse(filters[0], CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
38+
to = DateTime.Parse(filters[1], CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
39+
source.Where(m => m.TimeSent >= from && m.TimeSent <= to);
40+
41+
}
42+
else
43+
{
44+
from = DateTime.Parse(filters[0], CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind);
45+
source.Where(m => m.TimeSent >= from);
46+
}
47+
}
48+
catch (Exception)
49+
{
50+
throw new Exception(
51+
"Invalid sent time date range, dates need to be in ISO8601 format and it needs to be a range eg. 2016-03-11T00:27:15.474Z...2016-03-16T03:27:15.474Z");
52+
}
53+
54+
return source;
55+
}
56+
57+
static string[] SplitChars =
58+
{
59+
"..."
60+
};
61+
2262
public static IQueryable<TSource> Paging<TSource>(this IQueryable<TSource> source, PagingInfo pagingInfo)
2363
=> source.Skip(pagingInfo.Offset).Take(pagingInfo.PageSize);
2464

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, string 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, string 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, string 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, string 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: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,11 @@ await IngestProcessedMessagesAudits(
3232
message
3333
);
3434

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

3737
await Task.Delay(4000);
3838

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

4141
Assert.That(queryResultBeforeExpiration.Results, Has.Count.EqualTo(1));
4242
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"), null, 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"), null, 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"), null, 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"), null, 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"), null, 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"), null, 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, string timeSentRange, CancellationToken cancellationToken);
18+
Task<QueryResult<IList<MessagesView>>> QueryMessages(string searchParam, PagingInfo pagingInfo, SortInfo sortInfo, string timeSentRange, CancellationToken cancellationToken);
19+
Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndpointAndKeyword(string endpoint, string keyword, PagingInfo pagingInfo, SortInfo sortInfo, string timeSentRange, CancellationToken cancellationToken);
20+
Task<QueryResult<IList<MessagesView>>> QueryMessagesByReceivingEndpoint(bool includeSystemMessages, string endpointName, PagingInfo pagingInfo, SortInfo sortInfo, string timeSentRange, CancellationToken cancellationToken);
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: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
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 = "range")] string range,
22+
string q,
23+
CancellationToken cancellationToken)
24+
{
25+
QueryResult<IList<MessagesView>> result;
26+
var pagingInfo = new PagingInfo(pageSize: pageSize);
27+
if (string.IsNullOrWhiteSpace(endpointName))
28+
{
29+
if (string.IsNullOrWhiteSpace(q))
30+
{
31+
result = await dataStore.GetMessages(false, pagingInfo, sortInfo, range, cancellationToken);
32+
}
33+
else
34+
{
35+
result = await dataStore.QueryMessages(q, pagingInfo, sortInfo, range, cancellationToken);
36+
}
37+
}
38+
else
39+
{
40+
if (string.IsNullOrWhiteSpace(q))
41+
{
42+
result = await dataStore.QueryMessagesByReceivingEndpoint(false, endpointName, pagingInfo, sortInfo,
43+
range, cancellationToken);
44+
}
45+
else
46+
{
47+
result = await dataStore.QueryMessagesByReceivingEndpointAndKeyword(endpointName, q, pagingInfo,
48+
sortInfo, range, cancellationToken);
49+
}
50+
}
51+
52+
Response.WithTotalCount(result.QueryStats.TotalCount);
53+
54+
return result.Results;
55+
}
56+
}

0 commit comments

Comments
 (0)