Add hangfire

This commit is contained in:
Michał Zieliński
2025-10-12 18:28:14 +02:00
parent de5b8fbe16
commit b24aaab679
6 changed files with 152 additions and 0 deletions

View File

@@ -8,6 +8,9 @@
<ItemGroup>
<PackageReference Include="Google.Apis.Auth" Version="1.70.0" />
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.21" />
<PackageReference Include="Hangfire.Core" Version="1.8.21" />
<PackageReference Include="Hangfire.SqlServer" Version="1.8.21" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.17" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.17">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

View File

@@ -1,7 +1,10 @@
using System.Text;
using BimAI.API.Services;
using BimAI.Infrastructure.Data;
using BimAI.Infrastructure.Jobs;
using BimAI.Infrastructure.Sync;
using Hangfire;
using Hangfire.SqlServer;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;
@@ -18,6 +21,29 @@ builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// Start Hangfire section
builder.Services.AddHangfire(configuration => configuration
.SetDataCompatibilityLevel(CompatibilityLevel.Version_180)
.UseSimpleAssemblyNameTypeSerializer()
.UseRecommendedSerializerSettings()
.UseSqlServerStorage(builder.Configuration.GetConnectionString("HangfireConnection"),
new SqlServerStorageOptions
{
CommandBatchMaxTimeout = TimeSpan.FromMinutes(5),
SlidingInvisibilityTimeout = TimeSpan.FromMinutes(5),
QueuePollInterval = TimeSpan.Zero,
UseRecommendedIsolationLevel = true,
DisableGlobalLocks = true,
SchemaName = "Hangfire"
}
)
);
builder.Services.AddHangfireServer(options =>
{
options.ServerName = builder.Configuration["Hangfire:ServerName"];
options.WorkerCount = builder.Configuration.GetValue<int>("Hangfire:WorkerCount", 5);
});
// End Hangfire section
// Start auth section
var jwtSettings = builder.Configuration.GetSection("JwtSettings");
var secretKey = jwtSettings["SecretKey"];
@@ -65,7 +91,22 @@ if (app.Environment.IsDevelopment())
app.UseHttpsRedirection();
app.UseCors("AllowAll");
app.UseHangfireDashboard(builder.Configuration["Hangfire:DashboardPath"] ?? "/hangfire", new DashboardOptions
{
AsyncAuthorization = new[] { new HangfireAuthorizationFilter() },
DashboardTitle = "BimAI - Job Dashboard"
});
app.UseAuthorization();
app.UseAuthorization();
app.MapControllers();
RecurringJob.AddOrUpdate<ProductSyncJob>(
"product-sync",
job => job.ExecuteAsync(),
Cron.Daily(2, 0), // Every day at 2:00 AM
new RecurringJobOptions
{
TimeZone = TimeZoneInfo.Local
});
app.Run();

View File

@@ -0,0 +1,20 @@
using Hangfire.Dashboard;
namespace BimAI.API.Services;
public class HangfireAuthorizationFilter: IDashboardAsyncAuthorizationFilter
{
public Task<bool> AuthorizeAsync(DashboardContext context)
{
var httpContext = context.GetHttpContext();
var env = httpContext.RequestServices.GetService<IWebHostEnvironment>();
if (env.IsDevelopment())
{
return Task.FromResult(true);
}
var isAuthenticated = httpContext.User.Identity?.IsAuthenticated ?? false;
return Task.FromResult(isAuthenticated);
}
}