From 967fbddf8b40b9fb67bb55362ee2496c07366e4f Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Mon, 31 May 2021 11:26:24 +0200 Subject: [PATCH] Improve Telnyx JS intellisense --- .../Activities/Webhook.cs | 10 ++- .../NotificationActivityTypeProvider.cs | 62 +++++++++---------- .../Elsa.Activities.Telnyx.csproj | 1 + .../Extensions/SetupExtensions.cs | 2 + .../TelnyxTypeDefinitionProvider.cs | 34 ++++++++++ .../Liquid/ConfigureLiquidEngine.cs | 2 +- .../Liquid/TelnyxClientStateTag.cs | 0 7 files changed, 74 insertions(+), 37 deletions(-) create mode 100644 src/activities/Elsa.Activities.Telnyx/Scripting/JavaScript/TelnyxTypeDefinitionProvider.cs rename src/activities/Elsa.Activities.Telnyx/{ => Scripting}/Liquid/ConfigureLiquidEngine.cs (97%) rename src/activities/Elsa.Activities.Telnyx/{ => Scripting}/Liquid/TelnyxClientStateTag.cs (100%) diff --git a/src/activities/Elsa.Activities.Telnyx/Activities/Webhook.cs b/src/activities/Elsa.Activities.Telnyx/Activities/Webhook.cs index a2c172b82..98251d009 100644 --- a/src/activities/Elsa.Activities.Telnyx/Activities/Webhook.cs +++ b/src/activities/Elsa.Activities.Telnyx/Activities/Webhook.cs @@ -1,5 +1,7 @@ -using Elsa.Activities.Telnyx.Extensions; +using System.ComponentModel; +using Elsa.Activities.Telnyx.Extensions; using Elsa.Activities.Telnyx.Webhooks.Models; +using Elsa.Activities.Telnyx.Webhooks.Payloads.Abstract; using Elsa.Activities.Telnyx.Webhooks.Payloads.Call; using Elsa.ActivityResults; using Elsa.Attributes; @@ -8,9 +10,12 @@ using Elsa.Services.Models; namespace Elsa.Activities.Telnyx.Activities { + [Browsable(false)] + [Trigger(Category = "Telnyx", Outcomes = new[]{ OutcomeNames.Done })] public class Webhook : Activity { [ActivityOutput] public TelnyxWebhook? Model { get; set; } + [ActivityOutput] public Payload? Payload { get; set; } protected override IActivityExecutionResult OnExecute(ActivityExecutionContext context) => context.WorkflowExecutionContext.IsFirstPass ? ExecuteInternal(context) : Suspend(); protected override IActivityExecutionResult OnResume(ActivityExecutionContext context) => ExecuteInternal(context); @@ -32,7 +37,8 @@ namespace Elsa.Activities.Telnyx.Activities } Model = webhookModel; - return Done(webhookModel); + Payload = webhookModel.Data.Payload; + return Done(); } } } \ No newline at end of file diff --git a/src/activities/Elsa.Activities.Telnyx/ActivityTypes/NotificationActivityTypeProvider.cs b/src/activities/Elsa.Activities.Telnyx/ActivityTypes/NotificationActivityTypeProvider.cs index e74add002..a4a7db3c3 100644 --- a/src/activities/Elsa.Activities.Telnyx/ActivityTypes/NotificationActivityTypeProvider.cs +++ b/src/activities/Elsa.Activities.Telnyx/ActivityTypes/NotificationActivityTypeProvider.cs @@ -20,76 +20,70 @@ namespace Elsa.Activities.Telnyx.ActivityTypes { internal class NotificationActivityTypeProvider : IActivityTypeProvider { - private readonly IWebhookFilterService _webhookFilterService; + private readonly IDescribesActivityType _describesActivityType; + private readonly IActivityActivator _activityActivator; - public NotificationActivityTypeProvider(IWebhookFilterService webhookFilterService) + public NotificationActivityTypeProvider(IDescribesActivityType describesActivityType, IActivityActivator activityActivator) { - _webhookFilterService = webhookFilterService; + _describesActivityType = describesActivityType; + _activityActivator = activityActivator; } public const string NotificationAttribute = "TelnyxNotification"; public const string EventTypeAttribute = "EventType"; - public ValueTask> GetActivityTypesAsync(CancellationToken cancellationToken = default) - { - var activityTypes = GetActivityTypes(); - return new ValueTask>(activityTypes); - } - - private IEnumerable GetActivityTypes() + public async ValueTask> GetActivityTypesAsync(CancellationToken cancellationToken = default) { var payloadTypes = GetType().Assembly.GetAllWithBaseClass().Where(x => x.GetCustomAttribute() != null).ToList(); - var activityTypes = payloadTypes.Select(CreateWebhookActivityType).ToList(); + var activityTypes = (await Task.WhenAll(payloadTypes.Select(async x => await CreateWebhookActivityTypeAsync(x, cancellationToken)))).ToList(); // Add variations on the same webhooks. The webhook filters will conditionally select the appropriate one. - activityTypes.Add(CreateWebhookActivityTypeVariation("BridgeCallInitiated", "Bridge Call Initiated", "Triggered when an incoming bridging call was received.")); - activityTypes.Add(CreateWebhookActivityTypeVariation("OriginatorCallHangup", "Originator Call Hangup", "Triggered when an incoming call was hangup by the originator.")); + activityTypes.Add(await CreateWebhookActivityTypeVariationAsync("BridgeCallInitiated", "Bridge Call Initiated", "Triggered when an incoming bridging call was received.", cancellationToken)); + activityTypes.Add(await CreateWebhookActivityTypeVariationAsync("OriginatorCallHangup", "Originator Call Hangup", "Triggered when an incoming call was hangup by the originator.", cancellationToken)); return activityTypes; } - private ActivityType CreateWebhookActivityTypeVariation(string activityType, string displayName, string description) + private async Task CreateWebhookActivityTypeVariationAsync(string activityType, string displayName, string description, CancellationToken cancellationToken) { var hangupWebhookAttribute = typeof(T).GetCustomAttribute()!; - return CreateWebhookActivityType(new WebhookAttribute(hangupWebhookAttribute.EventType, activityType, displayName, description)); + return await CreateWebhookActivityTypeAsync(typeof(T), new WebhookAttribute(hangupWebhookAttribute.EventType, activityType, displayName, description), cancellationToken); } - private static ActivityType CreateWebhookActivityType(Type payloadType) + private async Task CreateWebhookActivityTypeAsync(Type payloadType, CancellationToken cancellationToken) { var webhookAttribute = payloadType.GetCustomAttribute(); if (webhookAttribute == null) throw new InvalidOperationException($"Make sure that the payload type is annotated with the ${nameof(WebhookAttribute)} attribute"); - return CreateWebhookActivityType(webhookAttribute); + return await CreateWebhookActivityTypeAsync(payloadType, webhookAttribute, cancellationToken); } - private static ActivityType CreateWebhookActivityType(WebhookAttribute webhookAttribute) + private async Task CreateWebhookActivityTypeAsync(Type payloadType, WebhookAttribute webhookAttribute, CancellationToken cancellationToken) { - var typeName = webhookAttribute.ActivityType; - var displayName = webhookAttribute.DisplayName; - var description = webhookAttribute.Description; + var descriptor = await _describesActivityType.DescribeAsync(cancellationToken); + + descriptor.Description = webhookAttribute.Description; + descriptor.DisplayName = webhookAttribute.DisplayName; + descriptor.Type = webhookAttribute.ActivityType; + + var outputProperties = descriptor.OutputProperties.Where(x => x.Name != nameof(Webhook.Payload)).ToList(); + outputProperties.Add(new ActivityOutputDescriptor(nameof(Webhook.Payload), payloadType)); + descriptor.OutputProperties = outputProperties.ToArray(); return new ActivityType { - Describe = () => new ActivityDescriptor - { - Category = "Telnyx", - Description = description, - Type = typeName, - Outcomes = new[] { OutcomeNames.Done }, - Traits = ActivityTraits.Trigger, - DisplayName = displayName - }, - Description = description, - DisplayName = displayName, - TypeName = typeName, + Describe = () => descriptor, + Description = descriptor.Description, + DisplayName = descriptor.DisplayName, + TypeName = descriptor.Type, Attributes = new Dictionary { [NotificationAttribute] = true, [EventTypeAttribute] = webhookAttribute.EventType }, - ActivateAsync = _ => new ValueTask(new Webhook()), + ActivateAsync = async context => await _activityActivator.ActivateActivityAsync(context, cancellationToken), CanExecuteAsync = (context, instance) => instance.CanExecuteAsync(context), ExecuteAsync = (context, instance) => instance.ExecuteAsync(context), ResumeAsync = (context, instance) => instance.ResumeAsync(context), diff --git a/src/activities/Elsa.Activities.Telnyx/Elsa.Activities.Telnyx.csproj b/src/activities/Elsa.Activities.Telnyx/Elsa.Activities.Telnyx.csproj index fdc0999bf..3fff42118 100644 --- a/src/activities/Elsa.Activities.Telnyx/Elsa.Activities.Telnyx.csproj +++ b/src/activities/Elsa.Activities.Telnyx/Elsa.Activities.Telnyx.csproj @@ -18,6 +18,7 @@ + diff --git a/src/activities/Elsa.Activities.Telnyx/Extensions/SetupExtensions.cs b/src/activities/Elsa.Activities.Telnyx/Extensions/SetupExtensions.cs index fa772fd00..5660cc601 100644 --- a/src/activities/Elsa.Activities.Telnyx/Extensions/SetupExtensions.cs +++ b/src/activities/Elsa.Activities.Telnyx/Extensions/SetupExtensions.cs @@ -9,6 +9,7 @@ using Elsa.Activities.Telnyx.Bookmarks; using Elsa.Activities.Telnyx.Client.Services; using Elsa.Activities.Telnyx.Liquid; using Elsa.Activities.Telnyx.Options; +using Elsa.Activities.Telnyx.Scripting.JavaScript; using Elsa.Activities.Telnyx.Webhooks.Consumers; using Elsa.Activities.Telnyx.Webhooks.Events; using Elsa.Activities.Telnyx.Webhooks.Filters; @@ -46,6 +47,7 @@ namespace Elsa.Activities.Telnyx.Extensions .AddActivityTypeProvider() .AddBookmarkProvider() .AddNotificationHandlers(typeof(TriggerWorkflows)) + .AddJavaScriptTypeDefinitionProvider() .AddScoped() .AddSingleton() .AddSingleton() diff --git a/src/activities/Elsa.Activities.Telnyx/Scripting/JavaScript/TelnyxTypeDefinitionProvider.cs b/src/activities/Elsa.Activities.Telnyx/Scripting/JavaScript/TelnyxTypeDefinitionProvider.cs new file mode 100644 index 000000000..9c0112106 --- /dev/null +++ b/src/activities/Elsa.Activities.Telnyx/Scripting/JavaScript/TelnyxTypeDefinitionProvider.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using Elsa.Activities.Telnyx.Webhooks.Models; +using Elsa.Activities.Telnyx.Webhooks.Payloads.Call; +using Elsa.Scripting.JavaScript.Services; + +namespace Elsa.Activities.Telnyx.Scripting.JavaScript +{ + public class TelnyxTypeDefinitionProvider : TypeDefinitionProvider + { + public override IEnumerable CollectTypes(TypeDefinitionContext context) + { + return new[] + { + typeof(TelnyxWebhook), + + typeof(CallAnsweredPayload), + typeof(CallBridgedPayload), + typeof(CallDtmfReceivedPayload), + typeof(CallGatherEndedPayload), + typeof(CallHangupPayload), + typeof(CallInitiatedPayload), + typeof(CallPayload), + typeof(CallPlayback), + typeof(CallPlaybackEndedPayload), + typeof(CallPlaybackStartedPayload), + typeof(CallRecordingSaved), + typeof(CallRecordingUrls), + typeof(CallSpeakEnded), + typeof(CallSpeakStarted), + }; + } + } +} \ No newline at end of file diff --git a/src/activities/Elsa.Activities.Telnyx/Liquid/ConfigureLiquidEngine.cs b/src/activities/Elsa.Activities.Telnyx/Scripting/Liquid/ConfigureLiquidEngine.cs similarity index 97% rename from src/activities/Elsa.Activities.Telnyx/Liquid/ConfigureLiquidEngine.cs rename to src/activities/Elsa.Activities.Telnyx/Scripting/Liquid/ConfigureLiquidEngine.cs index 9aad773e8..f524436b0 100644 --- a/src/activities/Elsa.Activities.Telnyx/Liquid/ConfigureLiquidEngine.cs +++ b/src/activities/Elsa.Activities.Telnyx/Scripting/Liquid/ConfigureLiquidEngine.cs @@ -8,7 +8,7 @@ using Elsa.Scripting.Liquid.Messages; using Fluid; using MediatR; -namespace Elsa.Activities.Telnyx.Liquid +namespace Elsa.Activities.Telnyx.Scripting.Liquid { public class ConfigureLiquidEngine : INotificationHandler { diff --git a/src/activities/Elsa.Activities.Telnyx/Liquid/TelnyxClientStateTag.cs b/src/activities/Elsa.Activities.Telnyx/Scripting/Liquid/TelnyxClientStateTag.cs similarity index 100% rename from src/activities/Elsa.Activities.Telnyx/Liquid/TelnyxClientStateTag.cs rename to src/activities/Elsa.Activities.Telnyx/Scripting/Liquid/TelnyxClientStateTag.cs