fix(audit): ScadaBridge C3 review — safe enum-parse (fallback) in SqliteAuditWriter.MapRow + AuditEventDtoMapper.FromDto (Task 2.5)
This commit is contained in:
@@ -800,9 +800,9 @@ public class SqliteAuditWriter : IAuditWriter, ISiteAuditQueue, IAsyncDisposable
|
||||
System.Globalization.CultureInfo.InvariantCulture,
|
||||
System.Globalization.DateTimeStyles.RoundtripKind),
|
||||
IngestedAtUtc: null,
|
||||
Channel: Enum.Parse<AuditChannel>(reader.GetString(2)),
|
||||
Kind: Enum.Parse<AuditKind>(reader.GetString(3)),
|
||||
Status: Enum.Parse<AuditStatus>(reader.GetString(11)),
|
||||
Channel: AuditRowProjection.ParseEnum<AuditChannel>(reader.GetString(2), AuditChannel.ApiInbound),
|
||||
Kind: AuditRowProjection.ParseEnum<AuditKind>(reader.GetString(3), AuditKind.InboundRequest),
|
||||
Status: AuditRowProjection.ParseEnum<AuditStatus>(reader.GetString(11), AuditStatus.Submitted),
|
||||
CorrelationId: reader.IsDBNull(4) ? null : Guid.Parse(reader.GetString(4)),
|
||||
ExecutionId: reader.IsDBNull(21) ? null : Guid.Parse(reader.GetString(21)),
|
||||
ParentExecutionId: reader.IsDBNull(22) ? null : Guid.Parse(reader.GetString(22)),
|
||||
|
||||
@@ -173,7 +173,13 @@ public static class AuditRowProjection
|
||||
return evt with { DetailsJson = AuditDetailsCodec.Serialize(d) };
|
||||
}
|
||||
|
||||
private static TEnum ParseEnum<TEnum>(string? value, TEnum fallback) where TEnum : struct, Enum
|
||||
/// <summary>
|
||||
/// Case-sensitive <see cref="Enum.TryParse{TEnum}"/> with a caller-supplied fallback.
|
||||
/// Returns <paramref name="fallback"/> when <paramref name="value"/> is null, empty,
|
||||
/// or does not match any declared member name — so callers never throw on an
|
||||
/// unknown/renamed enum string (legacy or corrupt rows degrade gracefully).
|
||||
/// </summary>
|
||||
public static TEnum ParseEnum<TEnum>(string? value, TEnum fallback) where TEnum : struct, Enum
|
||||
=> !string.IsNullOrEmpty(value) && Enum.TryParse<TEnum>(value, ignoreCase: false, out var parsed)
|
||||
? parsed
|
||||
: fallback;
|
||||
|
||||
@@ -105,9 +105,9 @@ public static class AuditEventDtoMapper
|
||||
EventId: Guid.Parse(dto.EventId),
|
||||
OccurredAtUtc: DateTime.SpecifyKind(dto.OccurredAtUtc.ToDateTime(), DateTimeKind.Utc),
|
||||
IngestedAtUtc: null,
|
||||
Channel: Enum.Parse<AuditChannel>(dto.Channel),
|
||||
Kind: Enum.Parse<AuditKind>(dto.Kind),
|
||||
Status: Enum.Parse<AuditStatus>(dto.Status),
|
||||
Channel: AuditRowProjection.ParseEnum<AuditChannel>(dto.Channel, AuditChannel.ApiInbound),
|
||||
Kind: AuditRowProjection.ParseEnum<AuditKind>(dto.Kind, AuditKind.InboundRequest),
|
||||
Status: AuditRowProjection.ParseEnum<AuditStatus>(dto.Status, AuditStatus.Submitted),
|
||||
CorrelationId: NullIfEmpty(dto.CorrelationId) is { } cid ? Guid.Parse(cid) : null,
|
||||
ExecutionId: NullIfEmpty(dto.ExecutionId) is { } eid ? Guid.Parse(eid) : null,
|
||||
ParentExecutionId: NullIfEmpty(dto.ParentExecutionId) is { } pid ? Guid.Parse(pid) : null,
|
||||
|
||||
Reference in New Issue
Block a user