Skip to content

Commit

Permalink
Merge pull request #63 from AMalininHere/next
Browse files Browse the repository at this point in the history
Next version of the library
  • Loading branch information
TechnoBerry committed May 24, 2023
2 parents 880a602 + 1c10d1d commit e74b663
Show file tree
Hide file tree
Showing 114 changed files with 1,097 additions and 1,218 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/publish.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ jobs:
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.x
dotnet-version: 7.0.x
- name: Get the version
id: get_version
run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//}
Expand Down
12 changes: 4 additions & 8 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,14 @@ jobs:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
steps:
- uses: actions/checkout@v2
- name: Setup .NET Core 3.1
uses: actions/setup-dotnet@v1
with:
dotnet-version: 3.1.x
- name: Setup .NET 5.0
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.x
- name: Setup .NET 6.0
uses: actions/setup-dotnet@v1
with:
dotnet-version: 6.0.x
- name: Setup .NET 7.0
uses: actions/setup-dotnet@v1
with:
dotnet-version: 7.0.x
- name: Unit tests
run: dotnet test ./test/Camunda.Worker.Tests/Camunda.Worker.Tests.csproj --collect:"XPlat Code Coverage" --settings ./coverlet.runsettings -r ./coverage
- name: Upload coverage to Codecov
Expand Down
17 changes: 13 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,24 @@ public class SayHelloHandler : IExternalTaskHandler
{
public async Task<IExecutionResult> HandleAsync(ExternalTask externalTask, CancellationToken cancellationToken)
{
var username = externalTask.Variables["USERNAME"].Value;
if (!externalTask.TryGetVariable<StringVariable>("USERNAME", out var usernameVariable))
{
return new BpmnErrorResult("NO_USER", "Username not provided");
}

var username = usernameVariable.Value;

await Task.Delay(1000);
await Task.Delay(1000, cancellationToken);

return new CompleteResult
{
Variables = new Dictionary<string, Variable>
Variables = new Dictionary<string, VariableBase>
{
["MESSAGE"] = Variable.String("Hello, Guest!")
["MESSAGE"] = new StringVariable($"Hello, {username}!"),
["USER_INFO"] = JsonVariable.Create(new UserInfo(username, new List<string>
{
"Admin"
}))
}
};
}
Expand Down
2 changes: 1 addition & 1 deletion global.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"sdk": {
"version": "6.0.100",
"version": "7.0.200",
"rollForward": "latestMinor"
}
}
5 changes: 3 additions & 2 deletions samples/SampleCamundaWorker/Handlers/SayHelloGuestHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Threading;
using System.Threading.Tasks;
using Camunda.Worker;
using Camunda.Worker.Variables;

namespace SampleCamundaWorker.Handlers;

Expand All @@ -12,9 +13,9 @@ public Task<IExecutionResult> HandleAsync(ExternalTask externalTask, Cancellatio
{
return Task.FromResult<IExecutionResult>(new CompleteResult
{
Variables = new Dictionary<string, Variable>
Variables = new Dictionary<string, VariableBase>
{
["MESSAGE"] = Variable.String("Hello, Guest!")
["MESSAGE"] = new StringVariable("Hello, Guest!")
}
});
}
Expand Down
26 changes: 22 additions & 4 deletions samples/SampleCamundaWorker/Handlers/SayHelloHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Threading;
using System.Threading.Tasks;
using Camunda.Worker;
using Camunda.Worker.Variables;

namespace SampleCamundaWorker.Handlers;

Expand All @@ -11,21 +12,38 @@ public class SayHelloHandler : IExternalTaskHandler
{
public async Task<IExecutionResult> HandleAsync(ExternalTask externalTask, CancellationToken cancellationToken)
{
if (!externalTask.Variables.TryGetValue("USERNAME", out var usernameVariable))
if (!externalTask.TryGetVariable<StringVariable>("USERNAME", out var usernameVariable))
{
return new BpmnErrorResult("NO_USER", "Username not provided");
}

var username = usernameVariable.Value;

await Task.Delay(1000);
await Task.Delay(1000, cancellationToken);

return new CompleteResult
{
Variables = new Dictionary<string, Variable>
Variables = new Dictionary<string, VariableBase>
{
["MESSAGE"] = Variable.String($"Hello, {username}!")
["MESSAGE"] = new StringVariable($"Hello, {username}!"),
["USER_INFO"] = JsonVariable.Create(new UserInfo(username, new List<string>
{
"Admin"
}))
}
};
}

public class UserInfo
{
public UserInfo(string username, List<string> roles)
{
Username = username;
Roles = roles;
}

public string Username { get; }

public List<string> Roles { get; }
}
}
2 changes: 1 addition & 1 deletion samples/SampleCamundaWorker/SampleCamundaWorker.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFramework>net7.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>

Expand Down
10 changes: 5 additions & 5 deletions src/Camunda.Worker/BpmnErrorResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@
using System.Net;
using System.Threading.Tasks;
using Camunda.Worker.Client;
using Camunda.Worker.Variables;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;

namespace Camunda.Worker;

public sealed class BpmnErrorResult : IExecutionResult
{
public BpmnErrorResult(string errorCode, string errorMessage, IDictionary<string, Variable>? variables = null)
public BpmnErrorResult(string errorCode, string errorMessage, Dictionary<string, VariableBase>? variables = null)
{
ErrorCode = Guard.NotEmptyAndNotNull(errorCode, nameof(errorCode));
ErrorMessage = Guard.NotEmptyAndNotNull(errorMessage, nameof(errorMessage));
Expand All @@ -18,7 +20,7 @@ public BpmnErrorResult(string errorCode, string errorMessage, IDictionary<string

public string ErrorCode { get; }
public string ErrorMessage { get; }
public IDictionary<string, Variable>? Variables { get; }
public Dictionary<string, VariableBase>? Variables { get; }

public async Task ExecuteResultAsync(IExternalTaskContext context)
{
Expand All @@ -38,9 +40,7 @@ public async Task ExecuteResultAsync(IExternalTaskContext context)
catch (ClientException e) when (e.StatusCode == HttpStatusCode.InternalServerError)
{
var logger = context.ServiceProvider.GetService<ILogger<BpmnErrorResult>>();
logger?.LogWarning(e, "Failed completion of task {TaskId}. Reason: {Reason}",
externalTask.Id, e.Message
);
logger?.LogResult_FailedCompletion(externalTask.Id, e.Message, e);
await client.ReportFailureAsync(externalTask.Id, new ReportFailureRequest(externalTask.WorkerId)
{
ErrorMessage = e.ErrorType,
Expand Down
23 changes: 7 additions & 16 deletions src/Camunda.Worker/Camunda.Worker.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
<PublishRepositoryUrl>true</PublishRepositoryUrl>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<TargetFrameworks>net5.0;net6.0;netcoreapp3.1;netstandard2.0</TargetFrameworks>
<TargetFrameworks>net6.0;net7.0</TargetFrameworks>
</PropertyGroup>

<ItemGroup>
Expand All @@ -21,23 +21,14 @@
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Options" Version="6.0.0" />
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1" PrivateAssets="All" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net5.0'">
<PackageReference Update="Microsoft.Extensions.DependencyInjection.Abstractions" Version="5.0.0" />
<PackageReference Update="Microsoft.Extensions.Hosting.Abstractions" Version="5.0.0" />
<PackageReference Update="Microsoft.Extensions.Http" Version="5.0.0" />
<PackageReference Update="Microsoft.Extensions.Logging.Abstractions" Version="5.0.0" />
<PackageReference Update="Microsoft.Extensions.Options" Version="5.0.0" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.1'">
<PackageReference Update="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.0" />
<PackageReference Update="Microsoft.Extensions.Hosting.Abstractions" Version="3.1.0" />
<PackageReference Update="Microsoft.Extensions.Http" Version="3.1.0" />
<PackageReference Update="Microsoft.Extensions.Logging.Abstractions" Version="3.1.0" />
<PackageReference Update="Microsoft.Extensions.Options" Version="3.1.0" />
<ItemGroup Condition="'$(TargetFramework)' == 'net7.0'">
<PackageReference Update="Microsoft.Extensions.DependencyInjection.Abstractions" Version="7.0.0" />
<PackageReference Update="Microsoft.Extensions.Hosting.Abstractions" Version="7.0.0" />
<PackageReference Update="Microsoft.Extensions.Http" Version="7.0.0" />
<PackageReference Update="Microsoft.Extensions.Logging.Abstractions" Version="7.0.0" />
<PackageReference Update="Microsoft.Extensions.Options" Version="7.0.0" />
</ItemGroup>

</Project>
49 changes: 33 additions & 16 deletions src/Camunda.Worker/CamundaWorkerBuilder.cs
Original file line number Diff line number Diff line change
@@ -1,64 +1,81 @@
using System;
using Camunda.Worker.Endpoints;
using Camunda.Worker.Execution;
using Camunda.Worker.Routing;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;

namespace Camunda.Worker;

public class CamundaWorkerBuilder : ICamundaWorkerBuilder
{
public CamundaWorkerBuilder(IServiceCollection services, string workerId)
public CamundaWorkerBuilder(IServiceCollection services, WorkerIdString workerId)
{
Services = services;
WorkerId = workerId;
}

public IServiceCollection Services { get; }

public string WorkerId { get; }
public WorkerIdString WorkerId { get; }

public ICamundaWorkerBuilder AddEndpointProvider<TProvider>()
where TProvider : class, IEndpointProvider
internal CamundaWorkerBuilder AddDefaultEndpointResolver()
{
Services.AddSingleton<IEndpointProvider, TProvider>();
AddEndpointResolver((workerId, provider) => new TopicBasedEndpointResolver(
workerId,
provider.GetRequiredService<IEndpointsCollection>()
));

return this;
}

public ICamundaWorkerBuilder AddEndpointResolver(WorkerServiceFactory<IEndpointResolver> factory)
{
Services.AddSingleton(provider => factory(WorkerId, provider));

return this;
}

public ICamundaWorkerBuilder AddTopicsProvider<TProvider>() where TProvider : class, ITopicsProvider
internal CamundaWorkerBuilder AddDefaultFetchAndLockRequestProvider()
{
Services.AddTransient<ITopicsProvider, TProvider>();
AddFetchAndLockRequestProvider((workerId, provider) => new FetchAndLockRequestProvider(
workerId,
provider.GetRequiredService<IOptionsMonitor<FetchAndLockOptions>>(),
provider.GetRequiredService<IEndpointsCollection>()
));

return this;
}

internal CamundaWorkerBuilder AddFetchAndLockRequestProvider(
Func<string, IServiceProvider, IFetchAndLockRequestProvider> factory
public ICamundaWorkerBuilder AddFetchAndLockRequestProvider(
WorkerServiceFactory<IFetchAndLockRequestProvider> factory
)
{
Services.AddSingleton(provider => factory(WorkerId, provider));

return this;
}

public ICamundaWorkerBuilder AddHandler(ExternalTaskDelegate handler, HandlerMetadata handlerMetadata)
public ICamundaWorkerBuilder AddHandler(ExternalTaskDelegate handler, EndpointMetadata endpointMetadata)
{
Guard.NotNull(handler, nameof(handler));
Guard.NotNull(handlerMetadata, nameof(handlerMetadata));
Guard.NotNull(endpointMetadata, nameof(endpointMetadata));

var descriptor = new HandlerDescriptor(handler, handlerMetadata);
var endpoint = new Endpoint(handler, endpointMetadata, WorkerId);

Services.AddSingleton(descriptor);
Services.AddSingleton(endpoint);
return this;
}

public ICamundaWorkerBuilder ConfigurePipeline(Action<IPipelineBuilder> configureAction)
{
Guard.NotNull(configureAction, nameof(configureAction));
Services.AddSingleton(provider =>
Services.AddSingleton<IExternalTaskProcessingService>(provider =>
{
var externalTaskDelegate = new PipelineBuilder(WorkerId, provider)
var externalTaskDelegate = new PipelineBuilder(provider, WorkerId)
.Also(configureAction)
.Build(ExternalTaskRouter.RouteAsync);
return new WorkerHandlerDescriptor(externalTaskDelegate);
return new ExternalTaskProcessingService(provider, externalTaskDelegate);
});
return this;
}
Expand Down
14 changes: 9 additions & 5 deletions src/Camunda.Worker/CamundaWorkerBuilderExtensions.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System;
using System.Reflection;
using System.Threading.Tasks;
using Camunda.Worker.Endpoints;
using Camunda.Worker.Execution;
using Microsoft.Extensions.DependencyInjection;

Expand All @@ -10,7 +11,7 @@ public static class CamundaWorkerBuilderExtensions
{
public static ICamundaWorkerBuilder AddHandler<T>(
this ICamundaWorkerBuilder builder,
Action<HandlerMetadata>? configureMetadata = null
Action<EndpointMetadata>? configureMetadata = null
)
where T : class, IExternalTaskHandler
{
Expand All @@ -22,26 +23,29 @@ public static class CamundaWorkerBuilderExtensions
return builder.AddHandler<T>(metadata);
}

private static HandlerMetadata CollectMetadataFromAttributes(Type handlerType)
private static EndpointMetadata CollectMetadataFromAttributes(Type handlerType)
{
var topicsAttribute = handlerType.GetCustomAttribute<HandlerTopicsAttribute>();

if (topicsAttribute == null)
{
throw new Exception($"\"{handlerType.FullName}\" doesn't provide any \"HandlerTopicsAttribute\"");
throw new ArgumentException(
$"\"{handlerType.FullName}\" doesn't provide any \"HandlerTopicsAttribute\"",
nameof(handlerType)
);
}

var variablesAttribute = handlerType.GetCustomAttribute<HandlerVariablesAttribute>();

return new HandlerMetadata(topicsAttribute.TopicNames, topicsAttribute.LockDuration)
return new EndpointMetadata(topicsAttribute.TopicNames, topicsAttribute.LockDuration)
{
LocalVariables = variablesAttribute?.LocalVariables ?? false,
Variables = variablesAttribute?.AllVariables ?? false ? null : variablesAttribute?.Variables,
IncludeExtensionProperties = topicsAttribute.IncludeExtensionProperties
};
}

public static ICamundaWorkerBuilder AddHandler<T>(this ICamundaWorkerBuilder builder, HandlerMetadata metadata)
public static ICamundaWorkerBuilder AddHandler<T>(this ICamundaWorkerBuilder builder, EndpointMetadata metadata)
where T : class, IExternalTaskHandler
{
Guard.NotNull(builder, nameof(builder));
Expand Down
3 changes: 2 additions & 1 deletion src/Camunda.Worker/Client/BpmnErrorRequest.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System.Collections.Generic;
using Camunda.Worker.Variables;

namespace Camunda.Worker.Client;

Expand All @@ -17,5 +18,5 @@ public BpmnErrorRequest(string workerId, string errorCode, string errorMessage)

public string ErrorMessage { get; }

public IDictionary<string, Variable>? Variables { get; set; }
public Dictionary<string, VariableBase>? Variables { get; set; }
}

0 comments on commit e74b663

Please sign in to comment.