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