more audit work
This commit is contained in:
@@ -132,7 +132,7 @@ public sealed class TeamsConnectorErrorTests
|
||||
// Assert
|
||||
result.Success.Should().BeFalse();
|
||||
result.ShouldRetry.Should().BeFalse("invalid webhook is permanent");
|
||||
result.ErrorCode.Should().Be("WEBHOOK_NOT_FOUND");
|
||||
result.ErrorCode.Should().Be("INVALID_WEBHOOK_URL");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
// </summary>
|
||||
// ---------------------------------------------------------------------
|
||||
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Nodes;
|
||||
@@ -373,7 +374,7 @@ public sealed class TeamsNotificationEvent
|
||||
public DateTime Timestamp { get; set; }
|
||||
public Dictionary<string, object> Payload { get; set; } = new();
|
||||
public required TeamsRecipient Recipient { get; set; }
|
||||
public Dictionary<string, string> Metadata { get; set; } = new();
|
||||
public Dictionary<string, object> Metadata { get; set; } = new();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -462,7 +463,7 @@ public sealed class TeamsFormatter
|
||||
var digest = evt.Payload.GetValueOrDefault("image_digest")?.ToString() ?? "unknown";
|
||||
var shortDigest = digest.Length > 15 ? $"`{digest[..15]}...`" : $"`{digest}`";
|
||||
var scanId = evt.Payload.GetValueOrDefault("scan_id")?.ToString() ?? "unknown";
|
||||
var durationMs = Convert.ToInt64(evt.Payload.GetValueOrDefault("scan_duration_ms") ?? 0);
|
||||
var durationMs = GetPayloadInt64(evt.Payload, "scan_duration_ms");
|
||||
var findingsUrl = evt.Payload.GetValueOrDefault("findings_url")?.ToString();
|
||||
|
||||
var card = new TeamsMessageCard
|
||||
@@ -660,6 +661,27 @@ public sealed class TeamsFormatter
|
||||
.Replace("<", "<")
|
||||
.Replace(">", ">");
|
||||
}
|
||||
|
||||
private static long GetPayloadInt64(IReadOnlyDictionary<string, object> payload, string key, long defaultValue = 0)
|
||||
{
|
||||
if (!payload.TryGetValue(key, out var value) || value is null)
|
||||
{
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
return value switch
|
||||
{
|
||||
long longValue => longValue,
|
||||
int intValue => intValue,
|
||||
JsonElement element => element.ValueKind == JsonValueKind.Number && element.TryGetInt64(out var parsed)
|
||||
? parsed
|
||||
: defaultValue,
|
||||
string text => long.TryParse(text, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsed)
|
||||
? parsed
|
||||
: defaultValue,
|
||||
_ => defaultValue
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@@ -21,5 +21,14 @@
|
||||
<PackageReference Include="FluentAssertions" />
|
||||
<PackageReference Include="NSubstitute" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="Fixtures\\**\\*.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Include="Expected\\**\\*.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user