diff --git a/src/modules/Elsa.MassTransit/Activities/PublishMessage.cs b/src/modules/Elsa.MassTransit/Activities/PublishMessage.cs index e5972aa46..1802f3bd8 100644 --- a/src/modules/Elsa.MassTransit/Activities/PublishMessage.cs +++ b/src/modules/Elsa.MassTransit/Activities/PublishMessage.cs @@ -6,6 +6,7 @@ using Elsa.MassTransit.Implementations; using Elsa.Workflows; using Elsa.Workflows.Attributes; using Elsa.Workflows.Models; +using Elsa.Workflows.UIHints; using MassTransit; namespace Elsa.MassTransit.Activities; @@ -29,7 +30,10 @@ public class PublishMessage : CodeActivity /// /// The message to send. Must be a concrete implementation of the configured . /// - [Input(Description = "The message to send. Must be a concrete implementation of the configured message type.")] + [Input( + Description = "The message to send. Must be a concrete implementation of the configured message type.", + UIHint = InputUIHints.MultiLine + )] public Input Message { get; set; } = default!; /// diff --git a/src/modules/Elsa.MassTransit/Implementations/MassTransitActivityTypeProvider.cs b/src/modules/Elsa.MassTransit/Implementations/MassTransitActivityTypeProvider.cs index 75d9b32a6..e2dabe143 100644 --- a/src/modules/Elsa.MassTransit/Implementations/MassTransitActivityTypeProvider.cs +++ b/src/modules/Elsa.MassTransit/Implementations/MassTransitActivityTypeProvider.cs @@ -6,8 +6,8 @@ using Elsa.MassTransit.Options; using Elsa.Workflows; using Elsa.Workflows.Attributes; using Elsa.Workflows.Contracts; -using Elsa.Workflows.UIHints; using Elsa.Workflows.Helpers; +using Elsa.Workflows.Management; using Elsa.Workflows.Models; using Humanizer; using Microsoft.Extensions.Options; @@ -17,40 +17,31 @@ namespace Elsa.MassTransit.Implementations; /// /// Provides activities to the system from the configured MassTransit message types. /// -public class MassTransitActivityTypeProvider : IActivityProvider +public class MassTransitActivityTypeProvider(IActivityFactory activityFactory, IOptions options, IActivityDescriber activityDescriber) : IActivityProvider { - private readonly IActivityFactory _activityFactory; - private readonly MassTransitActivityOptions _options; - - /// - /// Constructor. - /// - public MassTransitActivityTypeProvider(IActivityFactory activityFactory, IOptions options) - { - _activityFactory = activityFactory; - _options = options.Value; - } - /// - public ValueTask> GetDescriptorsAsync(CancellationToken cancellationToken = default) + public async ValueTask> GetDescriptorsAsync(CancellationToken cancellationToken = default) { - var messageTypes = _options.MessageTypes; - var descriptors = CreateDescriptors(messageTypes).ToList(); - return new(descriptors); + var messageTypes = options.Value.MessageTypes; + var descriptors = await CreateDescriptorsAsync(messageTypes, cancellationToken); + return descriptors.ToList(); } - private IEnumerable CreateDescriptors(IEnumerable messageTypes) + private async Task> CreateDescriptorsAsync(IEnumerable messageTypes, CancellationToken cancellationToken = default) { + var descriptors = new List(); foreach (var messageType in messageTypes) { - yield return CreateMessageReceivedDescriptor(messageType); + descriptors.Add(await CreateMessageReceivedDescriptor(messageType, cancellationToken)); if(messageType.IsClass) - yield return CreatePublishMessageDescriptor(messageType); + descriptors.Add(await CreatePublishMessageDescriptor(messageType, cancellationToken)); } + + return descriptors; } - private ActivityDescriptor CreateMessageReceivedDescriptor(Type messageType) + private async Task CreateMessageReceivedDescriptor(Type messageType, CancellationToken cancellationToken = default) { var activityAttr = messageType.GetCustomAttribute(); var typeName = activityAttr?.Type ?? messageType.Name; @@ -61,6 +52,11 @@ public class MassTransitActivityTypeProvider : IActivityProvider var category = categoryAttr?.Category ?? activityAttr?.Category ?? "MassTransit"; var descriptionAttr = messageType.GetCustomAttribute(); var description = descriptionAttr?.Description ?? activityAttr?.Description; + + var outputDescriptor = await activityDescriber.DescribeOutputProperty(x => x.Result!, cancellationToken); + var openOutputType = typeof(Output<>); + var outputType = openOutputType.MakeGenericType(messageType); + outputDescriptor.Type = outputType; return new() { @@ -73,17 +69,11 @@ public class MassTransitActivityTypeProvider : IActivityProvider IsBrowsable = true, Outputs = { - new OutputDescriptor - { - Description = "The received message", - DisplayName = "Received Message", - Name = nameof(MessageReceived.Result), - Type = typeof(object) - } + outputDescriptor }, Constructor = context => { - var activity = _activityFactory.Create(context); + var activity = activityFactory.Create(context); activity.Type = fullTypeName; activity.MessageType = messageType; return activity; @@ -91,7 +81,7 @@ public class MassTransitActivityTypeProvider : IActivityProvider }; } - private ActivityDescriptor CreatePublishMessageDescriptor(Type messageType) + private async Task CreatePublishMessageDescriptor(Type messageType, CancellationToken cancellationToken = default) { var activityAttr = messageType.GetCustomAttribute(); var typeName = activityAttr?.Type ?? messageType.Name; @@ -104,6 +94,11 @@ public class MassTransitActivityTypeProvider : IActivityProvider var descriptionAttr = messageType.GetCustomAttribute(); var description = descriptionAttr?.Description ?? activityAttr?.Description; + var messageInputDescriptor = await activityDescriber.DescribeInputPropertyAsync(x => x.Message, cancellationToken: cancellationToken); + var openInputType = typeof(Input<>); + var inputType = openInputType.MakeGenericType(messageType); + messageInputDescriptor.Type = inputType; + return new() { TypeName = fullTypeName, @@ -115,18 +110,11 @@ public class MassTransitActivityTypeProvider : IActivityProvider IsBrowsable = true, Inputs = { - new InputDescriptor - { - Description = "The message to publish.", - UIHint = InputUIHints.MultiLine, - DisplayName = "Message", - Type = typeof(Input), - Name = nameof(PublishMessage.Message) - } + messageInputDescriptor }, Constructor = context => { - var activity = _activityFactory.Create(context); + var activity = activityFactory.Create(context); activity.Type = fullTypeName; activity.MessageType = messageType; return activity;