diff --git a/Elsa.sln.DotSettings b/Elsa.sln.DotSettings index 2850b89bf..12055bae2 100644 --- a/Elsa.sln.DotSettings +++ b/Elsa.sln.DotSettings @@ -2,4 +2,5 @@ True True True + True True \ No newline at end of file diff --git a/src/designer/elsa-workflows-designer/package.json b/src/designer/elsa-workflows-designer/package.json index 565390623..d82e82166 100644 --- a/src/designer/elsa-workflows-designer/package.json +++ b/src/designer/elsa-workflows-designer/package.json @@ -1,6 +1,6 @@ { "name": "@elsa-workflows/elsa-workflows-designer", - "version": "3.0.2-preview.43", + "version": "3.0.2-preview.44", "description": "A workflow designer for Elsa 3", "main": "./dist/index.cjs.js", "module": "./dist/index.js", diff --git a/src/designer/elsa-workflows-designer/src/modules/login/components/login-page.tsx b/src/designer/elsa-workflows-designer/src/modules/login/components/login-page.tsx index c9f72e1a6..96740e08b 100644 --- a/src/designer/elsa-workflows-designer/src/modules/login/components/login-page.tsx +++ b/src/designer/elsa-workflows-designer/src/modules/login/components/login-page.tsx @@ -1,7 +1,6 @@ import {Component, h, State, Event, EventEmitter} from "@stencil/core"; import {LoginApi} from "../services"; import {Container} from "typedi"; -import jwt_decode from "jwt-decode"; import {AuthContext} from "../../../services"; import {SignedInArgs} from "../models"; @@ -43,7 +42,7 @@ export class LoginPage { const accessToken = loginResponse.accessToken; const refreshToken = loginResponse.refreshToken; const authContext = Container.get(AuthContext); - await authContext.signinTokens(accessToken, refreshToken, rememberMe); + await authContext.signin(accessToken, refreshToken, rememberMe); } private renderError = () => { diff --git a/src/designer/elsa-workflows-designer/src/modules/login/plugin.tsx b/src/designer/elsa-workflows-designer/src/modules/login/plugin.tsx index 58621ca6b..e80e31bee 100644 --- a/src/designer/elsa-workflows-designer/src/modules/login/plugin.tsx +++ b/src/designer/elsa-workflows-designer/src/modules/login/plugin.tsx @@ -6,7 +6,6 @@ import {Container, Service} from "typedi"; import {StudioService, AuthContext, EventBus, ElsaClient, ElsaClientProvider} from "../../services"; import descriptorsStore from '../../data/descriptors-store'; import {SignedInArgs} from "./models"; -import {AxiosInstance} from "axios"; import {LoginApi} from "./services"; @Service() @@ -64,14 +63,16 @@ export class LoginPlugin implements Plugin { }, async onResponseError(error) { - if (error.response.status !== 401 || error.response.config.hasRetriedRequest) + + if (error.response.status !== 401 || error.response.config.hasRetriedRequest) return; const authContext = Container.get(AuthContext); const loginResponse = await loginApi.refreshAccessToken(authContext.getRefreshToken()); + if (loginResponse.isAuthenticated) { - - await authContext.signinTokens(loginResponse.accessToken, loginResponse.refreshToken, true); + + await authContext.updateTokens(loginResponse.accessToken, loginResponse.refreshToken, true); const t = await service.http({ ...error.config, @@ -85,7 +86,7 @@ export class LoginPlugin implements Plugin { return t; } else { - authContext.signOut(); + await authContext.signOut(); } } }); diff --git a/src/designer/elsa-workflows-designer/src/modules/login/services.ts b/src/designer/elsa-workflows-designer/src/modules/login/services.ts index 8c40a0727..93ae3e8f9 100644 --- a/src/designer/elsa-workflows-designer/src/modules/login/services.ts +++ b/src/designer/elsa-workflows-designer/src/modules/login/services.ts @@ -1,9 +1,8 @@ import 'reflect-metadata'; -import {Container, Service} from "typedi"; -import {ElsaClientProvider, EventBus, ServerSettings} from "../../services"; +import {Service} from "typedi"; +import {ElsaClientProvider, ServerSettings} from "../../services"; import {LoginResponse} from "./models"; -import axios, {AxiosError, AxiosRequestConfig} from "axios"; -import {EventTypes} from "../../models"; +import axios, {AxiosRequestConfig} from "axios"; @Service() export class LoginApi { @@ -32,4 +31,4 @@ export class LoginApi { .then(response => response.data) .catch(error => error.response) } -} \ No newline at end of file +} diff --git a/src/designer/elsa-workflows-designer/src/services/auth.ts b/src/designer/elsa-workflows-designer/src/services/auth.ts index 7703987c5..dd23e3d2d 100644 --- a/src/designer/elsa-workflows-designer/src/services/auth.ts +++ b/src/designer/elsa-workflows-designer/src/services/auth.ts @@ -29,14 +29,19 @@ export class AuthContext { } } - async signinTokens(accessToken: string, refreshToken: string, createPersistentCookie: boolean){ + async signin(accessToken: string, refreshToken: string, createPersistentCookie: boolean){ + await this.updateTokens(accessToken, refreshToken, createPersistentCookie); + await this.eventBus.emit(EventTypes.Auth.SignedIn) + } + + async updateTokens(accessToken: string, refreshToken: string, createPersistentCookie: boolean){ const claims = jwt_decode(accessToken); const permissions = claims.permissions || []; const name = claims.name || ''; - await this.signIn(name, permissions, accessToken, refreshToken, createPersistentCookie); + await this.updateSession(name, permissions, accessToken, refreshToken, createPersistentCookie); } - async signIn(name: string, permissions: Array, accessToken: string, refreshToken: string, createPersistentCookie: boolean) { + updateSession(name: string, permissions: Array, accessToken: string, refreshToken: string, createPersistentCookie: boolean) { authStore.name = name; authStore.permissions = permissions; authStore.signedIn = true; @@ -49,8 +54,6 @@ export class AuthContext { if (createPersistentCookie) { cookies.set("dashboard-session", data); } - - await this.eventBus.emit(EventTypes.Auth.SignedIn) } async signOut() { diff --git a/src/modules/Elsa.Expressions/Models/JsonLiteral.cs b/src/modules/Elsa.Expressions/Models/JsonLiteral.cs index e38cf5836..60b5e0979 100644 --- a/src/modules/Elsa.Expressions/Models/JsonLiteral.cs +++ b/src/modules/Elsa.Expressions/Models/JsonLiteral.cs @@ -1,30 +1,53 @@ using System.Text.Json; +using System.Text.Json.Serialization; namespace Elsa.Expressions.Models; +/// +/// Represents a literal JSON expression. +/// public class JsonLiteral : MemoryBlockReference { + /// + [JsonConstructor] public JsonLiteral() { } + /// public JsonLiteral(string? value) { Value = value; } + /// + /// The literal JSON string value. + /// public string? Value { get; } + + /// public override MemoryBlock Declare() => new(); + /// + /// Serializes the value into a JSON string in the form of a + /// + /// + /// + /// public static JsonLiteral From(T value) => new JsonLiteral(value); } +/// +/// Represents a JSON string for the specified type T +/// public class JsonLiteral : JsonLiteral { + /// public JsonLiteral() { } + /// public JsonLiteral(T value) : base(JsonSerializer.Serialize(value!)) { } diff --git a/src/modules/Elsa.JavaScript/Implementations/TypeDescriber.cs b/src/modules/Elsa.JavaScript/Implementations/TypeDescriber.cs index 88d5f98aa..de6e0d845 100644 --- a/src/modules/Elsa.JavaScript/Implementations/TypeDescriber.cs +++ b/src/modules/Elsa.JavaScript/Implementations/TypeDescriber.cs @@ -26,8 +26,8 @@ public class TypeDescriber : ITypeDescriber { DeclarationKeyword = GetDeclarationKeyword(type), Name = type.Name, - Properties = GetPropertyDefinitions(type).ToList(), - Methods = GetMethodDefinitions(type).ToList() + Properties = GetPropertyDefinitions(type).DistinctBy(x => x.Name).ToList(), + Methods = GetMethodDefinitions(type).DistinctBy(x => x.Name).ToList() }; return typeDefinition; diff --git a/src/modules/Elsa.JavaScript/Providers/VariableTypeDefinitionProvider.cs b/src/modules/Elsa.JavaScript/Providers/VariableTypeDefinitionProvider.cs index 88af27577..d6b34973c 100644 --- a/src/modules/Elsa.JavaScript/Providers/VariableTypeDefinitionProvider.cs +++ b/src/modules/Elsa.JavaScript/Providers/VariableTypeDefinitionProvider.cs @@ -20,16 +20,21 @@ internal class VariableTypeDefinitionProvider : TypeDefinitionProvider protected override IEnumerable GetTypeDefinitions(TypeDefinitionContext context) { - var excludedTypes = new[] { typeof(ExpandoObject), typeof(IDictionary) }; + var excludedTypes = new Func[] + { + type => type == typeof(ExpandoObject), + type => typeof(IDictionary).IsAssignableFrom(type), + type => type == typeof(object) + }; var variableTypeQuery = from variable in context.Variables let variableType = variable.GetVariableType() - where (variableType.IsClass || variableType.IsInterface) && !variableType.IsPrimitive && !excludedTypes.Any(x => x.IsAssignableFrom(variableType)) + where (variableType.IsClass || variableType.IsInterface) && !variableType.IsPrimitive && !excludedTypes.Any(x => x(variableType)) select variableType; var variableTypes = variableTypeQuery.Distinct(); - + foreach (var variableType in variableTypes) { yield return _typeDescriber.DescribeType(variableType); diff --git a/src/modules/Elsa.Workflows.Core/Models/Input.cs b/src/modules/Elsa.Workflows.Core/Models/Input.cs index 03c0ea727..720d1566d 100644 --- a/src/modules/Elsa.Workflows.Core/Models/Input.cs +++ b/src/modules/Elsa.Workflows.Core/Models/Input.cs @@ -6,8 +6,12 @@ using Elsa.Workflows.Core.Expressions; namespace Elsa.Workflows.Core.Models; +/// +/// A base type for the type. +/// public abstract class Input : Argument { + /// protected Input(IExpression expression, MemoryBlockReference memoryBlockReference, Type type) : base(memoryBlockReference) { Expression = expression; @@ -19,60 +23,77 @@ public abstract class Input : Argument [JsonPropertyName("typeName")] public Type Type { get; set; } } +/// +/// Represents activity input that is evaluated at runtime. +/// public class Input : Input { + /// public Input(T literal, string? id = default) : this(new Literal(literal) { Id = id! }) { } + /// public Input(Func @delegate, string? id = default) : this(new DelegateBlockReference(() => @delegate()){ Id = id!}) { } + /// public Input(Func> @delegate) : this(new DelegateBlockReference(@delegate)) { } + /// public Input(Func> @delegate) : this(new DelegateBlockReference(@delegate)) { } + /// public Input(Func @delegate) : this(new DelegateBlockReference(@delegate)) { } + /// public Input(Variable variable) : base(new VariableExpression(variable), variable, typeof(T)) { } + /// public Input(Output output) : base(new OutputExpression(output), output.MemoryBlockReference(), typeof(T)) { } + /// public Input(Literal literal) : base(new LiteralExpression(literal.Value), literal, typeof(T)) { } + /// public Input(Literal literal) : base(new LiteralExpression(literal.Value), literal, typeof(T)) { } + /// public Input(JsonLiteral literal) : base(new JsonExpression(literal.Value), literal, typeof(T)) { } + /// public Input(JsonLiteral literal) : base(new JsonExpression(literal.Value), literal, typeof(T)) { } + /// public Input(DelegateBlockReference delegateBlockReference) : base(new DelegateExpression(delegateBlockReference), delegateBlockReference, typeof(T)) { } + /// public Input(ElsaExpression expression) : this(new ElsaExpressionBlockReference(expression)) { } + /// public Input(IExpression expression, MemoryBlockReference memoryBlockReference) : base(expression, memoryBlockReference, typeof(T)) { } diff --git a/src/modules/Elsa.Workflows.Core/Models/JsonObject.cs b/src/modules/Elsa.Workflows.Core/Models/JsonObject.cs deleted file mode 100644 index 3309d895a..000000000 --- a/src/modules/Elsa.Workflows.Core/Models/JsonObject.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Elsa.Expressions.Models; - -namespace Elsa.Workflows.Core.Models; - -public class JsonObject : MemoryBlockReference -{ - public JsonObject() - { - } - - public JsonObject(string? defaultValue) - { - DefaultValue = defaultValue; - } - - public string? Name { get; set; } - public string? DefaultValue { get; } - public override MemoryBlock Declare() => new(DefaultValue); -} \ No newline at end of file diff --git a/src/modules/Elsa.Workflows.Designer/package-lock.json b/src/modules/Elsa.Workflows.Designer/package-lock.json index 13b5d29f1..d86745707 100644 --- a/src/modules/Elsa.Workflows.Designer/package-lock.json +++ b/src/modules/Elsa.Workflows.Designer/package-lock.json @@ -5,7 +5,7 @@ "packages": { "": { "devDependencies": { - "@elsa-workflows/elsa-workflows-designer": "^3.0.2-preview.43", + "@elsa-workflows/elsa-workflows-designer": "^3.0.2-preview.44", "copy-webpack-plugin": "^11.0.0", "cross-env": "^7.0.3", "monaco-editor": "^0.34.1", @@ -115,9 +115,9 @@ } }, "node_modules/@elsa-workflows/elsa-workflows-designer": { - "version": "3.0.2-preview.43", - "resolved": "https://registry.npmjs.org/@elsa-workflows/elsa-workflows-designer/-/elsa-workflows-designer-3.0.2-preview.43.tgz", - "integrity": "sha512-9W7trl8k3yf9HSXHyyO514YENp2K8YvqChZw8U6sq4nD3iEd0DPEQ90HnDiLi7Dum4oAJZ42LM/m6ekKi0Ob7Q==", + "version": "3.0.2-preview.44", + "resolved": "https://registry.npmjs.org/@elsa-workflows/elsa-workflows-designer/-/elsa-workflows-designer-3.0.2-preview.44.tgz", + "integrity": "sha512-+mygygHGoJzCX4jWPgXYGjQh8yhb4tOAGbKuxTOKQNNtn+diBRgwY+MG33zQXRIVlyBun8OQv0T16i3Nun5s5g==", "dev": true, "dependencies": { "@antv/layout": "^0.3.11", @@ -2425,9 +2425,9 @@ "dev": true }, "@elsa-workflows/elsa-workflows-designer": { - "version": "3.0.2-preview.43", - "resolved": "https://registry.npmjs.org/@elsa-workflows/elsa-workflows-designer/-/elsa-workflows-designer-3.0.2-preview.43.tgz", - "integrity": "sha512-9W7trl8k3yf9HSXHyyO514YENp2K8YvqChZw8U6sq4nD3iEd0DPEQ90HnDiLi7Dum4oAJZ42LM/m6ekKi0Ob7Q==", + "version": "3.0.2-preview.44", + "resolved": "https://registry.npmjs.org/@elsa-workflows/elsa-workflows-designer/-/elsa-workflows-designer-3.0.2-preview.44.tgz", + "integrity": "sha512-+mygygHGoJzCX4jWPgXYGjQh8yhb4tOAGbKuxTOKQNNtn+diBRgwY+MG33zQXRIVlyBun8OQv0T16i3Nun5s5g==", "dev": true, "requires": { "@antv/layout": "^0.3.11", diff --git a/src/modules/Elsa.Workflows.Designer/package.json b/src/modules/Elsa.Workflows.Designer/package.json index f53e75c40..221e7cd98 100644 --- a/src/modules/Elsa.Workflows.Designer/package.json +++ b/src/modules/Elsa.Workflows.Designer/package.json @@ -6,7 +6,7 @@ "build:debug": "cross-env webpack --mode=development --env configuration=Debug" }, "devDependencies": { - "@elsa-workflows/elsa-workflows-designer": "^3.0.2-preview.43", + "@elsa-workflows/elsa-workflows-designer": "^3.0.2-preview.44", "copy-webpack-plugin": "^11.0.0", "cross-env": "^7.0.3", "monaco-editor": "^0.34.1", diff --git a/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionSyntaxProvider.cs b/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionSyntaxProvider.cs index 911f36392..f2f819105 100644 --- a/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionSyntaxProvider.cs +++ b/src/modules/Elsa.Workflows.Management/Providers/DefaultExpressionSyntaxProvider.cs @@ -34,7 +34,7 @@ public class DefaultExpressionSyntaxProvider : IExpressionSyntaxProvider private ExpressionSyntaxDescriptor CreateJsonDescriptor() => CreateDescriptor( "Json", CreateJsonExpression, - context => new JsonObject(context.GetExpression().Value), + context => new JsonLiteral(context.GetExpression().Value), expression => expression.Value); private ExpressionSyntaxDescriptor CreateDelegateDescriptor() => CreateDescriptor(