feat(delmia-notifier): config loader + SCADABRIDGE_API_KEY resolution

This commit is contained in:
Joseph Doherty
2026-06-26 05:12:27 -04:00
parent 3e964acff6
commit 991c263c3e
4 changed files with 108 additions and 0 deletions
@@ -0,0 +1,38 @@
using System.Text.Json;
namespace ZB.MOM.WW.ScadaBridge.DelmiaNotifier;
/// <summary>Reads and interprets the notifier's configuration and secret. Parse logic is string-based so it is unit-testable without touching disk.</summary>
internal static class ConfigLoader
{
private const string ApiKeyEnvVar = "SCADABRIDGE_API_KEY";
/// <summary>Deserialize the <c>appsettings.json</c> text via the source-gen context.</summary>
public static NotifierConfig Load(string jsonText) =>
JsonSerializer.Deserialize(jsonText, NotifierJsonContext.Default.NotifierConfig) ?? new NotifierConfig();
/// <summary>Read and parse the <c>appsettings.json</c> sitting next to the executable.</summary>
public static NotifierConfig LoadFromDefaultFile()
{
var path = Path.Combine(AppContext.BaseDirectory, "appsettings.json");
return Load(File.ReadAllText(path));
}
/// <summary>Split a comma-separated base-URL list into trimmed, non-empty entries.</summary>
public static string[] SplitBaseUrls(string? baseUrls)
{
if (string.IsNullOrWhiteSpace(baseUrls))
{
return [];
}
return baseUrls.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
}
/// <summary>Resolve the API key from <c>SCADABRIDGE_API_KEY</c>; null/whitespace → null. Env accessor is injected for testability.</summary>
public static string? ResolveApiKey(Func<string, string?> envGet)
{
var key = envGet(ApiKeyEnvVar);
return string.IsNullOrWhiteSpace(key) ? null : key;
}
}
@@ -0,0 +1,19 @@
namespace ZB.MOM.WW.ScadaBridge.DelmiaNotifier;
/// <summary>Root of <c>appsettings.json</c>; mirrors the <c>ScadaBridge</c> section only.</summary>
internal sealed class NotifierConfig
{
public ScadaBridgeSection ScadaBridge { get; set; } = new();
}
internal sealed class ScadaBridgeSection
{
/// <summary>Comma-separated failover list of base URLs (the method path is appended by the app).</summary>
public string? BaseUrls { get; set; }
/// <summary>Per-attempt HTTP timeout in seconds.</summary>
public int TimeoutSeconds { get; set; } = 30;
/// <summary>Optional diagnostic log file (relative to the exe); null/omitted → stderr only.</summary>
public string? LogPath { get; set; }
}
@@ -4,4 +4,5 @@ namespace ZB.MOM.WW.ScadaBridge.DelmiaNotifier;
[JsonSerializable(typeof(RecipeDownload))]
[JsonSerializable(typeof(RecipeDownloadResult))]
[JsonSerializable(typeof(NotifierConfig))]
internal partial class NotifierJsonContext : JsonSerializerContext;