From 69d9661fc03e4041be28ae0f42b496a8adf2f1b9 Mon Sep 17 00:00:00 2001 From: Sipke Schoorstra Date: Mon, 1 Jun 2026 22:28:38 +0200 Subject: [PATCH] Use shared secret name normalization --- .../Repositories/EFCoreSecretRepository.cs | 16 +++++++--------- .../EFCoreSecretRepositoryTests.cs | 3 +++ 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/modules/Elsa.Secrets.Persistence.EFCore/Repositories/EFCoreSecretRepository.cs b/src/modules/Elsa.Secrets.Persistence.EFCore/Repositories/EFCoreSecretRepository.cs index c5ec513d9..c30d78f64 100644 --- a/src/modules/Elsa.Secrets.Persistence.EFCore/Repositories/EFCoreSecretRepository.cs +++ b/src/modules/Elsa.Secrets.Persistence.EFCore/Repositories/EFCoreSecretRepository.cs @@ -5,7 +5,7 @@ using Microsoft.EntityFrameworkCore; namespace Elsa.Secrets.Persistence.EFCore.Repositories; -public class EFCoreSecretRepository(Store store) : ISecretRepository +public class EFCoreSecretRepository(Store store, ISecretNameValidator secretNameValidator) : ISecretRepository { public async Task GetAsync(string normalizedName, CancellationToken cancellationToken = default) { @@ -29,7 +29,7 @@ public class EFCoreSecretRepository(Store store) : public async Task AddAsync(Secret secret, CancellationToken cancellationToken = default) { await using var dbContext = await store.CreateDbContextAsync(cancellationToken); - var normalizedName = NormalizeName(secret.Name); + var normalizedName = secretNameValidator.Normalize(secret.Name); if (await ExistsByNormalizedNameAsync(dbContext, normalizedName, cancellationToken)) throw new InvalidOperationException($"A secret named '{secret.Name}' already exists."); @@ -105,9 +105,9 @@ public class EFCoreSecretRepository(Store store) : target.Versions = source.Versions.ToList(); } - private static Task FindByNameAsync(SecretsElsaDbContext dbContext, string name, CancellationToken cancellationToken) + private Task FindByNameAsync(SecretsElsaDbContext dbContext, string name, CancellationToken cancellationToken) { - var normalizedName = NormalizeName(name); + var normalizedName = secretNameValidator.Normalize(name); return dbContext.Secrets.FirstOrDefaultAsync(x => EF.Property(x, SecretShadowPropertyNames.NormalizedName) == normalizedName, cancellationToken); } @@ -150,13 +150,11 @@ public class EFCoreSecretRepository(Store store) : private async Task IsNameConflictAsync(string name, CancellationToken cancellationToken) { await using var dbContext = await store.CreateDbContextAsync(cancellationToken); - return await ExistsByNormalizedNameAsync(dbContext, NormalizeName(name), cancellationToken); + return await ExistsByNormalizedNameAsync(dbContext, secretNameValidator.Normalize(name), cancellationToken); } - private static void SetNormalizedName(SecretsElsaDbContext dbContext, Secret secret) + private void SetNormalizedName(SecretsElsaDbContext dbContext, Secret secret) { - dbContext.Entry(secret).Property(SecretShadowPropertyNames.NormalizedName).CurrentValue = NormalizeName(secret.Name); + dbContext.Entry(secret).Property(SecretShadowPropertyNames.NormalizedName).CurrentValue = secretNameValidator.Normalize(secret.Name); } - - private static string NormalizeName(string name) => name.Trim().ToLowerInvariant(); } diff --git a/test/unit/Elsa.Secrets.UnitTests/EFCoreSecretRepositoryTests.cs b/test/unit/Elsa.Secrets.UnitTests/EFCoreSecretRepositoryTests.cs index ac09021fa..526a52b70 100644 --- a/test/unit/Elsa.Secrets.UnitTests/EFCoreSecretRepositoryTests.cs +++ b/test/unit/Elsa.Secrets.UnitTests/EFCoreSecretRepositoryTests.cs @@ -1,9 +1,11 @@ using Elsa.Persistence.EFCore; using Elsa.Persistence.EFCore.Extensions; +using Elsa.Secrets.Contracts; using Elsa.Secrets.Models; using Elsa.Secrets.Persistence.EFCore; using Elsa.Secrets.Persistence.EFCore.Repositories; using Elsa.Secrets.Persistence.EFCore.Sqlite.Extensions; +using Elsa.Secrets.Services; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Xunit; @@ -21,6 +23,7 @@ public class EFCoreSecretRepositoryTests : IAsyncLifetime var connectionString = $"Data Source={_databasePath}"; services.AddSqliteEntityModelCreatingHandlers(); services.AddDbContextFactory(builder => builder.UseElsaSqlite(typeof(SqliteSecretsPersistenceFeatureExtensions).Assembly, connectionString)); + services.AddSingleton(); services.AddScoped>(); services.AddScoped(); _serviceProvider = services.BuildServiceProvider();