Refactor Rec Actions handling with MediatR support

Refactored the handling of "Rec Actions" by introducing the `InvokeRecActionCommandHandler` class and leveraging the MediatR library for command handling. Simplified the logic in `InvokeBatchRecActionsCommand.cs` by delegating HTTP request handling to the `sender.Send` method, which now uses `InvokeRecActionCommand`.

Updated `InvokeRecActionCommand` to implement the `IRequest` interface, enabling MediatR pipeline compatibility. Added `InvokeRecActionCommandExtensions` for converting `RecActionDto` to `InvokeRecActionCommand`, improving readability.

Centralized HTTP request logic in the new `InvokeRecActionCommandHandler`, which validates `RestType`, sends HTTP requests, and logs warnings for invalid actions. Removed unused `using` directives and added necessary ones for MediatR and logging.

This refactoring improves modularity, testability, and maintainability by separating concerns and streamlining the code structure.
This commit is contained in:
tekh 2025-11-27 11:26:46 +01:00
parent d1e8f619f5
commit 2f3a685e7d
2 changed files with 34 additions and 22 deletions

View File

@ -27,22 +27,7 @@ public class InvokeRecActionsCommandHandler(ISender sender, IHttpClientFactory c
await semaphore.WaitAsync(cancel);
try
{
if (action.RestType is null)
{
logger?.LogWarning(
"Rec action could not be invoked because the RestType value is null. ProfileId: {ProfileId}, ActionId: {ActionId}",
action.ProfileId,
action.ActionId
);
return;
}
var method = new HttpMethod(action.RestType.ToUpper());
var msg = new HttpRequestMessage(method, action.EndpointUri);
var response = await http.SendAsync(msg, cancel);
var body = await response.Content.ReadAsStringAsync(cancel);
var headers = response.Headers.ToDictionary();
await sender.Send(action.ToInvokeCommand(), cancel);
}
catch(Exception ex)
{

View File

@ -1,13 +1,12 @@
using ReC.Application.Common.Dto;
using MediatR;
using Microsoft.Extensions.Logging;
using ReC.Application.Common.Dto;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static System.Net.WebRequestMethods;
namespace ReC.Application.RecActions.Commands;
public record InvokeRecActionCommand : RecActionDto
public record InvokeRecActionCommand : RecActionDto, IRequest
{
public InvokeRecActionCommand(RecActionDto root) : base(root) { }
@ -18,3 +17,31 @@ public static class InvokeRecActionCommandExtensions
{
public static InvokeRecActionCommand ToInvokeCommand(this RecActionDto dto) => new(dto);
}
public class InvokeRecActionCommandHandler(
IHttpClientFactory clientFactory,
ILogger<InvokeRecActionsCommandHandler>? logger = null
) : IRequestHandler<InvokeRecActionCommand>
{
public async Task Handle(InvokeRecActionCommand request, CancellationToken cancel)
{
var http = clientFactory.CreateClient();
if (request.RestType is null)
{
logger?.LogWarning(
"Rec action could not be invoked because the RestType value is null. ProfileId: {ProfileId}, ActionId: {ActionId}",
request.ProfileId,
request.ActionId
);
return;
}
var method = new HttpMethod(request.RestType.ToUpper());
var msg = new HttpRequestMessage(method, request.EndpointUri);
var response = await http.SendAsync(msg, cancel);
var body = await response.Content.ReadAsStringAsync(cancel);
var headers = response.Headers.ToDictionary();
}
}