From 400b4f827a6bf8ee5efffa797c4151dc802ae9e7 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Tue, 20 Oct 2020 23:17:08 +0200 Subject: [PATCH] Incremental work on tests, API endpoint, versioning and cleanup --- Samples.sln | 7 -- .../Extensions/JObjectExtensions.cs | 2 + .../Elsa.Abstractions/Models/Variables.cs | 8 +- .../Extensions/JTokenExtensions.cs | 17 --- .../Extensions/StringExtensions.cs | 23 ---- .../Formatters/ITokenFormatter.cs | 12 -- .../Serialization/Handlers/IValueHandler.cs | 15 --- .../Handlers/PrimitiveValueHandler.cs | 35 ------ .../Serialization/IActivitySerializer.cs | 11 -- .../Serialization/IContentSerializer.cs | 3 +- .../Elsa.Abstractions/Services/ICloner.cs | 7 ++ .../Services/IWorkflowPublisher.cs | 4 +- .../Services/CustomJsonContentSerializer.cs | 21 +++- src/core/Elsa.Core/ElsaOptions.cs | 16 ++- .../AutoMapperServiceCollectionExtensions.cs | 9 +- .../ElsaServiceCollectionExtensions.cs | 9 +- src/core/Elsa.Core/Mapping/CloningProfile.cs | 16 +++ src/core/Elsa.Core/Mapping/NodaTimeProfile.cs | 23 +--- .../WorkflowDefinitionByIdAndVersionQuery.cs | 17 +-- .../Serialization/ActivitySerializer.cs | 13 --- .../Serialization/ContentSerializer.cs | 47 -------- .../Serialization/DefaultContentSerializer.cs | 57 ++++++++++ .../Elsa.Core/Services/AutoMapperCloner.cs | 15 +++ .../Services/WorkflowDefinitionManager.cs | 10 +- .../Elsa.Core/Services/WorkflowPublisher.cs | 38 +++---- .../Elsa.Server.Api/Elsa.Server.Api.csproj | 9 +- .../Endpoints/WorkflowDefinitions/Get.cs | 13 ++- .../WorkflowDefinitions/Post.Request.cs | 2 +- .../Endpoints/WorkflowDefinitions/Post.cs | 53 +++++---- .../Extensions/JsonMvcBuilderExtensions.cs | 14 +-- .../Extensions/ServiceCollectionExtensions.cs | 2 +- .../Elsa.Server.Core/Elsa.Server.Core.csproj | 31 ----- .../Extensions/ServiceCollectionExtensions.cs | 20 ---- .../Options/ElsaServerOptions.cs | 6 - src/server/Elsa.Server.Core/icon.png | Bin 16374 -> 0 bytes .../Elsa.Server.GraphQL.csproj | 38 ------- .../Extensions/ParserComposer.cs | 26 ----- .../Extensions/ServiceCollectionExtensions.cs | 37 ------ .../Mapping/MappingProfile.cs | 14 --- .../Mapping/VersionOptionsConverter.cs | 25 ---- .../Models/VersionOptionsInput.cs | 12 -- .../Models/WorkflowInput.cs | 19 ---- .../Models/WorkflowSaveAction.cs | 8 -- src/server/Elsa.Server.GraphQL/Mutation.cs | 104 ----------------- src/server/Elsa.Server.GraphQL/Query.cs | 76 ------------- .../Types/ActivityDefinitionInput.cs | 14 --- .../Types/ActivityDefinitionInputType.cs | 14 --- .../Types/ActivityDefinitionType.cs | 15 --- .../Types/ActivityDescriptorType.cs | 13 --- .../Types/ActivityPropertyDescriptorType.cs | 13 --- .../Types/ConnectionDefinitionType.cs | 9 -- .../Elsa.Server.GraphQL/Types/InstantType.cs | 107 ------------------ .../Elsa.Server.GraphQL/Types/JObjectType.cs | 56 --------- .../Elsa.Server.GraphQL/Types/MutationType.cs | 18 --- .../Elsa.Server.GraphQL/Types/QueryType.cs | 32 ------ .../Types/VersionOptionsInputType.cs | 13 --- .../Types/WorkflowDefinitionVersionType.cs | 13 --- .../Types/WorkflowInputType.cs | 13 --- src/server/Elsa.Server.GraphQL/icon.png | Bin 16374 -> 0 bytes src/server/Elsa.Server.Host/Startup.cs | 21 ++-- .../WorkflowDefinitions/PostTests.cs | 4 +- 61 files changed, 248 insertions(+), 1051 deletions(-) delete mode 100644 src/core/Elsa.Abstractions/Serialization/Extensions/JTokenExtensions.cs delete mode 100644 src/core/Elsa.Abstractions/Serialization/Extensions/StringExtensions.cs delete mode 100644 src/core/Elsa.Abstractions/Serialization/Formatters/ITokenFormatter.cs delete mode 100644 src/core/Elsa.Abstractions/Serialization/Handlers/IValueHandler.cs delete mode 100644 src/core/Elsa.Abstractions/Serialization/Handlers/PrimitiveValueHandler.cs delete mode 100644 src/core/Elsa.Abstractions/Serialization/IActivitySerializer.cs create mode 100644 src/core/Elsa.Abstractions/Services/ICloner.cs create mode 100644 src/core/Elsa.Core/Mapping/CloningProfile.cs delete mode 100644 src/core/Elsa.Core/Serialization/ActivitySerializer.cs delete mode 100644 src/core/Elsa.Core/Serialization/ContentSerializer.cs create mode 100644 src/core/Elsa.Core/Serialization/DefaultContentSerializer.cs create mode 100644 src/core/Elsa.Core/Services/AutoMapperCloner.cs delete mode 100644 src/server/Elsa.Server.Core/Elsa.Server.Core.csproj delete mode 100644 src/server/Elsa.Server.Core/Extensions/ServiceCollectionExtensions.cs delete mode 100644 src/server/Elsa.Server.Core/Options/ElsaServerOptions.cs delete mode 100644 src/server/Elsa.Server.Core/icon.png delete mode 100644 src/server/Elsa.Server.GraphQL/Elsa.Server.GraphQL.csproj delete mode 100644 src/server/Elsa.Server.GraphQL/Extensions/ParserComposer.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Extensions/ServiceCollectionExtensions.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Mapping/MappingProfile.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Mapping/VersionOptionsConverter.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Models/VersionOptionsInput.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Models/WorkflowInput.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Models/WorkflowSaveAction.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Mutation.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Query.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Types/ActivityDefinitionInput.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Types/ActivityDefinitionInputType.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Types/ActivityDefinitionType.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Types/ActivityDescriptorType.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Types/ActivityPropertyDescriptorType.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Types/ConnectionDefinitionType.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Types/InstantType.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Types/JObjectType.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Types/MutationType.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Types/QueryType.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Types/VersionOptionsInputType.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Types/WorkflowDefinitionVersionType.cs delete mode 100644 src/server/Elsa.Server.GraphQL/Types/WorkflowInputType.cs delete mode 100644 src/server/Elsa.Server.GraphQL/icon.png diff --git a/Samples.sln b/Samples.sln index 30ed6028f..ffc962938 100644 --- a/Samples.sln +++ b/Samples.sln @@ -50,8 +50,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Scripting.Liquid", "sr EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "server", "server", "{468E498C-59DB-4541-8D8A-0D89DE9083AB}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Server.Core", "src\server\Elsa.Server.Core\Elsa.Server.Core.csproj", "{D91E2F7B-D5B7-4D1C-A3F0-B0475C33F539}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Elsa.Server.Host", "src\server\Elsa.Server.Host\Elsa.Server.Host.csproj", "{FC54EDBA-71FB-4A87-8FD5-54759DF77CCE}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{AB1AE008-6FD6-414C-8E88-D735F42E1FA6}" @@ -152,10 +150,6 @@ Global {01DC21DD-C6E2-4B21-864E-97D29448F777}.Debug|Any CPU.Build.0 = Debug|Any CPU {01DC21DD-C6E2-4B21-864E-97D29448F777}.Release|Any CPU.ActiveCfg = Release|Any CPU {01DC21DD-C6E2-4B21-864E-97D29448F777}.Release|Any CPU.Build.0 = Release|Any CPU - {D91E2F7B-D5B7-4D1C-A3F0-B0475C33F539}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D91E2F7B-D5B7-4D1C-A3F0-B0475C33F539}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D91E2F7B-D5B7-4D1C-A3F0-B0475C33F539}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D91E2F7B-D5B7-4D1C-A3F0-B0475C33F539}.Release|Any CPU.Build.0 = Release|Any CPU {FC54EDBA-71FB-4A87-8FD5-54759DF77CCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FC54EDBA-71FB-4A87-8FD5-54759DF77CCE}.Debug|Any CPU.Build.0 = Debug|Any CPU {FC54EDBA-71FB-4A87-8FD5-54759DF77CCE}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -251,7 +245,6 @@ Global {18BE8F72-E528-4617-B1B1-07BD35337DFC} = {9C3C685E-3D7D-4638-A031-24F71CF74B52} {01DC21DD-C6E2-4B21-864E-97D29448F777} = {9C3C685E-3D7D-4638-A031-24F71CF74B52} {468E498C-59DB-4541-8D8A-0D89DE9083AB} = {DA71CDAA-8DD3-4D5F-9FBD-8E4B37A2D925} - {D91E2F7B-D5B7-4D1C-A3F0-B0475C33F539} = {468E498C-59DB-4541-8D8A-0D89DE9083AB} {FC54EDBA-71FB-4A87-8FD5-54759DF77CCE} = {468E498C-59DB-4541-8D8A-0D89DE9083AB} {0A3C36AB-2ACF-4175-A512-66B4C3DB9371} = {AB1AE008-6FD6-414C-8E88-D735F42E1FA6} {0A6747EA-7AC6-4B6F-BC0C-C40C8A80C44D} = {AB1AE008-6FD6-414C-8E88-D735F42E1FA6} diff --git a/src/core/Elsa.Abstractions/Extensions/JObjectExtensions.cs b/src/core/Elsa.Abstractions/Extensions/JObjectExtensions.cs index 592faaa97..68114a2ea 100644 --- a/src/core/Elsa.Abstractions/Extensions/JObjectExtensions.cs +++ b/src/core/Elsa.Abstractions/Extensions/JObjectExtensions.cs @@ -27,5 +27,7 @@ namespace Elsa } public static void SetState(this JObject state, string key, object? value) => state[key] = value != null ? JToken.FromObject(value, Serializer) : null; + + public static bool HasKey(this JObject state, string key) => state.ContainsKey(key); } } \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Models/Variables.cs b/src/core/Elsa.Abstractions/Models/Variables.cs index 93b47cfe7..bb3ab087f 100644 --- a/src/core/Elsa.Abstractions/Models/Variables.cs +++ b/src/core/Elsa.Abstractions/Models/Variables.cs @@ -1,9 +1,9 @@ -using Elsa.Serialization.Extensions; +using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Elsa.Models { - public class Variables + public class Variables { public Variables() { @@ -19,8 +19,8 @@ namespace Elsa.Models Data = data; } - public JObject Data { get; set; } - + [JsonExtensionData] public JObject Data { get; set; } + public JToken? Get(string name) => Has(name) ? Data[name] : default; public T Get(string name) => Has(name) ? Data.Value(name) : default!; diff --git a/src/core/Elsa.Abstractions/Serialization/Extensions/JTokenExtensions.cs b/src/core/Elsa.Abstractions/Serialization/Extensions/JTokenExtensions.cs deleted file mode 100644 index c11981c8d..000000000 --- a/src/core/Elsa.Abstractions/Serialization/Extensions/JTokenExtensions.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using Newtonsoft.Json.Linq; - -namespace Elsa.Serialization.Extensions -{ - public static class JTokenExtensions - { - public static T GetValue(this JToken token, string key) - { - var value = ((JObject)token).GetValue(key, StringComparison.OrdinalIgnoreCase); - - return value != null ? value.Value() : default; - } - - public static bool HasKey(this JToken token, string key) => ((JObject)token).ContainsKey(key); - } -} \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Serialization/Extensions/StringExtensions.cs b/src/core/Elsa.Abstractions/Serialization/Extensions/StringExtensions.cs deleted file mode 100644 index 65e5fe289..000000000 --- a/src/core/Elsa.Abstractions/Serialization/Extensions/StringExtensions.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System.IO; -using System.Text; - -namespace Elsa.Serialization.Extensions -{ - public static class StringExtensions - { - public static Stream ToStream(this string text) - { - var stream = new MemoryStream(); - var writer = new StreamWriter(stream); - writer.Write(text); - writer.Flush(); - stream.Position = 0; - return stream; - } - - public static byte[] ToBytes(this string text) - { - return Encoding.UTF8.GetBytes(text); - } - } -} \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Serialization/Formatters/ITokenFormatter.cs b/src/core/Elsa.Abstractions/Serialization/Formatters/ITokenFormatter.cs deleted file mode 100644 index 5004bbc32..000000000 --- a/src/core/Elsa.Abstractions/Serialization/Formatters/ITokenFormatter.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Newtonsoft.Json.Linq; - -namespace Elsa.Serialization.Formatters -{ - public interface ITokenFormatter - { - string Format { get; } - string ContentType { get; } - string ToString(JObject token); - JObject FromString(string data); - } -} \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Serialization/Handlers/IValueHandler.cs b/src/core/Elsa.Abstractions/Serialization/Handlers/IValueHandler.cs deleted file mode 100644 index b5a4e088a..000000000 --- a/src/core/Elsa.Abstractions/Serialization/Handlers/IValueHandler.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace Elsa.Serialization.Handlers -{ - public interface IValueHandler - { - int Priority { get; } - bool CanSerialize(JToken token, Type type, object value); - bool CanDeserialize(JToken token); - object? Deserialize(JsonSerializer serializer, JToken token); - void Serialize(JsonWriter writer, JsonSerializer serializer, Type type, JToken token, object value); - } -} \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Serialization/Handlers/PrimitiveValueHandler.cs b/src/core/Elsa.Abstractions/Serialization/Handlers/PrimitiveValueHandler.cs deleted file mode 100644 index ddfcdb905..000000000 --- a/src/core/Elsa.Abstractions/Serialization/Handlers/PrimitiveValueHandler.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Linq; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Elsa.Serialization.Extensions; - -namespace Elsa.Serialization.Handlers -{ - public abstract class PrimitiveValueHandler : IValueHandler - { - public virtual int Priority => 0; - public bool CanSerialize(JToken token, Type type, object value) => type == typeof(T); - public bool CanDeserialize(JToken token) => token.Type == JTokenType.Object && token.GetValue("Type") == TypeName; - protected virtual string TypeName => typeof(T).Name; - - public virtual object Deserialize(JsonSerializer serializer, JToken token) - { - var valueToken = token["Value"]; - - return valueToken == null ? null! : ParseValue(valueToken); - } - - public virtual void Serialize(JsonWriter writer, JsonSerializer serializer, Type type, JToken token, object? value) - { - var objectToken = new JObject - { - ["Type"] = TypeName, - ["Value"] = token - }; - objectToken.WriteTo(writer, serializer.Converters.ToArray()); - } - - protected abstract object ParseValue(JToken value); - } -} \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Serialization/IActivitySerializer.cs b/src/core/Elsa.Abstractions/Serialization/IActivitySerializer.cs deleted file mode 100644 index c9c11be9f..000000000 --- a/src/core/Elsa.Abstractions/Serialization/IActivitySerializer.cs +++ /dev/null @@ -1,11 +0,0 @@ -using Elsa.Services; -using Newtonsoft.Json.Linq; - -namespace Elsa.Serialization -{ - public interface IActivitySerializer - { - JObject Serialize(T activity) where T : IActivity; - T Deserialize(JObject data) where T : IActivity; - } -} \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Serialization/IContentSerializer.cs b/src/core/Elsa.Abstractions/Serialization/IContentSerializer.cs index 851168e75..0f7e4aecd 100644 --- a/src/core/Elsa.Abstractions/Serialization/IContentSerializer.cs +++ b/src/core/Elsa.Abstractions/Serialization/IContentSerializer.cs @@ -4,8 +4,9 @@ namespace Elsa.Serialization { public interface IContentSerializer { - JObject Serialize(T value); + string Serialize(T value); T Deserialize(JToken token); T Deserialize(string json); + object GetSettings(); } } \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Services/ICloner.cs b/src/core/Elsa.Abstractions/Services/ICloner.cs new file mode 100644 index 000000000..775b37c98 --- /dev/null +++ b/src/core/Elsa.Abstractions/Services/ICloner.cs @@ -0,0 +1,7 @@ +namespace Elsa.Services +{ + public interface ICloner + { + T Clone(T source); + } +} \ No newline at end of file diff --git a/src/core/Elsa.Abstractions/Services/IWorkflowPublisher.cs b/src/core/Elsa.Abstractions/Services/IWorkflowPublisher.cs index 7622a4cc5..c2f9af6d2 100644 --- a/src/core/Elsa.Abstractions/Services/IWorkflowPublisher.cs +++ b/src/core/Elsa.Abstractions/Services/IWorkflowPublisher.cs @@ -8,13 +8,13 @@ namespace Elsa.Services { WorkflowDefinition New(); - Task PublishAsync(string id, CancellationToken cancellationToken = default); + Task PublishAsync(string workflowDefinitionId, CancellationToken cancellationToken = default); Task PublishAsync( WorkflowDefinition workflowDefinition, CancellationToken cancellationToken = default); - Task GetDraftAsync(string id, CancellationToken cancellationToken= default); + Task GetDraftAsync(string workflowDefinitionId, CancellationToken cancellationToken= default); Task SaveDraftAsync( WorkflowDefinition workflowDefinition, diff --git a/src/core/Elsa.Core/Data/Services/CustomJsonContentSerializer.cs b/src/core/Elsa.Core/Data/Services/CustomJsonContentSerializer.cs index c16830bca..555cb51eb 100644 --- a/src/core/Elsa.Core/Data/Services/CustomJsonContentSerializer.cs +++ b/src/core/Elsa.Core/Data/Services/CustomJsonContentSerializer.cs @@ -1,5 +1,6 @@ using System; using Newtonsoft.Json; +using Newtonsoft.Json.Serialization; using NodaTime; using NodaTime.Serialization.JsonNet; using YesSql; @@ -8,7 +9,25 @@ namespace Elsa.Data.Services { public class CustomJsonContentSerializer : IContentSerializer { - private static readonly JsonSerializerSettings JsonSettings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Auto }.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); + private static readonly JsonSerializerSettings JsonSettings; + + static CustomJsonContentSerializer() + { + JsonSettings = new JsonSerializerSettings + { + TypeNameHandling = TypeNameHandling.Auto + }.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); + + JsonSettings.ContractResolver = new DefaultContractResolver + { + NamingStrategy = new DefaultNamingStrategy + { + ProcessDictionaryKeys = true, + ProcessExtensionDataNames = true + } + }; + } + public object? Deserialize(string content, Type type) => JsonConvert.DeserializeObject(content, type, JsonSettings); public dynamic? DeserializeDynamic(string content) => JsonConvert.DeserializeObject(content, JsonSettings); public string Serialize(object item) => JsonConvert.SerializeObject(item, JsonSettings); diff --git a/src/core/Elsa.Core/ElsaOptions.cs b/src/core/Elsa.Core/ElsaOptions.cs index 7549faef2..533a5c6ca 100644 --- a/src/core/Elsa.Core/ElsaOptions.cs +++ b/src/core/Elsa.Core/ElsaOptions.cs @@ -1,6 +1,7 @@ using System; using Elsa.Caching; using Elsa.DistributedLock; +using Elsa.Extensions; using Elsa.Serialization; using Microsoft.Extensions.DependencyInjection; using Newtonsoft.Json; @@ -27,9 +28,15 @@ namespace Elsa ServiceBusConfigurer = ConfigureInMemoryServiceBus; JsonSerializerConfigurer = (sp, serializer) => {}; + AddAutoMapper = () => + { + services.AddAutoMapper(ServiceLifetime.Singleton); + services.AddSingleton(sp => sp.CreateAutoMapperConfiguration()); + }; + CreateJsonSerializer = sp => { - var serializer = ContentSerializer.CreateDefaultJsonSerializer(); + var serializer = DefaultContentSerializer.CreateDefaultJsonSerializer(); JsonSerializerConfigurer(sp, serializer); return serializer; }; @@ -42,6 +49,7 @@ namespace Elsa internal Func ServiceBusConfigurer { get; private set; } internal Func CreateJsonSerializer { get; private set; } internal Action JsonSerializerConfigurer { get; private set; } + internal Action AddAutoMapper { get; private set; } public ElsaOptions UseDistributedLockProvider(Func factory) { @@ -62,6 +70,12 @@ namespace Elsa ConfigurePersistence = configure; return this; } + + public ElsaOptions UseAutoMapper(Action addAutoMapper) + { + AddAutoMapper = addAutoMapper; + return this; + } public ElsaOptions ConfigureServiceBus(Func configure) { diff --git a/src/core/Elsa.Core/Extensions/AutoMapperServiceCollectionExtensions.cs b/src/core/Elsa.Core/Extensions/AutoMapperServiceCollectionExtensions.cs index 7a440cb40..2448ea915 100644 --- a/src/core/Elsa.Core/Extensions/AutoMapperServiceCollectionExtensions.cs +++ b/src/core/Elsa.Core/Extensions/AutoMapperServiceCollectionExtensions.cs @@ -9,20 +9,17 @@ namespace Elsa.Extensions { public static IServiceCollection AddAutoMapper(this IServiceCollection services, ServiceLifetime lifetime) { - services.TryAddSingleton(CreateConfigurationProvider); services.TryAdd(new ServiceDescriptor(typeof(IMapper), sp => sp.GetRequiredService().CreateMapper(sp.GetService), lifetime)); - return services; } - public static IServiceCollection AddAutoMapperProfile(this IServiceCollection services, ServiceLifetime lifetime) where TProfile : Profile + public static IServiceCollection AddAutoMapperProfile(this IServiceCollection services) where TProfile : Profile { - services.AddAutoMapper(lifetime); - services.TryAddProvider(lifetime); + services.TryAddProvider(ServiceLifetime.Transient); return services; } - private static IConfigurationProvider CreateConfigurationProvider(IServiceProvider serviceProvider) + public static IConfigurationProvider CreateAutoMapperConfiguration(this IServiceProvider serviceProvider) { var profiles = serviceProvider.GetServices(); diff --git a/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs b/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs index 2c869f5c7..dcd3e1dc6 100644 --- a/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs +++ b/src/core/Elsa.Core/Extensions/ElsaServiceCollectionExtensions.cs @@ -15,6 +15,7 @@ using Elsa.Expressions; using Elsa.Extensions; using Elsa.Handlers; using Elsa.Indexes; +using Elsa.Mapping; using Elsa.Messages; using Elsa.Metadata; using Elsa.Metadata.Handlers; @@ -51,6 +52,7 @@ namespace Microsoft.Extensions.DependencyInjection options.AddWorkflowsCore(); options.AddMediatR(); options.AddServiceBus(); + options.AddAutoMapper(); return services; } @@ -85,8 +87,7 @@ namespace Microsoft.Extensions.DependencyInjection .AddTransient>>(sp => sp.GetServices) .AddSingleton() .AddSingleton(sp => sp.GetRequiredService().CreateJsonSerializer(sp)) - .AddSingleton() - .AddSingleton() + .AddSingleton() .AddSingleton() .TryAddProvider(ServiceLifetime.Singleton) .TryAddProvider(ServiceLifetime.Singleton) @@ -100,6 +101,7 @@ namespace Microsoft.Extensions.DependencyInjection .AddScoped() .AddScoped() .AddScoped() + .AddScoped() .AddIndexProvider() .AddIndexProvider() .AddStartupRunner() @@ -107,6 +109,9 @@ namespace Microsoft.Extensions.DependencyInjection .AddWorkflowProvider() .AddTransient() .AddTransient>(sp => sp.GetRequiredService) + .AddAutoMapperProfile() + .AddAutoMapperProfile() + .AddSingleton() .AddNotificationHandlers(typeof(ElsaServiceCollectionExtensions)) .AddStartupTask() .AddConsumer() diff --git a/src/core/Elsa.Core/Mapping/CloningProfile.cs b/src/core/Elsa.Core/Mapping/CloningProfile.cs new file mode 100644 index 000000000..b132b907e --- /dev/null +++ b/src/core/Elsa.Core/Mapping/CloningProfile.cs @@ -0,0 +1,16 @@ +using AutoMapper; +using Elsa.Models; + +namespace Elsa.Mapping +{ + /// + /// An AutoMapper profile that configures certain domain models to be mappable from and to itself, effectively creating deep clones. + /// + public class CloningProfile : Profile + { + public CloningProfile() + { + CreateMap(); + } + } +} \ No newline at end of file diff --git a/src/core/Elsa.Core/Mapping/NodaTimeProfile.cs b/src/core/Elsa.Core/Mapping/NodaTimeProfile.cs index 2d244f8b8..49b0635ea 100644 --- a/src/core/Elsa.Core/Mapping/NodaTimeProfile.cs +++ b/src/core/Elsa.Core/Mapping/NodaTimeProfile.cs @@ -18,26 +18,11 @@ namespace Elsa.Mapping CreateMap().ConvertUsing(this); } - public DateTime Convert(Instant source, DateTime target, ResolutionContext context) - { - return source.ToDateTimeUtc(); - } + public DateTime Convert(Instant source, DateTime target, ResolutionContext context) => source.ToDateTimeUtc(); + public DateTime? Convert(Instant? source, DateTime? target, ResolutionContext context) => source?.ToDateTimeUtc(); + public Instant Convert(DateTime source, Instant target, ResolutionContext context) => Convert(source); + public Instant? Convert(DateTime? source, Instant? target, ResolutionContext context) => source != null ? Convert(source.Value) : default(Instant?); - public DateTime? Convert(Instant? source, DateTime? target, ResolutionContext context) - { - return source?.ToDateTimeUtc(); - } - - public Instant Convert(DateTime source, Instant target, ResolutionContext context) - { - return Convert(source); - } - - public Instant? Convert(DateTime? source, Instant? target, ResolutionContext context) - { - return source != null ? Convert(source.Value) : default(Instant?); - } - public Instant Convert(DateTime source) { var utcDateTime = source.Kind == DateTimeKind.Unspecified diff --git a/src/core/Elsa.Core/Queries/WorkflowDefinitionByIdAndVersionQuery.cs b/src/core/Elsa.Core/Queries/WorkflowDefinitionByIdAndVersionQuery.cs index 706f526d3..7cedd57c2 100644 --- a/src/core/Elsa.Core/Queries/WorkflowDefinitionByIdAndVersionQuery.cs +++ b/src/core/Elsa.Core/Queries/WorkflowDefinitionByIdAndVersionQuery.cs @@ -21,12 +21,10 @@ namespace Elsa.Queries VersionOptions = versionOptions; } - public Expression, IQuery>> Query() - { - return query => query + public Expression, IQuery>> Query() => + query => query .With(x => x.WorkflowDefinitionId == WorkflowDefinitionId) .WithVersion(VersionOptions); - } } public static class WorkflowDefinitionByIdAndVersionQueryWorkflowDefinitionManagerExtensions @@ -34,18 +32,15 @@ namespace Elsa.Queries public static IQuery QueryByIdAndVersion( this IWorkflowDefinitionManager manager, string workflowDefinitionId, - VersionOptions versionOptions) - { - return manager.ExecuteQuery( - new WorkflowDefinitionByIdAndVersionQuery(workflowDefinitionId, versionOptions)); - } + VersionOptions versionOptions) => + manager.Query(x => x.WorkflowDefinitionId == workflowDefinitionId).WithVersion(versionOptions); + //manager.ExecuteQuery(new WorkflowDefinitionByIdAndVersionQuery(workflowDefinitionId, versionOptions)); public static async Task GetAsync( this IWorkflowDefinitionManager manager, string workflowDefinitionId, VersionOptions versionOptions, CancellationToken cancellationToken = default) => - await manager.QueryByIdAndVersion(workflowDefinitionId, versionOptions) - .FirstOrDefaultAsync(); + await manager.QueryByIdAndVersion(workflowDefinitionId, versionOptions).FirstOrDefaultAsync(); } } \ No newline at end of file diff --git a/src/core/Elsa.Core/Serialization/ActivitySerializer.cs b/src/core/Elsa.Core/Serialization/ActivitySerializer.cs deleted file mode 100644 index ff6df1c00..000000000 --- a/src/core/Elsa.Core/Serialization/ActivitySerializer.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Elsa.Services; -using Newtonsoft.Json.Linq; - -namespace Elsa.Serialization -{ - public class ActivitySerializer : IActivitySerializer - { - private readonly IContentSerializer _ijSerializer; - public ActivitySerializer(IContentSerializer ijSerializer) => _ijSerializer = ijSerializer; - public JObject Serialize(T activity) where T : IActivity => _ijSerializer.Serialize(activity); - public T Deserialize(JObject data) where T : IActivity => _ijSerializer.Deserialize(data); - } -} \ No newline at end of file diff --git a/src/core/Elsa.Core/Serialization/ContentSerializer.cs b/src/core/Elsa.Core/Serialization/ContentSerializer.cs deleted file mode 100644 index 104c895d9..000000000 --- a/src/core/Elsa.Core/Serialization/ContentSerializer.cs +++ /dev/null @@ -1,47 +0,0 @@ -using Elsa.Converters; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Newtonsoft.Json.Serialization; -using NodaTime; -using NodaTime.Serialization.JsonNet; - -namespace Elsa.Serialization -{ - public class ContentSerializer : IContentSerializer - { - public ContentSerializer(JsonSerializer serializer) - { - Serializer = serializer; - } - - private JsonSerializer Serializer { get; } - public JObject Serialize(T value) => JObject.FromObject(value!, Serializer); - public T Deserialize(JToken token) => token.ToObject(Serializer)!; - - public T Deserialize(string json) - { - var token = JObject.Parse(json); - return Deserialize(token); - } - - public static JsonSerializer CreateDefaultJsonSerializer() - { - var jsonSerializer = new JsonSerializer(); - jsonSerializer.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); - jsonSerializer.NullValueHandling = NullValueHandling.Ignore; - jsonSerializer.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; - jsonSerializer.PreserveReferencesHandling = PreserveReferencesHandling.All; - jsonSerializer.TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple; - jsonSerializer.TypeNameHandling = TypeNameHandling.None; - jsonSerializer.ContractResolver = new CamelCasePropertyNamesContractResolver - { - NamingStrategy = new CamelCaseNamingStrategy - { - ProcessDictionaryKeys = false - } - }; - jsonSerializer.Converters.Add(new TypeConverter()); - return jsonSerializer; - } - } -} \ No newline at end of file diff --git a/src/core/Elsa.Core/Serialization/DefaultContentSerializer.cs b/src/core/Elsa.Core/Serialization/DefaultContentSerializer.cs new file mode 100644 index 000000000..ff9ca4a53 --- /dev/null +++ b/src/core/Elsa.Core/Serialization/DefaultContentSerializer.cs @@ -0,0 +1,57 @@ +using Elsa.Converters; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; +using Newtonsoft.Json.Serialization; +using NodaTime; +using NodaTime.Serialization.JsonNet; + +namespace Elsa.Serialization +{ + public class DefaultContentSerializer : IContentSerializer + { + public DefaultContentSerializer(JsonSerializer serializer) + { + Serializer = serializer; + } + + private JsonSerializer Serializer { get; } + public string Serialize(T value) => JObject.FromObject(value!, Serializer).ToString(); + public T Deserialize(JToken token) => token.ToObject(Serializer)!; + + public T Deserialize(string json) + { + var token = JObject.Parse(json); + return Deserialize(token); + } + + public object GetSettings() => CreateDefaultJsonSerializationSettings(); + + public static void ConfigureDefaultJsonSerializationSettings(JsonSerializerSettings settings) + { + settings.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); + settings.NullValueHandling = NullValueHandling.Ignore; + settings.ReferenceLoopHandling = ReferenceLoopHandling.Serialize; + settings.PreserveReferencesHandling = PreserveReferencesHandling.All; + settings.TypeNameAssemblyFormatHandling = TypeNameAssemblyFormatHandling.Simple; + settings.TypeNameHandling = TypeNameHandling.None; + settings.ContractResolver = new CamelCasePropertyNamesContractResolver + { + NamingStrategy = new CamelCaseNamingStrategy + { + ProcessDictionaryKeys = true, + ProcessExtensionDataNames = true + } + }; + settings.Converters.Add(new TypeConverter()); + } + + public static JsonSerializerSettings CreateDefaultJsonSerializationSettings() + { + var settings = new JsonSerializerSettings(); + ConfigureDefaultJsonSerializationSettings(settings); + return settings; + } + + public static JsonSerializer CreateDefaultJsonSerializer() => JsonSerializer.Create(CreateDefaultJsonSerializationSettings()); + } +} \ No newline at end of file diff --git a/src/core/Elsa.Core/Services/AutoMapperCloner.cs b/src/core/Elsa.Core/Services/AutoMapperCloner.cs new file mode 100644 index 000000000..39bfb727d --- /dev/null +++ b/src/core/Elsa.Core/Services/AutoMapperCloner.cs @@ -0,0 +1,15 @@ +using AutoMapper; + +namespace Elsa.Services +{ + /// + /// An implementation that relies on AutoMapper to clone objects. This requires the types that need to be supported to be registered with AutoMapper. + /// We might eventually consider doing a different implementation that does not require explicitly registering which types support cloning. + /// + public class AutoMapperCloner : ICloner + { + private readonly IMapper _mapper; + public AutoMapperCloner(IMapper mapper) => _mapper = mapper; + public T Clone(T source) => _mapper.Map(source); + } +} \ No newline at end of file diff --git a/src/core/Elsa.Core/Services/WorkflowDefinitionManager.cs b/src/core/Elsa.Core/Services/WorkflowDefinitionManager.cs index 6aaa81b06..d51832ee0 100644 --- a/src/core/Elsa.Core/Services/WorkflowDefinitionManager.cs +++ b/src/core/Elsa.Core/Services/WorkflowDefinitionManager.cs @@ -34,13 +34,7 @@ namespace Elsa.Services public async ValueTask> ListAsync(CancellationToken cancellationToken = default) => await Query().ListAsync(); public IQuery Query() => _session.Query(CollectionNames.WorkflowDefinitions); public IQuery Query() where TIndex : class, IIndex => _session.Query(CollectionNames.WorkflowDefinitions); - - public IQuery Query(Expression> predicate) - where TIndex : class, IIndex => _session.Query( - predicate, - CollectionNames.WorkflowDefinitions); - - public IQuery ExecuteQuery(ICompiledQuery query) => - _session.ExecuteQuery(query, CollectionNames.WorkflowDefinitions); + public IQuery Query(Expression> predicate) where TIndex : class, IIndex => _session.Query(predicate, CollectionNames.WorkflowDefinitions); + public IQuery ExecuteQuery(ICompiledQuery query) => _session.ExecuteQuery(query, CollectionNames.WorkflowDefinitions); } } \ No newline at end of file diff --git a/src/core/Elsa.Core/Services/WorkflowPublisher.cs b/src/core/Elsa.Core/Services/WorkflowPublisher.cs index cebe41f37..897b7aa57 100644 --- a/src/core/Elsa.Core/Services/WorkflowPublisher.cs +++ b/src/core/Elsa.Core/Services/WorkflowPublisher.cs @@ -9,11 +9,13 @@ namespace Elsa.Services { private readonly IWorkflowDefinitionManager _workflowDefinitionManager; private readonly IIdGenerator _idGenerator; + private readonly ICloner _cloner; - public WorkflowPublisher(IWorkflowDefinitionManager workflowDefinitionManager, IIdGenerator idGenerator) + public WorkflowPublisher(IWorkflowDefinitionManager workflowDefinitionManager, IIdGenerator idGenerator, ICloner cloner) { _workflowDefinitionManager = workflowDefinitionManager; _idGenerator = idGenerator; + _cloner = cloner; } public WorkflowDefinition New() @@ -34,11 +36,11 @@ namespace Elsa.Services } public async Task PublishAsync( - string id, + string workflowDefinitionId, CancellationToken cancellationToken) { var definition = await _workflowDefinitionManager.GetAsync( - id, + workflowDefinitionId, VersionOptions.Latest, cancellationToken); @@ -48,16 +50,14 @@ namespace Elsa.Services return await PublishAsync(definition, cancellationToken); } - public async Task PublishAsync( - WorkflowDefinition workflowDefinition, - CancellationToken cancellationToken) - { + public async Task PublishAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken) + { var publishedDefinition = await _workflowDefinitionManager.GetAsync( - workflowDefinition.WorkflowDefinitionVersionId, + workflowDefinition.WorkflowDefinitionId, VersionOptions.Published, cancellationToken); - if (publishedDefinition != null) + if (publishedDefinition != null) { publishedDefinition.IsPublished = false; publishedDefinition.IsLatest = false; @@ -66,7 +66,6 @@ namespace Elsa.Services if (workflowDefinition.IsPublished) { - workflowDefinition.WorkflowDefinitionId = _idGenerator.Generate(); workflowDefinition.Version++; } else @@ -82,12 +81,10 @@ namespace Elsa.Services return workflowDefinition; } - public async Task GetDraftAsync( - string id, - CancellationToken cancellationToken) + public async Task GetDraftAsync(string workflowDefinitionId, CancellationToken cancellationToken) { var definition = await _workflowDefinitionManager.GetAsync( - id, + workflowDefinitionId, VersionOptions.Latest, cancellationToken); @@ -97,8 +94,9 @@ namespace Elsa.Services if (!definition.IsPublished) return definition; - var draft = definition; - draft.WorkflowDefinitionId = _idGenerator.Generate(); + var draft = _cloner.Clone(definition); + draft.Id = 0; + draft.WorkflowDefinitionVersionId = _idGenerator.Generate(); draft.IsPublished = false; draft.IsLatest = true; draft.Version++; @@ -106,22 +104,18 @@ namespace Elsa.Services return draft; } - public async Task SaveDraftAsync( - WorkflowDefinition workflowDefinition, - CancellationToken cancellationToken) + public async Task SaveDraftAsync(WorkflowDefinition workflowDefinition, CancellationToken cancellationToken) { var draft = workflowDefinition; var latestVersion = await _workflowDefinitionManager.GetAsync( - workflowDefinition.WorkflowDefinitionVersionId, + workflowDefinition.WorkflowDefinitionId, VersionOptions.Latest, cancellationToken); if (latestVersion != null && latestVersion.IsPublished && latestVersion.IsLatest) { latestVersion.IsLatest = false; - draft.WorkflowDefinitionId = _idGenerator.Generate(); - draft.Version++; await _workflowDefinitionManager.SaveAsync(latestVersion, cancellationToken); } diff --git a/src/server/Elsa.Server.Api/Elsa.Server.Api.csproj b/src/server/Elsa.Server.Api/Elsa.Server.Api.csproj index 59ba1be57..441f58a66 100644 --- a/src/server/Elsa.Server.Api/Elsa.Server.Api.csproj +++ b/src/server/Elsa.Server.Api/Elsa.Server.Api.csproj @@ -9,13 +9,10 @@ - - - - + @@ -26,4 +23,8 @@ Post.cs + + + + diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Get.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Get.cs index 208c36de9..b4222d6c8 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Get.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Get.cs @@ -2,6 +2,7 @@ using System.Threading.Tasks; using Elsa.Models; using Elsa.Queries; +using Elsa.Serialization; using Elsa.Services; using Microsoft.AspNetCore.Mvc; @@ -10,16 +11,22 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions [ApiController] [ApiVersion("1")] [Route("v{version:apiVersion}/workflow-definitions/{id}")] - public class Get : ControllerBase + public class Get : Controller { private readonly IWorkflowDefinitionManager _workflowDefinitionManager; - public Get(IWorkflowDefinitionManager workflowDefinitionManager) => _workflowDefinitionManager = workflowDefinitionManager; + private readonly IContentSerializer _serializer; + + public Get(IWorkflowDefinitionManager workflowDefinitionManager, IContentSerializer serializer) + { + _serializer = serializer; + _workflowDefinitionManager = workflowDefinitionManager; + } [HttpGet] public async Task Handle([FromRoute(Name = "id")] string workflowDefinitionId, CancellationToken cancellationToken) { var workflowDefinition = await _workflowDefinitionManager.GetAsync(workflowDefinitionId, VersionOptions.Latest, cancellationToken); - return workflowDefinition == null ? (IActionResult)NotFound() : Ok(workflowDefinition); + return workflowDefinition == null ? (IActionResult)NotFound() : Json(workflowDefinition, _serializer.GetSettings()); } } } \ No newline at end of file diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Post.Request.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Post.Request.cs index 3984c541d..71ee41b71 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Post.Request.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Post.Request.cs @@ -3,7 +3,7 @@ using Elsa.Models; namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions { - public class CreateWorkflowDefinitionRequest + public class SaveWorkflowDefinitionRequest { public string WorkflowDefinitionId { get; set; } = default!; public string? Name { get; set; } diff --git a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Post.cs b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Post.cs index b6c40a2a6..455db3e8c 100644 --- a/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Post.cs +++ b/src/server/Elsa.Server.Api/Endpoints/WorkflowDefinitions/Post.cs @@ -1,8 +1,8 @@ using System.Threading; using System.Threading.Tasks; -using Elsa.Models; using Elsa.Services; using Microsoft.AspNetCore.Mvc; +using YesSql; namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions { @@ -12,34 +12,45 @@ namespace Elsa.Server.Api.Endpoints.WorkflowDefinitions public class Post : ControllerBase { private readonly IWorkflowDefinitionManager _workflowDefinitionManager; + private readonly IWorkflowPublisher _workflowPublisher; + private readonly ISession _session; - public Post(IWorkflowDefinitionManager workflowDefinitionManager) + public Post(IWorkflowDefinitionManager workflowDefinitionManager, IWorkflowPublisher workflowPublisher, ISession session) { _workflowDefinitionManager = workflowDefinitionManager; + _workflowPublisher = workflowPublisher; + _session = session; } [HttpPost] - public async Task Handle(CreateWorkflowDefinitionRequest request, ApiVersion apiVersion, CancellationToken cancellationToken) + public async Task Handle(SaveWorkflowDefinitionRequest request, ApiVersion apiVersion, CancellationToken cancellationToken) { - var workflowDefinition = new WorkflowDefinition - { - WorkflowDefinitionId = request.WorkflowDefinitionId.Trim(), - Activities = request.Activities, - Connections = request.Connections, - Description = request.Description?.Trim(), - Name = request.Name?.Trim(), - Variables = request.Variables, - IsEnabled = request.Enabled, - IsLatest = true, - IsPublished = request.Publish, - Version = 1, - IsSingleton = request.IsSingleton, - PersistenceBehavior = request.PersistenceBehavior, - DeleteCompletedInstances = request.DeleteCompletedInstances - }; + var workflowDefinition = await _workflowPublisher.GetDraftAsync(request.WorkflowDefinitionId, cancellationToken); - await _workflowDefinitionManager.SaveAsync(workflowDefinition, cancellationToken); - return CreatedAtAction("Handle", "Get", new { version = apiVersion.ToString() }, workflowDefinition); + if (workflowDefinition == null) + { + workflowDefinition = _workflowPublisher.New(); + + if (!string.IsNullOrWhiteSpace(request.WorkflowDefinitionId)) + workflowDefinition.WorkflowDefinitionId = request.WorkflowDefinitionId.Trim(); + } + + workflowDefinition.Activities = request.Activities; + workflowDefinition.Connections = request.Connections; + workflowDefinition.Description = request.Description?.Trim(); + workflowDefinition.Name = request.Name?.Trim(); + workflowDefinition.Variables = request.Variables; + workflowDefinition.IsEnabled = request.Enabled; + workflowDefinition.IsSingleton = request.IsSingleton; + workflowDefinition.PersistenceBehavior = request.PersistenceBehavior; + workflowDefinition.DeleteCompletedInstances = request.DeleteCompletedInstances; + + if (request.Publish) + await _workflowPublisher.PublishAsync(workflowDefinition, cancellationToken); + else + await _workflowPublisher.SaveDraftAsync(workflowDefinition, cancellationToken); + + return CreatedAtAction("Handle", "Get", new { id = workflowDefinition.WorkflowDefinitionId, version = apiVersion.ToString() }, workflowDefinition); } } } \ No newline at end of file diff --git a/src/server/Elsa.Server.Api/Extensions/JsonMvcBuilderExtensions.cs b/src/server/Elsa.Server.Api/Extensions/JsonMvcBuilderExtensions.cs index f99b465f6..7f1130382 100644 --- a/src/server/Elsa.Server.Api/Extensions/JsonMvcBuilderExtensions.cs +++ b/src/server/Elsa.Server.Api/Extensions/JsonMvcBuilderExtensions.cs @@ -1,18 +1,18 @@ -using System.Text.Json; +using System; +using Elsa.Serialization; using Microsoft.Extensions.DependencyInjection; -using NodaTime; -using NodaTime.Serialization.SystemTextJson; +using Newtonsoft.Json; namespace Elsa.Server.Api.Extensions { public static class JsonMvcBuilderExtensions { - public static IMvcBuilder AddJsonSerialization(this IMvcBuilder builder) => - builder.AddJsonOptions( + public static IMvcBuilder AddJsonSerialization(this IMvcBuilder builder, Action? configure = default) => + builder.AddNewtonsoftJson( options => { - options.JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCase; - options.JsonSerializerOptions.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); + configure ??= DefaultContentSerializer.ConfigureDefaultJsonSerializationSettings; + //configure(options.SerializerSettings); }); } } \ No newline at end of file diff --git a/src/server/Elsa.Server.Api/Extensions/ServiceCollectionExtensions.cs b/src/server/Elsa.Server.Api/Extensions/ServiceCollectionExtensions.cs index 4b8639c1a..08ec648d7 100644 --- a/src/server/Elsa.Server.Api/Extensions/ServiceCollectionExtensions.cs +++ b/src/server/Elsa.Server.Api/Extensions/ServiceCollectionExtensions.cs @@ -8,7 +8,7 @@ namespace Microsoft.Extensions.DependencyInjection { public static IServiceCollection AddElsaApiEndpoints(this IServiceCollection services) { - services.AddControllers().SetCompatibilityVersion(CompatibilityVersion.Latest).AddJsonSerialization(); + services.AddControllers().AddJsonSerialization(); services.AddRouting(options => options.LowercaseUrls = true); services.AddApiVersioning( diff --git a/src/server/Elsa.Server.Core/Elsa.Server.Core.csproj b/src/server/Elsa.Server.Core/Elsa.Server.Core.csproj deleted file mode 100644 index 4eeca8ce7..000000000 --- a/src/server/Elsa.Server.Core/Elsa.Server.Core.csproj +++ /dev/null @@ -1,31 +0,0 @@ - - - - netstandard2.0 - latest - 1.0.0 - Elsa Contributors - - Elsa is a set of workflow libraries and tools that enable lean and mean workflowing capabilities in any .NET Core application. - This package provides services to manage workflows, such as serialization and versioning. - - 2019 - https://github.com/elsa-workflows/elsa-core - https://github.com/elsa-workflows/elsa-core - GitHub - elsa, workflows - icon.png - - - - - True - - - - - - - - - diff --git a/src/server/Elsa.Server.Core/Extensions/ServiceCollectionExtensions.cs b/src/server/Elsa.Server.Core/Extensions/ServiceCollectionExtensions.cs deleted file mode 100644 index c3871e8a9..000000000 --- a/src/server/Elsa.Server.Core/Extensions/ServiceCollectionExtensions.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using Elsa.Server.Core.Options; -using Microsoft.Extensions.Options; - -// ReSharper disable once CheckNamespace -namespace Microsoft.Extensions.DependencyInjection -{ - public static class ServiceCollectionExtensions - { - public static IServiceCollection AddElsaServer( - this IServiceCollection services, - Action> options = default) - { - var optionsBuilder = services.AddOptions(); - options?.Invoke(optionsBuilder); - - return services; - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.Core/Options/ElsaServerOptions.cs b/src/server/Elsa.Server.Core/Options/ElsaServerOptions.cs deleted file mode 100644 index 8fcedb536..000000000 --- a/src/server/Elsa.Server.Core/Options/ElsaServerOptions.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace Elsa.Server.Core.Options -{ - public class ElsaServerOptions - { - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.Core/icon.png b/src/server/Elsa.Server.Core/icon.png deleted file mode 100644 index f978a28829e4f03aa270e4f0f2162bb8c41bed2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16374 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 - - - netstandard2.0 - latest - 1.0.0 - Elsa Contributors - - Elsa is a set of workflow libraries and tools that enable lean and mean workflowing capabilities in any .NET Core application. - This package provides a GraphQL endpoint to interface with the workflow host. - - 2019 - https://github.com/elsa-workflows/elsa-core - https://github.com/elsa-workflows/elsa-core - GitHub - elsa, workflows - icon.png - enable - - - - - - - - - - - - - - - True - - - - - diff --git a/src/server/Elsa.Server.GraphQL/Extensions/ParserComposer.cs b/src/server/Elsa.Server.GraphQL/Extensions/ParserComposer.cs deleted file mode 100644 index 3e48b90b9..000000000 --- a/src/server/Elsa.Server.GraphQL/Extensions/ParserComposer.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; - -namespace Elsa.Server.GraphQL.Extensions -{ - public static class ParserComposer - { - public static object FirstNonThrowing(IEnumerable> parsers, string value) - { - if (!parsers.Any()) - return null; - - foreach (var nextParser in parsers) - { - try - { - return nextParser(value); - } - catch (Exception) { continue; } - } - - return null; - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Extensions/ServiceCollectionExtensions.cs b/src/server/Elsa.Server.GraphQL/Extensions/ServiceCollectionExtensions.cs deleted file mode 100644 index f841aee7b..000000000 --- a/src/server/Elsa.Server.GraphQL/Extensions/ServiceCollectionExtensions.cs +++ /dev/null @@ -1,37 +0,0 @@ -using Elsa.Extensions; -using Elsa.Metadata; -using Elsa.Server.GraphQL.Mapping; -using Elsa.Server.GraphQL.Types; -using Elsa.Services; -using HotChocolate; -using Microsoft.Extensions.DependencyInjection; - -// ReSharper disable once CheckNamespace -namespace Microsoft.Extensions.DependencyInjection -{ - public static class ServiceCollectionExtensions - { - public static IServiceCollection AddElsaGraphQL(this IServiceCollection services) - { - return services - .AddScoped() - .AddSingleton() - .AddSingleton() - .AddAutoMapperProfile(ServiceLifetime.Singleton) - .AddGraphQL(sp => SchemaBuilder.New() - .AddServices(sp) - .AddQueryType() - .AddMutationType() - .AddType() - .AddType() - .AddType() - .AddType() - .AddType() - .AddType() - .AddType() - .AddType() - .AddType() - .Create()); - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Mapping/MappingProfile.cs b/src/server/Elsa.Server.GraphQL/Mapping/MappingProfile.cs deleted file mode 100644 index 85d62765e..000000000 --- a/src/server/Elsa.Server.GraphQL/Mapping/MappingProfile.cs +++ /dev/null @@ -1,14 +0,0 @@ -using AutoMapper; -using Elsa.Models; -using Elsa.Server.GraphQL.Models; - -namespace Elsa.Server.GraphQL.Mapping -{ - public class MappingProfile : Profile - { - public MappingProfile() - { - CreateMap().ConvertUsing(); - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Mapping/VersionOptionsConverter.cs b/src/server/Elsa.Server.GraphQL/Mapping/VersionOptionsConverter.cs deleted file mode 100644 index 798d4e725..000000000 --- a/src/server/Elsa.Server.GraphQL/Mapping/VersionOptionsConverter.cs +++ /dev/null @@ -1,25 +0,0 @@ -using AutoMapper; -using Elsa.Models; -using Elsa.Server.GraphQL.Models; - -namespace Elsa.Server.GraphQL.Mapping -{ - public class VersionOptionsConverter : ITypeConverter - { - public VersionOptions Convert(VersionOptionsInput source, VersionOptions destination, ResolutionContext context) - { - if (source.AllVersions == true) - return VersionOptions.All; - if (source.Draft == true) - return VersionOptions.Draft; - if (source.Latest == true) - return VersionOptions.Latest; - if (source.Published == true) - return VersionOptions.Published; - if (source.LatestOrPublished == true) - return VersionOptions.LatestOrPublished; - - return VersionOptions.SpecificVersion(source?.Version ?? 0); - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Models/VersionOptionsInput.cs b/src/server/Elsa.Server.GraphQL/Models/VersionOptionsInput.cs deleted file mode 100644 index d03be29d8..000000000 --- a/src/server/Elsa.Server.GraphQL/Models/VersionOptionsInput.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Elsa.Server.GraphQL.Models -{ - public class VersionOptionsInput - { - public bool? Latest { get; set; } - public bool? LatestOrPublished { get; set; } - public bool? Published { get; set; } - public bool? Draft { get; set; } - public bool? AllVersions { get; set; } - public int? Version { get; set; } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Models/WorkflowInput.cs b/src/server/Elsa.Server.GraphQL/Models/WorkflowInput.cs deleted file mode 100644 index 8709c484b..000000000 --- a/src/server/Elsa.Server.GraphQL/Models/WorkflowInput.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Collections.Generic; -using Elsa.Models; -using Elsa.Server.GraphQL.Types; - -namespace Elsa.Server.GraphQL.Models -{ - public class WorkflowInput - { - public string? Name { get; set; } - public string? Description { get; set; } - public bool? IsSingleton { get; set; } - public bool? IsEnabled { get; set; } - public bool? DeleteCompletedInstances { get; set; } - public string? Variables { get; set; } - public WorkflowPersistenceBehavior? PersistenceBehavior { get; set; } - public ICollection? Activities { get; set; } - public ICollection? Connections { get; set; } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Models/WorkflowSaveAction.cs b/src/server/Elsa.Server.GraphQL/Models/WorkflowSaveAction.cs deleted file mode 100644 index 171575561..000000000 --- a/src/server/Elsa.Server.GraphQL/Models/WorkflowSaveAction.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Elsa.Server.GraphQL.Models -{ - public enum WorkflowSaveAction - { - Draft, - Publish - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Mutation.cs b/src/server/Elsa.Server.GraphQL/Mutation.cs deleted file mode 100644 index f028ea004..000000000 --- a/src/server/Elsa.Server.GraphQL/Mutation.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using AutoMapper; -using Elsa.Models; -using Elsa.Queries; -using Elsa.Serialization; -using Elsa.Server.GraphQL.Models; -using Elsa.Server.GraphQL.Types; -using Elsa.Services; -using HotChocolate; -using Open.Linq.AsyncExtensions; -using IIdGenerator = Elsa.Services.IIdGenerator; - -namespace Elsa.Server.GraphQL -{ - public class Mutation - { - private readonly IMapper _mapper; - - public Mutation(IMapper mapper) - { - _mapper = mapper; - } - - public async Task SaveWorkflowDefinition( - string? id, - WorkflowSaveAction saveAction, - WorkflowInput workflowInput, - [Service] IWorkflowDefinitionManager manager, - [Service] IIdGenerator idGenerator, - [Service] IContentSerializer serializer, - [Service] IWorkflowPublisher publisher, - CancellationToken cancellationToken) - { - var workflowDefinition = id != null - ? await manager.GetAsync(id, VersionOptions.Latest, cancellationToken) - : default; - - if (workflowDefinition == null) - { - workflowDefinition = new WorkflowDefinition - { - WorkflowDefinitionId = idGenerator.Generate(), - WorkflowDefinitionVersionId = idGenerator.Generate(), - Version = 1, - IsLatest = true - }; - } - - if (workflowInput.Activities != null) - workflowDefinition.Activities = workflowInput.Activities.Select(ToActivityDefinition).ToList(); - - if (workflowInput.Connections != null) - workflowDefinition.Connections = workflowInput.Connections; - - if (workflowInput.Description != null) - workflowDefinition.Description = workflowInput.Description.Trim(); - - if (workflowInput.Name != null) - workflowDefinition.Name = workflowInput.Name.Trim(); - - if (workflowInput.IsEnabled != null) - workflowDefinition.IsEnabled = workflowInput.IsEnabled.Value; - - if (workflowInput.IsSingleton != null) - workflowDefinition.IsSingleton = workflowInput.IsSingleton.Value; - - if (workflowInput.DeleteCompletedInstances != null) - workflowDefinition.DeleteCompletedInstances = workflowInput.DeleteCompletedInstances.Value; - - if (workflowInput.Variables != null) - workflowDefinition.Variables = serializer.Deserialize(workflowInput.Variables); - - if (workflowInput.PersistenceBehavior != null) - workflowDefinition.PersistenceBehavior = workflowInput.PersistenceBehavior.Value; - - if (saveAction == WorkflowSaveAction.Publish) - workflowDefinition = await publisher.PublishAsync(workflowDefinition, cancellationToken); - else - workflowDefinition = await publisher.SaveDraftAsync(workflowDefinition, cancellationToken); - - return workflowDefinition; - } - - public async Task DeleteWorkflowDefinition( - string id, - [Service] IWorkflowDefinitionManager manager, - CancellationToken cancellationToken) - { - var workflowDefinitions = await manager.QueryByIdAndVersion(id, VersionOptions.All) - .ListAsync() - .ToList(); - - foreach (var workflowDefinition in workflowDefinitions) - await manager.DeleteAsync(workflowDefinition, cancellationToken); - - return workflowDefinitions.Count; - } - - private ActivityDefinition ToActivityDefinition(ActivityDefinitionInput source) => - _mapper.Map(source); - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Query.cs b/src/server/Elsa.Server.GraphQL/Query.cs deleted file mode 100644 index 819e38803..000000000 --- a/src/server/Elsa.Server.GraphQL/Query.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using AutoMapper; -using Elsa.Metadata; -using Elsa.Models; -using Elsa.Queries; -using Elsa.Server.GraphQL.Models; -using Elsa.Services; -using HotChocolate; - -namespace Elsa.Server.GraphQL -{ - public class Query - { - public IEnumerable GetActivityDescriptors( - [Service] IActivityActivator activityActivator, - [Service] IActivityDescriber describer) => - activityActivator.GetActivityTypes().Select(describer.Describe).ToList(); - - public ActivityDescriptor? GetActivityDescriptor( - [Service] IActivityActivator activityActivator, - [Service] IActivityDescriber describer, - string typeName) - { - var type = activityActivator.GetActivityType(typeName); - - return type == null ? default : describer.Describe(type); - } - - public async Task> GetWorkflowDefinitions( - VersionOptionsInput? version, - [Service] IWorkflowDefinitionManager manager, - [Service] IMapper mapper, - CancellationToken cancellationToken) - { - var mappedVersion = mapper.Map(version); - return await manager.ListAsync(mappedVersion ?? VersionOptions.Latest, cancellationToken); - } - - public async Task GetWorkflowDefinition( - string? workflowDefinitionVersionId, - string? workflowDefinitionId, - VersionOptionsInput? version, - [Service] IWorkflowDefinitionManager manager, - [Service] IMapper mapper, - CancellationToken cancellationToken) - { - if (workflowDefinitionVersionId != null) - return await manager.GetByVersionIdAsync(workflowDefinitionVersionId, cancellationToken); - - var mappedVersion = mapper.Map(version); - - return await manager.GetAsync( - workflowDefinitionId!, - mappedVersion ?? VersionOptions.Latest, - cancellationToken); - } - - public async Task> GetWorkflowInstances( - string definitionId, - WorkflowStatus? status, - [Service] IWorkflowInstanceManager manager, - CancellationToken cancellationToken) => - status == null - ? await manager.ListByDefinitionAsync(definitionId, cancellationToken) - : await manager.ListByDefinitionAndStatusAsync(definitionId, status.Value, cancellationToken); - - public async Task GetWorkflowInstance( - string id, - [Service] IWorkflowInstanceManager manager, - CancellationToken cancellationToken) => - await manager.GetByWorkflowInstanceIdAsync(id, cancellationToken); - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Types/ActivityDefinitionInput.cs b/src/server/Elsa.Server.GraphQL/Types/ActivityDefinitionInput.cs deleted file mode 100644 index ef186e99b..000000000 --- a/src/server/Elsa.Server.GraphQL/Types/ActivityDefinitionInput.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Elsa.Server.GraphQL.Types -{ - public class ActivityDefinitionInput - { - public string Id { get; set; } - public string Type { get; set; } - public string? Name { get; set; } - public string? DisplayName { get; set; } - public string? Description { get; set; } - public int? Left { get; set; } - public int? Top { get; set; } - public string? State { get; set; } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Types/ActivityDefinitionInputType.cs b/src/server/Elsa.Server.GraphQL/Types/ActivityDefinitionInputType.cs deleted file mode 100644 index 6957e6e9c..000000000 --- a/src/server/Elsa.Server.GraphQL/Types/ActivityDefinitionInputType.cs +++ /dev/null @@ -1,14 +0,0 @@ -using HotChocolate.Types; - -namespace Elsa.Server.GraphQL.Types -{ - public class ActivityDefinitionInputType : InputObjectType - { - protected override void Configure(IInputObjectTypeDescriptor descriptor) - { - descriptor.Field(x => x.State).Type(); - //descriptor.Field(x => x.State).Type(); - //descriptor.Field(x => x.State).Type(); - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Types/ActivityDefinitionType.cs b/src/server/Elsa.Server.GraphQL/Types/ActivityDefinitionType.cs deleted file mode 100644 index 54cb578ff..000000000 --- a/src/server/Elsa.Server.GraphQL/Types/ActivityDefinitionType.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Elsa.Models; -using HotChocolate.Types; - -namespace Elsa.Server.GraphQL.Types -{ - public class ActivityDefinitionType : ObjectType - { - protected override void Configure(IObjectTypeDescriptor descriptor) - { - //descriptor.Field(x => x.State).Type(); - //descriptor.Field(x => x.State).Type(); - //descriptor.Field(x => x.State).Type(); - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Types/ActivityDescriptorType.cs b/src/server/Elsa.Server.GraphQL/Types/ActivityDescriptorType.cs deleted file mode 100644 index cc9a0e9a0..000000000 --- a/src/server/Elsa.Server.GraphQL/Types/ActivityDescriptorType.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Elsa.Metadata; -using HotChocolate.Types; - -namespace Elsa.Server.GraphQL.Types -{ - public class ActivityDescriptorType : ObjectType - { - protected override void Configure(IObjectTypeDescriptor descriptor) - { - descriptor.Field(x => x.Type).Type>(); - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Types/ActivityPropertyDescriptorType.cs b/src/server/Elsa.Server.GraphQL/Types/ActivityPropertyDescriptorType.cs deleted file mode 100644 index 4550fd1ca..000000000 --- a/src/server/Elsa.Server.GraphQL/Types/ActivityPropertyDescriptorType.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Elsa.Metadata; -using HotChocolate.Types; - -namespace Elsa.Server.GraphQL.Types -{ - public class ActivityPropertyDescriptorType : ObjectType - { - protected override void Configure(IObjectTypeDescriptor descriptor) - { - descriptor.Field(x => x.Options).Type(); - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Types/ConnectionDefinitionType.cs b/src/server/Elsa.Server.GraphQL/Types/ConnectionDefinitionType.cs deleted file mode 100644 index 26b48af8b..000000000 --- a/src/server/Elsa.Server.GraphQL/Types/ConnectionDefinitionType.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Elsa.Models; -using HotChocolate.Types; - -namespace Elsa.Server.GraphQL.Types -{ - public class ConnectionDefinitionType : ObjectType - { - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Types/InstantType.cs b/src/server/Elsa.Server.GraphQL/Types/InstantType.cs deleted file mode 100644 index 847efca17..000000000 --- a/src/server/Elsa.Server.GraphQL/Types/InstantType.cs +++ /dev/null @@ -1,107 +0,0 @@ -using System; -using System.Globalization; -using Elsa.Server.GraphQL.Extensions; -using HotChocolate.Language; -using HotChocolate.Types; -using NodaTime; -using NodaTime.Text; - -namespace Elsa.Server.GraphQL.Types -{ - public class InstantType : ScalarType - { - public InstantType() : base("Instant") - { - Description = "Represents an instant on the global timeline."; - } - - public override Type ClrType => typeof(Instant); - - public override bool IsInstanceOfType(IValueNode literal) - { - if (literal == null) - { - throw new ArgumentNullException(nameof(literal)); - } - - if (literal is NullValueNode) - { - return true; - } - - return literal is StringValueNode stringLiteral && TryParseLiteral(stringLiteral, out _); - } - - private bool TryParseLiteral(StringValueNode literal, out object obj) => - TryDeserializeFromString(literal.Value, out obj); - - protected bool TryDeserializeFromString( - string serialized, - out object obj) - { - obj = null; - return false; - } - - public override object ParseLiteral(IValueNode literal) - { - if (literal is StringValueNode stringValue) - { - return FromString(stringValue.Value); - } - - return null; - } - - public override IValueNode ParseValue(object value) - { - return null; - } - - public override object Serialize(object value) - { - if (value is string) - return value; - if (value is DateTime dateTime) - return dateTime.ToString("o", CultureInfo.InvariantCulture); - if (value is Instant instant) - return InstantPattern.ExtendedIso - .WithCulture(CultureInfo.InvariantCulture) - .Format(instant); - return null; - } - - public override bool TryDeserialize(object serialized, out object value) - { - throw new NotImplementedException(); - } - - private static object FromString(string stringValue) - { - return ParserComposer.FirstNonThrowing(new Func[] - { - str => OffsetDateTimePattern.ExtendedIso - .WithCulture(CultureInfo.InvariantCulture) - .Parse(str).GetValueOrThrow().ToInstant(), - str => OffsetDateTimePattern - .CreateWithInvariantCulture("yyyy'-'MM'-'dd'T'HH':'mm':'sso<+HHmm>") - .Parse(str).GetValueOrThrow().ToInstant(), - str => InstantPattern.ExtendedIso - .WithCulture(CultureInfo.InvariantCulture) - .Parse(str).GetValueOrThrow(), - }, stringValue); - } - - private static object FromDateTimeUtc(DateTime dateTime) - { - try - { - return Instant.FromDateTimeUtc(dateTime); - } - catch (Exception) - { - return null; - } - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Types/JObjectType.cs b/src/server/Elsa.Server.GraphQL/Types/JObjectType.cs deleted file mode 100644 index 0299913b9..000000000 --- a/src/server/Elsa.Server.GraphQL/Types/JObjectType.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using System.Collections.Generic; -using HotChocolate.Language; -using HotChocolate.Types; -using Humanizer; -using Newtonsoft.Json.Linq; - -namespace Elsa.Server.GraphQL.Types -{ - public class JObjectType : ScalarType - { - public JObjectType() : base("JObjectType") - { - } - - public override Type ClrType => typeof(JObject); - - public override bool IsInstanceOfType(IValueNode literal) - { - return literal == null || literal is ObjectValueNode || literal is NullValueNode; - } - - public override object ParseLiteral(IValueNode literal) - { - return new JObject(); - } - - public override IValueNode ParseValue(object value) - { - if (value is null) - return NullValueNode.Default; - - return new ObjectValueNode(); - } - - public override object Serialize(object value) - { - if (value == null) - return null; - - var jObject = (JObject)value; - var dictionary = new Dictionary(); - - foreach (var variable in jObject) - dictionary[variable.Key.Camelize()] = variable.Value; - - return dictionary; - } - - public override bool TryDeserialize(object serialized, out object value) - { - value = null; - return false; - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Types/MutationType.cs b/src/server/Elsa.Server.GraphQL/Types/MutationType.cs deleted file mode 100644 index 36e9b17f8..000000000 --- a/src/server/Elsa.Server.GraphQL/Types/MutationType.cs +++ /dev/null @@ -1,18 +0,0 @@ -using HotChocolate.Types; - -namespace Elsa.Server.GraphQL.Types -{ - public class MutationType : ObjectType - { - protected override void Configure(IObjectTypeDescriptor descriptor) - { - descriptor - .Field(x => x.SaveWorkflowDefinition(default, default, default, default, default, default, default, default)) - .Argument("id", x => x.Type()); - - descriptor - .Field(x => x.DeleteWorkflowDefinition(default, default, default)) - .Argument("id", x => x.Type()); - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Types/QueryType.cs b/src/server/Elsa.Server.GraphQL/Types/QueryType.cs deleted file mode 100644 index 6f4692cb1..000000000 --- a/src/server/Elsa.Server.GraphQL/Types/QueryType.cs +++ /dev/null @@ -1,32 +0,0 @@ -using HotChocolate.Types; - -namespace Elsa.Server.GraphQL.Types -{ - public class QueryType : ObjectType - { - protected override void Configure(IObjectTypeDescriptor descriptor) - { - descriptor - .Field(x => x.GetActivityDescriptor(default, default, default)) - .Argument("typeName", x => x.Type()); - - descriptor - .Field(x => x.GetWorkflowDefinitions(default, default, default, default)) - .Argument("version", x => x.Type()); - - descriptor - .Field(x => x.GetWorkflowDefinition(default, default, default, default, default, default)) - .Argument("id", x => x.Type()) - .Argument("definitionId", x => x.Type()) - .Argument("version", x => x.Type()); - - descriptor - .Field(x => x.GetWorkflowInstances(default, default, default, default)) - .Argument("definitionId", x => x.Type()); - - descriptor - .Field(x => x.GetWorkflowInstance(default, default, default)) - .Argument("id", x => x.Type()); - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Types/VersionOptionsInputType.cs b/src/server/Elsa.Server.GraphQL/Types/VersionOptionsInputType.cs deleted file mode 100644 index 702de18af..000000000 --- a/src/server/Elsa.Server.GraphQL/Types/VersionOptionsInputType.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Elsa.Server.GraphQL.Models; -using HotChocolate.Types; - -namespace Elsa.Server.GraphQL.Types -{ - public class VersionOptionsInputType : InputObjectType - { - protected override void Configure(IInputObjectTypeDescriptor descriptor) - { - descriptor.Field(x => x.Version).Type(); - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Types/WorkflowDefinitionVersionType.cs b/src/server/Elsa.Server.GraphQL/Types/WorkflowDefinitionVersionType.cs deleted file mode 100644 index 2c20efc52..000000000 --- a/src/server/Elsa.Server.GraphQL/Types/WorkflowDefinitionVersionType.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Elsa.Models; -using HotChocolate.Types; - -namespace Elsa.Server.GraphQL.Types -{ - public class WorkflowDefinitionVersionType : ObjectType - { - protected override void Configure(IObjectTypeDescriptor descriptor) - { - //descriptor.Field(x => x.Variables).Type(); - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/Types/WorkflowInputType.cs b/src/server/Elsa.Server.GraphQL/Types/WorkflowInputType.cs deleted file mode 100644 index c25e8f5d0..000000000 --- a/src/server/Elsa.Server.GraphQL/Types/WorkflowInputType.cs +++ /dev/null @@ -1,13 +0,0 @@ -using Elsa.Server.GraphQL.Models; -using HotChocolate.Types; - -namespace Elsa.Server.GraphQL.Types -{ - public class WorkflowInputType : InputObjectType - { - protected override void Configure(IInputObjectTypeDescriptor descriptor) - { - descriptor.Field(x => x.Variables).Type(); - } - } -} \ No newline at end of file diff --git a/src/server/Elsa.Server.GraphQL/icon.png b/src/server/Elsa.Server.GraphQL/icon.png deleted file mode 100644 index f978a28829e4f03aa270e4f0f2162bb8c41bed2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16374 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 elsa - .UsePersistence(config => config.UseSqLite(connectionString))); + .AddElsa( + elsa => elsa + .UsePersistence(config => config.UseSqLite(connectionString))); services - .AddElsaServer() .AddElsaApiEndpoints() - - .AddCors(options => options.AddDefaultPolicy(cors => cors - .AllowAnyOrigin() - .AllowAnyMethod() - .AllowAnyHeader())) + .AddCors( + options => options.AddDefaultPolicy( + cors => cors + .AllowAnyOrigin() + .AllowAnyMethod() + .AllowAnyHeader())) .AddConsoleActivities() .AddHttpActivities(options => options.Bind(elsaSection.GetSection("Http"))) @@ -54,7 +55,9 @@ namespace Elsa.Server.Host app .UseCors() - .UseHttpActivities(); + .UseHttpActivities() + .UseRouting() + .UseEndpoints(configure => configure.MapControllers()); } } } \ No newline at end of file diff --git a/test/component/Elsa.ComponentTests/Endpoints/WorkflowDefinitions/PostTests.cs b/test/component/Elsa.ComponentTests/Endpoints/WorkflowDefinitions/PostTests.cs index d520c617e..6d9faa18b 100644 --- a/test/component/Elsa.ComponentTests/Endpoints/WorkflowDefinitions/PostTests.cs +++ b/test/component/Elsa.ComponentTests/Endpoints/WorkflowDefinitions/PostTests.cs @@ -39,7 +39,7 @@ namespace Elsa.ComponentTests.Endpoints.WorkflowDefinitions Assert.Equal(HttpStatusCode.Created, response.StatusCode); } - private CreateWorkflowDefinitionRequest CreateWorkflowDefinitionRequest() + private SaveWorkflowDefinitionRequest CreateWorkflowDefinitionRequest() { var writeLine = new ActivityDefinition { @@ -55,7 +55,7 @@ namespace Elsa.ComponentTests.Endpoints.WorkflowDefinitions var activities = new[] { writeLine, readLine }; var connections = new[] { new ConnectionDefinition(writeLine.Id, readLine.Id, OutcomeNames.Done) }; - return _fixture.Build() + return _fixture.Build() .With(x => x.Activities, activities) .With(x => x.Connections, connections) .Create();