52 lines
2.1 KiB
C#
52 lines
2.1 KiB
C#
using ScadaLink.Communication.Grpc;
|
|
|
|
namespace ScadaLink.AuditLog.Site.Telemetry;
|
|
|
|
/// <summary>
|
|
/// Default <see cref="ISiteStreamAuditClient"/> registered by
|
|
/// <see cref="ScadaLink.AuditLog.ServiceCollectionExtensions.AddAuditLog"/>.
|
|
/// It is a no-op binding for composition roots that have no
|
|
/// <c>SiteCommunicationActor</c> — central and test roots. Site roles override
|
|
/// it in the Host with the ClusterClient-based
|
|
/// <see cref="ClusterClientSiteAuditClient"/>, which actually forwards audit
|
|
/// telemetry to central.
|
|
/// </summary>
|
|
/// <remarks>
|
|
/// <para>
|
|
/// Returns an empty <see cref="IngestAck"/> so the
|
|
/// <see cref="SiteAuditTelemetryActor"/> doesn't flip any rows to
|
|
/// <c>Forwarded</c> when this NoOp is in effect — rows stay <c>Pending</c>
|
|
/// until a real client (or a test stub) takes over.
|
|
/// </para>
|
|
/// <para>
|
|
/// Audit-write paths are best-effort by contract: a NoOp client keeps the
|
|
/// host running cleanly and is consistent with "audit-write failures never
|
|
/// abort the user-facing action".
|
|
/// </para>
|
|
/// </remarks>
|
|
public sealed class NoOpSiteStreamAuditClient : ISiteStreamAuditClient
|
|
{
|
|
private static readonly IngestAck EmptyAck = new();
|
|
|
|
/// <inheritdoc/>
|
|
public Task<IngestAck> IngestAuditEventsAsync(AuditEventBatch batch, CancellationToken ct)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(batch);
|
|
// Empty ack — no EventIds will be flipped to Forwarded, so rows stay
|
|
// Pending until the real ClusterClientSiteAuditClient (or a test stub)
|
|
// takes over.
|
|
return Task.FromResult(EmptyAck);
|
|
}
|
|
|
|
/// <inheritdoc/>
|
|
public Task<IngestAck> IngestCachedTelemetryAsync(CachedTelemetryBatch batch, CancellationToken ct)
|
|
{
|
|
ArgumentNullException.ThrowIfNull(batch);
|
|
// Empty ack — same rationale as IngestAuditEventsAsync. The site still
|
|
// writes the audit + tracking rows to its SQLite stores authoritatively;
|
|
// central-side state only materialises once the real
|
|
// ClusterClientSiteAuditClient (or a test stub) is wired in.
|
|
return Task.FromResult(EmptyAck);
|
|
}
|
|
}
|