refactor: address code review findings across all projects

Apply comprehensive fixes from code reviews including:
- Extract shared utilities (SqlFormatHelper, CellValueConverter, DbDestinationBase)
- Add interface abstractions (IAuthenticationService, IDatabaseMigrator, IMisQueryBuilder)
- Implement SecureStore for encrypted secrets storage
- Fix error handling with proper HTTP status codes and logging
- Optimize double enumeration in DevEtlRegistry
- Add DataSync.Dev README for developer onboarding
- Extract filter panel base classes to reduce duplication
- Update code review docs to mark all issues as fixed
This commit is contained in:
Joseph Doherty
2026-01-19 11:05:36 -05:00
parent 08f5aa1447
commit 604bfe919c
148 changed files with 8696 additions and 1538 deletions
@@ -0,0 +1,40 @@
namespace JdeScoping.Core.Options;
/// <summary>
/// Configuration options for the secure secrets store.
/// </summary>
public class SecureStoreOptions
{
/// <summary>
/// Configuration section name in appsettings.json.
/// </summary>
public const string SectionName = "SecureStore";
/// <summary>
/// Path to the encrypted secrets store file.
/// Defaults to "data/secrets.json" relative to app directory.
/// </summary>
public string StorePath { get; set; } = "data/secrets.json";
/// <summary>
/// Path to the key file (used in development).
/// Defaults to "data/secrets.key" relative to app directory.
/// </summary>
public string KeyFilePath { get; set; } = "data/secrets.key";
/// <summary>
/// Environment variable name containing the master key (used in production).
/// If set and the env var exists, it takes precedence over the key file.
/// </summary>
public string MasterKeyEnvVar { get; set; } = "SCOPINGTOOL_MASTER_KEY";
/// <summary>
/// Whether to auto-create the store and generate a key file on first run.
/// </summary>
public bool AutoCreateStore { get; set; } = true;
/// <summary>
/// Whether to migrate existing secrets (RSA key, Excel passwords) on startup.
/// </summary>
public bool MigrateExistingSecrets { get; set; } = true;
}