diff --git a/Core.TaskProcessor.Dashboard/Core.TaskProcessor.Dashboard.csproj b/Core.TaskProcessor.Dashboard/Core.TaskProcessor.Dashboard.csproj
new file mode 100644
index 0000000..7ef77c6
--- /dev/null
+++ b/Core.TaskProcessor.Dashboard/Core.TaskProcessor.Dashboard.csproj
@@ -0,0 +1,16 @@
+
+
+
+ net6.0;net7.0;net8.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
diff --git a/Core.TaskProcessor.Dashboard/TaskProcessorDashboardExtensions.cs b/Core.TaskProcessor.Dashboard/TaskProcessorDashboardExtensions.cs
new file mode 100644
index 0000000..38dc628
--- /dev/null
+++ b/Core.TaskProcessor.Dashboard/TaskProcessorDashboardExtensions.cs
@@ -0,0 +1,59 @@
+using Microsoft.AspNetCore.Builder;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace Core.TaskProcessor.Dashboard
+{
+ public class TaskProcessorDashboardOptions
+ {
+ public string Prefix { get; set; } = "/taskprocessor";
+ public Func> TenantProvider { get; set; } = _ => Task.FromResult("core");
+ }
+
+ public static class TaskProcessorDashboardExtensions
+ {
+ public static void AddTaskProcessorDashboard(this IServiceCollection services, TaskProcessorDashboardOptions options)
+ {
+ services.AddSingleton(options);
+ }
+
+ public static void MapTaskProcessorDashboard(this WebApplication app)
+ {
+ var options = app.Services.GetRequiredService();
+
+ app.MapGet($"{options.Prefix}/batches", async (ITaskProcessor proc) =>
+ {
+ return await proc.GetBatchesAsync("core", 0, 50);
+ });
+
+ app.MapGet($"{options.Prefix}/schedules", async (ITaskProcessor proc) =>
+ {
+ return await proc.GetSchedulesAsync("core", 0, 50);
+ });
+
+ app.MapGet($"{options.Prefix}/queues", async (ITaskProcessor proc) =>
+ {
+ return await proc.GetQueuesAsync();
+ });//.RequireAuthorization("taskprocessor_admin");
+
+ app.MapPost($"{options.Prefix}/batch/{{batchId}}/cancel", async (ITaskProcessor proc, [FromRoute] string batchId) =>
+ {
+ return await proc.CancelBatchAsync(batchId);
+ });//.RequireAuthorization("taskprocessor_admin");
+
+ app.MapPost($"{options.Prefix}/schedule/{{scheduleId}}/cancel", async (ITaskProcessor proc, [FromRoute] string scheduleId) =>
+ {
+
+ return await proc.CancelScheduleAsync(scheduleId, );
+ });//.RequireAuthorization("taskprocessor_admin");
+
+ app.MapPost($"{options.Prefix}/schedule/{{scheduleId}}/fire", async (ITaskProcessor proc, [FromRoute] string batchId) =>
+ {
+ return await proc.CancelBatchAsync(batchId);
+ });//.RequireAuthorization("taskprocessor_admin");
+
+ app.usesta
+ }
+ }
+}
diff --git a/Core.TaskProcessor.SampleWebApi/Core.TaskProcessor.SampleWebApi.csproj b/Core.TaskProcessor.SampleWebApi/Core.TaskProcessor.SampleWebApi.csproj
index 017db6b..2529c66 100644
--- a/Core.TaskProcessor.SampleWebApi/Core.TaskProcessor.SampleWebApi.csproj
+++ b/Core.TaskProcessor.SampleWebApi/Core.TaskProcessor.SampleWebApi.csproj
@@ -13,6 +13,7 @@
+
diff --git a/Core.TaskProcessor.SampleWebApi/Program.cs b/Core.TaskProcessor.SampleWebApi/Program.cs
index 4414748..7d65914 100644
--- a/Core.TaskProcessor.SampleWebApi/Program.cs
+++ b/Core.TaskProcessor.SampleWebApi/Program.cs
@@ -1,4 +1,5 @@
using Core.TaskProcessor;
+using Core.TaskProcessor.Dashboard;
using Core.TaskProcessor.SampleWebApi.Services;
var builder = WebApplication.CreateBuilder(args);
@@ -20,9 +21,19 @@
UseHostedService = true,
UseCronSeconds = true
});
+builder.Services.AddTaskProcessorDashboard(new TaskProcessorDashboardOptions
+{
+
+});
builder.Services.AddScoped();
+builder.Services.AddAuthorizationBuilder()
+ .AddPolicy("taskprocessor_admin", policy =>
+ policy
+ .RequireRole("taskprocessor"));
+
+
var app = builder.Build();
if (app.Environment.IsDevelopment())
@@ -34,6 +45,7 @@
app.UseAuthorization();
app.MapControllers();
+app.MapTaskProcessorDashboard();
{
var proc = app.Services.GetRequiredService();
diff --git a/Core.TaskProcessor.sln b/Core.TaskProcessor.sln
index 77e867a..7d29326 100644
--- a/Core.TaskProcessor.sln
+++ b/Core.TaskProcessor.sln
@@ -7,7 +7,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.TaskProcessor", "Core.
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.TaskProcessor.Tests", "Core.TaskProcessor.Tests\Core.TaskProcessor.Tests.csproj", "{47028D34-1E6E-4968-844D-080373CB5647}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.TaskProcessor.SampleWebApi", "Core.TaskProcessor.SampleWebApi\Core.TaskProcessor.SampleWebApi.csproj", "{A37C75D6-DD7A-4368-BAA0-CF6ACCAD8C8A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Core.TaskProcessor.SampleWebApi", "Core.TaskProcessor.SampleWebApi\Core.TaskProcessor.SampleWebApi.csproj", "{A37C75D6-DD7A-4368-BAA0-CF6ACCAD8C8A}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Core.TaskProcessor.Dashboard", "Core.TaskProcessor.Dashboard\Core.TaskProcessor.Dashboard.csproj", "{95F89C4F-A7D8-4177-BC64-EF15E73D9229}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -27,6 +29,10 @@ Global
{A37C75D6-DD7A-4368-BAA0-CF6ACCAD8C8A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A37C75D6-DD7A-4368-BAA0-CF6ACCAD8C8A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A37C75D6-DD7A-4368-BAA0-CF6ACCAD8C8A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {95F89C4F-A7D8-4177-BC64-EF15E73D9229}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {95F89C4F-A7D8-4177-BC64-EF15E73D9229}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {95F89C4F-A7D8-4177-BC64-EF15E73D9229}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {95F89C4F-A7D8-4177-BC64-EF15E73D9229}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE