summaryrefslogtreecommitdiffstats
path: root/src/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/server')
-rw-r--r--src/server/GlobalUsings.cs24
-rw-r--r--src/server/IOL.BookmarkThing.Server.csproj5
-rw-r--r--src/server/Jobs/JobRegister.cs18
-rw-r--r--src/server/Jobs/TokenCleanupJob.cs19
-rw-r--r--src/server/Startup.cs25
-rw-r--r--src/server/Utilities/QuartzJsonSerializer.cs16
6 files changed, 90 insertions, 17 deletions
diff --git a/src/server/GlobalUsings.cs b/src/server/GlobalUsings.cs
index 882de1c..2134083 100644
--- a/src/server/GlobalUsings.cs
+++ b/src/server/GlobalUsings.cs
@@ -1,17 +1,7 @@
global using System.Security.Claims;
global using System.Text.Json;
global using System.Text.Json.Serialization;
-global using Swashbuckle.AspNetCore.SwaggerGen;
-global using Serilog;
-global using Microsoft.AspNetCore.Mvc.Versioning;
-global using IOL.Helpers;
-global using IOL.BookmarkThing.Server.Models.General;
-global using IOL.BookmarkThing.Server.Models.Result;
-global using IOL.BookmarkThing.Server.Models.Database;
-global using IOL.BookmarkThing.Server.Api;
-global using IOL.BookmarkThing.Server.StaticData;
-global using IOL.BookmarkThing.Server.Utilities;
-global using IOL.BookmarkThing.Server.Api.V1;
+global using System.Reflection;
global using Microsoft.OpenApi.Models;
global using Microsoft.AspNetCore.Authentication;
global using Microsoft.AspNetCore.Authorization;
@@ -21,3 +11,15 @@ global using Microsoft.AspNetCore.DataProtection;
global using Microsoft.EntityFrameworkCore;
global using Microsoft.AspNetCore.Mvc.ApiExplorer;
global using Microsoft.AspNetCore.Mvc.Controllers;
+global using Microsoft.AspNetCore.Mvc.Versioning;
+global using IOL.BookmarkThing.Server.Models.General;
+global using IOL.BookmarkThing.Server.Models.Result;
+global using IOL.BookmarkThing.Server.Models.Database;
+global using IOL.BookmarkThing.Server.StaticData;
+global using IOL.BookmarkThing.Server.Utilities;
+global using IOL.BookmarkThing.Server.Api.V1;
+global using IOL.BookmarkThing.Server.Jobs;
+global using IOL.Helpers;
+global using Swashbuckle.AspNetCore.SwaggerGen;
+global using Serilog;
+global using Quartz;
diff --git a/src/server/IOL.BookmarkThing.Server.csproj b/src/server/IOL.BookmarkThing.Server.csproj
index e68b37e..1b7c0b4 100644
--- a/src/server/IOL.BookmarkThing.Server.csproj
+++ b/src/server/IOL.BookmarkThing.Server.csproj
@@ -27,12 +27,9 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.2" />
+ <PackageReference Include="Quartz.Extensions.Hosting" Version="3.3.3" />
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="6.2.3" />
</ItemGroup>
-
- <ItemGroup>
- <Folder Include="AppData\data-protection-keys" />
- </ItemGroup>
</Project>
diff --git a/src/server/Jobs/JobRegister.cs b/src/server/Jobs/JobRegister.cs
new file mode 100644
index 0000000..98eac97
--- /dev/null
+++ b/src/server/Jobs/JobRegister.cs
@@ -0,0 +1,18 @@
+using Quartz;
+
+namespace IOL.BookmarkThing.Server.Jobs;
+
+public static class JobRegister
+{
+ public static readonly JobKey TokenCleanupKey = new("TokenCleanupJob");
+
+ public static IServiceCollectionQuartzConfigurator RegisterJobs(this IServiceCollectionQuartzConfigurator configurator) {
+ configurator.AddJob<TokenCleanupJob>(TokenCleanupKey);
+ configurator.AddTrigger(options => {
+ options.ForJob(TokenCleanupKey)
+ .WithIdentity(TokenCleanupKey.Name + "-trigger")
+ .WithCronSchedule(CronScheduleBuilder.DailyAtHourAndMinute(1, 0));
+ });
+ return configurator;
+ }
+}
diff --git a/src/server/Jobs/TokenCleanupJob.cs b/src/server/Jobs/TokenCleanupJob.cs
new file mode 100644
index 0000000..99e7d0d
--- /dev/null
+++ b/src/server/Jobs/TokenCleanupJob.cs
@@ -0,0 +1,19 @@
+namespace IOL.BookmarkThing.Server.Jobs;
+
+public class TokenCleanupJob : IJob
+{
+ private readonly ILogger<TokenCleanupJob> _logger;
+ private readonly AppDbContext _context;
+
+ public TokenCleanupJob(ILogger<TokenCleanupJob> logger, AppDbContext context) {
+ _logger = logger;
+ _context = context;
+ }
+
+ public Task Execute(IJobExecutionContext context) {
+ var staleTokens = _context.AccessTokens.Where(c => c.HasExpired);
+ _logger.LogInformation("Removing {0} stale tokens", staleTokens.Count());
+ _context.AccessTokens.RemoveRange();
+ return Task.CompletedTask;
+ }
+}
diff --git a/src/server/Startup.cs b/src/server/Startup.cs
index a1b6eb1..4b7c097 100644
--- a/src/server/Startup.cs
+++ b/src/server/Startup.cs
@@ -1,5 +1,3 @@
-using System.Reflection;
-
namespace IOL.BookmarkThing.Server;
public class Startup
@@ -21,6 +19,16 @@ public class Startup
return $"Server={host};Port={port};Database={database};User Id={user};Password={password}";
}
+ public string QuartzDatabaseConnectionString() {
+ var host = Configuration.GetValue<string>("QUARTZ_DB_HOST");
+ var port = Configuration.GetValue<string>("QUARTZ_DB_PORT");
+ var database = Configuration.GetValue<string>("QUARTZ_DB_NAME");
+ var user = Configuration.GetValue<string>("QUARTZ_DB_USER");
+ var password = Configuration.GetValue<string>("QUARTZ_DB_PASSWORD");
+ return $"Server={host};Port={port};Database={database};User Id={user};Password={password}";
+ }
+
+
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services) {
services.AddDataProtection()
@@ -46,6 +54,19 @@ public class Startup
}
});
+ services.AddQuartz(options => {
+ options.UsePersistentStore(o => {
+ o.UsePostgres(QuartzDatabaseConnectionString());
+ o.UseSerializer<QuartzJsonSerializer>();
+ });
+ options.UseMicrosoftDependencyInjectionJobFactory();
+ options.RegisterJobs();
+ });
+
+ services.AddQuartzHostedService(options => {
+ options.WaitForJobsToComplete = true;
+ });
+
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(options => {
options.Cookie.Name = "bookmarkthing_session";
diff --git a/src/server/Utilities/QuartzJsonSerializer.cs b/src/server/Utilities/QuartzJsonSerializer.cs
new file mode 100644
index 0000000..0caa63a
--- /dev/null
+++ b/src/server/Utilities/QuartzJsonSerializer.cs
@@ -0,0 +1,16 @@
+using Quartz.Spi;
+
+namespace IOL.BookmarkThing.Server.Utilities;
+
+public class QuartzJsonSerializer : IObjectSerializer
+{
+ public void Initialize() { }
+
+ public byte[] Serialize<T>(T obj) where T : class {
+ return JsonSerializer.SerializeToUtf8Bytes(obj);
+ }
+
+ public T? DeSerialize<T>(byte[] data) where T : class {
+ return JsonSerializer.Deserialize<T>(data);
+ }
+}