diff --git a/docker-compose-no-webapi.yml b/docker-compose-no-webapi.yml
index fb33b4aaf..081207587 100644
--- a/docker-compose-no-webapi.yml
+++ b/docker-compose-no-webapi.yml
@@ -30,7 +30,18 @@ services:
interval: 5s
timeout: 20s
retries: 5
-
+
+ dialogporten-redis:
+ image: redis:7.0-alpine
+ restart: always
+ ports:
+ - "6379:6379"
+ healthcheck:
+ test: ["CMD", "redis-cli", "ping"]
+ interval: 10s
+ timeout: 5s
+ retries: 5
+
dialogporten-service:
build:
context: .
diff --git a/docker-compose.yml b/docker-compose.yml
index c275d969a..fa9456f50 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -10,8 +10,10 @@ services:
depends_on:
dialogporten-postgres:
condition: service_healthy
-
+ dialogporten-redis:
+ condition: service_healthy
environment:
+ - Infrastructure:Redis:ConnectionString=dialogporten-redis:6379
- Infrastructure:DialogDbConnectionString=${DB_CONNECTION_STRING}
- Serilog__WriteTo__0__Name=Console
- Serilog__MinimumLevel__Default=Debug
diff --git a/src/Digdir.Domain.Dialogporten.Infrastructure/Digdir.Domain.Dialogporten.Infrastructure.csproj b/src/Digdir.Domain.Dialogporten.Infrastructure/Digdir.Domain.Dialogporten.Infrastructure.csproj
index 322c17522..11e07520f 100644
--- a/src/Digdir.Domain.Dialogporten.Infrastructure/Digdir.Domain.Dialogporten.Infrastructure.csproj
+++ b/src/Digdir.Domain.Dialogporten.Infrastructure/Digdir.Domain.Dialogporten.Infrastructure.csproj
@@ -9,6 +9,7 @@
+
@@ -24,8 +25,10 @@
-
-
+
+
@@ -33,4 +36,4 @@
-
+
\ No newline at end of file
diff --git a/src/Digdir.Domain.Dialogporten.Infrastructure/InfrastructureExtensions.cs b/src/Digdir.Domain.Dialogporten.Infrastructure/InfrastructureExtensions.cs
index e6b9a288e..28fe47b96 100644
--- a/src/Digdir.Domain.Dialogporten.Infrastructure/InfrastructureExtensions.cs
+++ b/src/Digdir.Domain.Dialogporten.Infrastructure/InfrastructureExtensions.cs
@@ -26,6 +26,7 @@
using Digdir.Domain.Dialogporten.Infrastructure.Altinn.Events;
using Digdir.Domain.Dialogporten.Infrastructure.Altinn.OrganizationRegistry;
using Digdir.Domain.Dialogporten.Infrastructure.Altinn.ResourceRegistry;
+using StackExchange.Redis;
namespace Digdir.Domain.Dialogporten.Infrastructure;
@@ -51,11 +52,31 @@ public static IServiceCollection AddInfrastructure(this IServiceCollection servi
.ValidateOnStart();
var thisAssembly = Assembly.GetExecutingAssembly();
+
services
// Framework
- .AddValidatorsFromAssembly(thisAssembly, ServiceLifetime.Transient, includeInternalTypes: true)
- .AddDistributedMemoryCache()
- .AddDbContext((services, options) =>
+ .AddValidatorsFromAssembly(thisAssembly, ServiceLifetime.Transient, includeInternalTypes: true);
+
+ var infrastructureSettings = infrastructureConfigurationSection.Get()
+ ?? throw new InvalidOperationException("Failed to get Redis settings. Infrastructure settings must not be null.");
+
+ if (infrastructureSettings.Redis.Enabled == true)
+ {
+ services.AddStackExchangeRedisCache(options =>
+ {
+ var infrastructureSettings = infrastructureConfigurationSection.Get()
+ ?? throw new InvalidOperationException("Failed to get Redis connection string. Infrastructure settings must not be null.");
+ var connectionString = infrastructureSettings.Redis.ConnectionString;
+ options.Configuration = connectionString;
+ options.InstanceName = "Redis";
+ });
+ }
+ else
+ {
+ services.AddDistributedMemoryCache();
+ }
+
+ services.AddDbContext((services, options) =>
{
var connectionString = services.GetRequiredService>()
.Value.DialogDbConnectionString;
diff --git a/src/Digdir.Domain.Dialogporten.Infrastructure/InfrastructureSettings.cs b/src/Digdir.Domain.Dialogporten.Infrastructure/InfrastructureSettings.cs
index 747302f78..65be366ae 100644
--- a/src/Digdir.Domain.Dialogporten.Infrastructure/InfrastructureSettings.cs
+++ b/src/Digdir.Domain.Dialogporten.Infrastructure/InfrastructureSettings.cs
@@ -9,6 +9,7 @@ public sealed class InfrastructureSettings
public const string ConfigurationSectionName = "Infrastructure";
public required string DialogDbConnectionString { get; init; }
+ public required RedisSettings Redis { get; init; }
public required AltinnPlatformSettings Altinn { get; init; }
public required AltinnCdnPlatformSettings AltinnCdn { get; init; }
public required MaskinportenSettings Maskinporten { get; init; }
@@ -26,12 +27,19 @@ public sealed class AltinnCdnPlatformSettings
public required Uri BaseUri { get; init; }
}
+public sealed class RedisSettings
+{
+ public required bool? Enabled { get; init; }
+ public required string ConnectionString { get; init; }
+}
+
internal sealed class InfrastructureSettingsValidator : AbstractValidator
{
public InfrastructureSettingsValidator(
IValidator altinnPlatformSettingsValidator,
IValidator altinnCdnPlatformSettingsValidator,
- IValidator maskinportenSettingsValidator)
+ IValidator maskinportenSettingsValidator,
+ IValidator redisSettingsValidator)
{
RuleFor(x => x.DialogDbConnectionString)
.NotEmpty();
@@ -47,6 +55,10 @@ public InfrastructureSettingsValidator(
RuleFor(x => x.Maskinporten)
.NotEmpty()
.SetValidator(maskinportenSettingsValidator);
+
+ RuleFor(x => x.Redis)
+ .NotEmpty()
+ .SetValidator(redisSettingsValidator);
}
}
@@ -76,3 +88,12 @@ public MaskinportenSettingsValidator()
RuleFor(x => x.EncodedJwk).NotEmpty();
}
}
+
+internal sealed class RedisSettingsValidator : AbstractValidator
+{
+ public RedisSettingsValidator()
+ {
+ RuleFor(x => x.Enabled).Must(x => x is false or true);
+ RuleFor(x => x.ConnectionString).NotEmpty();
+ }
+}
\ No newline at end of file
diff --git a/src/Digdir.Domain.Dialogporten.WebApi/Digdir.Domain.Dialogporten.WebApi.csproj b/src/Digdir.Domain.Dialogporten.WebApi/Digdir.Domain.Dialogporten.WebApi.csproj
index b59d826fc..183261741 100644
--- a/src/Digdir.Domain.Dialogporten.WebApi/Digdir.Domain.Dialogporten.WebApi.csproj
+++ b/src/Digdir.Domain.Dialogporten.WebApi/Digdir.Domain.Dialogporten.WebApi.csproj
@@ -12,21 +12,23 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
\ No newline at end of file
diff --git a/src/Digdir.Domain.Dialogporten.WebApi/appsettings.Development.json b/src/Digdir.Domain.Dialogporten.WebApi/appsettings.Development.json
index 1a1e03a25..b07097573 100644
--- a/src/Digdir.Domain.Dialogporten.WebApi/appsettings.Development.json
+++ b/src/Digdir.Domain.Dialogporten.WebApi/appsettings.Development.json
@@ -6,6 +6,10 @@
}
},
"Infrastructure": {
+ "Redis": {
+ "Enabled": true,
+ "ConnectionString": "localhost:6379"
+ },
"DialogDbConnectionString": "TODO: Add to local secrets",
// Settings from appsettings.json, environment variables or other configuration providers.
// The first three are always mandatory for all client definitions types
diff --git a/src/Digdir.Domain.Dialogporten.WebApi/appsettings.staging.json b/src/Digdir.Domain.Dialogporten.WebApi/appsettings.staging.json
index ba8afc94a..dd48e6bc3 100644
--- a/src/Digdir.Domain.Dialogporten.WebApi/appsettings.staging.json
+++ b/src/Digdir.Domain.Dialogporten.WebApi/appsettings.staging.json
@@ -6,6 +6,10 @@
}
},
"Infrastructure": {
+ "Redis":{
+ "Enabled": true,
+ "ConnectionString": "TODO: Add to local secrets"
+ },
"DialogDbConnectionString": "TODO: Add to local secrets",
// Settings from appsettings.json, environment variables or other configuration providers.
// The first three are always mandatory for all client definitions types
diff --git a/src/Digdir.Domain.Dialogporten.WebApi/appsettings.test.json b/src/Digdir.Domain.Dialogporten.WebApi/appsettings.test.json
index 5a4e21667..79783b00d 100644
--- a/src/Digdir.Domain.Dialogporten.WebApi/appsettings.test.json
+++ b/src/Digdir.Domain.Dialogporten.WebApi/appsettings.test.json
@@ -6,6 +6,10 @@
}
},
"Infrastructure": {
+ "Redis":{
+ "Enabled": true,
+ "ConnectionString": "TODO: Add to local secrets"
+ },
"DialogDbConnectionString": "TODO: Add to local secrets",
// Settings from appsettings.json, environment variables or other configuration providers.
// The first three are always mandatory for all client definitions types