-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDiagnoseBatchCommandHandler.cs
More file actions
49 lines (41 loc) · 2.01 KB
/
DiagnoseBatchCommandHandler.cs
File metadata and controls
49 lines (41 loc) · 2.01 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
using Ardalis.Result;
using Mediator;
using ServiceBusToolset.Application.DeadLetters.DiagnoseDlq.Common.AppInsights;
using ServiceBusToolset.Application.DeadLetters.DiagnoseDlq.Models;
namespace ServiceBusToolset.Application.DeadLetters.DiagnoseDlq;
public sealed class DiagnoseBatchCommandHandler(IAppInsightsService appInsightsService)
: ICommandHandler<DiagnoseBatchCommand, Result<IReadOnlyList<DiagnosticResult>>>
{
public async ValueTask<Result<IReadOnlyList<DiagnosticResult>>> Handle(
DiagnoseBatchCommand command,
CancellationToken cancellationToken)
{
if (command.Operations.Count == 0)
{
return Result.Success<IReadOnlyList<DiagnosticResult>>([]);
}
appInsightsService.Initialize(command.AppInsightsResourceId);
var operations = command.Operations
.Select(op => (op.OperationId, op.EnqueuedTime))
.ToList();
var diagnosticResults = await appInsightsService.DiagnoseBatchAsync(operations,
null,
cancellationToken);
var results = new List<DiagnosticResult>();
// Deduplicate by OperationId — take the first occurrence if duplicates exist
var operationsById = command.Operations
.DistinctBy(op => op.OperationId)
.ToDictionary(op => op.OperationId);
foreach (var (operationId, result) in diagnosticResults)
{
if (operationsById.TryGetValue(operationId, out var operation))
{
result.MessageId = operation.MessageId;
result.Subject = operation.Subject;
result.DeadLetterReason = operation.DeadLetterReason;
results.Add(result);
}
}
return Result.Success<IReadOnlyList<DiagnosticResult>>(results);
}
}