using System;
using System.Threading.Tasks;
using F4SD.ActionConnector.Enumerations;
using F4SD.ActionConnector.Models;
using static C4IT.Logging.cLogManager;
namespace F4SD.ActionConnector.Execution
{
///
/// Routes a single action definition to the correct executor based on its .
///
internal sealed class ActionDispatcher
{
private readonly Func> _quickActionExecutor;
internal ActionDispatcher(Func> quickActionExecutor)
{
_quickActionExecutor = quickActionExecutor;
}
internal async Task DispatchAsync(ActionDefinitionBase action, ActionContext context)
{
if (!action.IsEnabled)
return ActionResult.Skip(action.Id);
switch (action.Type)
{
case ActionType.QuickAction:
return await ExecuteQuickActionAsync((QuickActionDefinition)action, context);
case ActionType.HttpCall:
case ActionType.Webhook:
throw new NotImplementedException(
$"ActionType '{action.Type}' is not yet implemented.");
default:
LogEntry($"ActionDispatcher: unknown ActionType '{action.Type}' for action '{action.Id}'.",
C4IT.Logging.LogLevels.Warning);
return ActionResult.Skip(action.Id);
}
}
private async Task ExecuteQuickActionAsync(QuickActionDefinition definition, ActionContext context)
{
if (_quickActionExecutor == null)
throw new InvalidOperationException(
$"A QuickAction ('{definition.Id}') was triggered but no {nameof(Bus.ActionBusOptions.QuickActionExecutor)} was registered.");
var resolvedParameters = PayloadVariableResolver.Resolve(definition.Parameters, context.Payload);
var request = new QuickActionRequest
{
ActionId = definition.Id,
QuickActionRef = definition.QuickActionRef,
Parameters = resolvedParameters,
Context = context,
};
return await _quickActionExecutor(request);
}
}
}