ReC/src/ReC.Application/RecActions/Commands/InvokeRecActionCommand.cs
TekH 9c028c5e66 Make ActionId a required field across DTOs and entities
Updated the `RecActionDto`, `RecAction`, and `InvokeRecActionCommandHandler` to enforce `ActionId` as a required field. This change improves data integrity by removing nullable `ActionId` properties and eliminates the need for null checks or null-forgiveness operators.
2025-12-01 12:27:47 +01:00

70 lines
2.2 KiB
C#

using MediatR;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using ReC.Application.Common;
using ReC.Application.Common.Dto;
using ReC.Application.OutResults.Commands;
using System.Text.Json;
namespace ReC.Application.RecActions.Commands;
public record InvokeRecActionCommand : RecActionDto, IRequest
{
public InvokeRecActionCommand(RecActionDto root) : base(root) { }
public InvokeRecActionCommand() { }
}
public static class InvokeRecActionCommandExtensions
{
public static InvokeRecActionCommand ToInvokeCommand(this RecActionDto dto) => new(dto);
}
public class InvokeRecActionCommandHandler(
ISender sender,
IHttpClientFactory clientFactory,
IConfiguration? config = null,
ILogger<InvokeRecActionsCommandHandler>? logger = null
) : IRequestHandler<InvokeRecActionCommand>
{
public async Task Handle(InvokeRecActionCommand request, CancellationToken cancel)
{
using 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;
}
using var httpReq = request.RestType
.ToHttpMethod()
.ToHttpRequestMessage(request.EndpointUri);
if(request.Body is not null)
{
using var reqBody = new StringContent(request.Body);
httpReq.Content = reqBody;
}
if (request.Headers is not null)
foreach (var header in request.Headers)
httpReq.Headers.Add(header.Key, header.Value);
using var response = await http.SendAsync(httpReq, cancel);
var resBody = await response.Content.ReadAsStringAsync(cancel);
var resHeaders = response.Headers.ToDictionary();
await sender.Send(new CreateOutResCommand
{
ActionId = request.ActionId,
Header = JsonSerializer.Serialize(resHeaders, options: new() { WriteIndented = false }),
Body = resBody,
AddedWho = config?["AddedWho"]
}, cancel);
}
}