< Summary

Information
Class: NostrSure.Domain.Services.ModularNostrEventValidator
Assembly: NostrSure.Domain
File(s): /home/runner/work/NostrSure/NostrSure/NostrSure.Domain/Services/ModularNostrEventValidator.cs
Line coverage
90%
Covered lines: 57
Uncovered lines: 6
Coverable lines: 63
Total lines: 111
Line coverage: 90.4%
Branch coverage
54%
Covered branches: 23
Total branches: 42
Branch coverage: 54.7%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ValidateAsync()42.3%272688.88%
Validate(...)100%210%
ValidateSignature(...)75%44100%
ValidateKind(...)75%44100%
ValidateTags(...)75%44100%
ValidateEventId(...)75%44100%

File(s)

/home/runner/work/NostrSure/NostrSure/NostrSure.Domain/Services/ModularNostrEventValidator.cs

#LineLine coverage
 1using Microsoft.Extensions.Logging;
 2using NostrSure.Domain.Entities;
 3using NostrSure.Domain.Interfaces;
 4using NostrSure.Domain.Validation;
 5
 6namespace NostrSure.Domain.Services;
 7
 8/// <summary>
 9/// Main validator that orchestrates the validation pipeline with high performance and backward compatibility
 10/// </summary>
 11public sealed class ModularNostrEventValidator : INostrEventValidator
 12{
 13    private readonly IEventSignatureValidator _signatureValidator;
 14    private readonly IEventIdValidator _eventIdValidator;
 15    private readonly IEventKindValidator _kindValidator;
 16    private readonly IEventTagValidator _tagValidator;
 17    private readonly ILogger<ModularNostrEventValidator>? _logger;
 18
 1419    public ModularNostrEventValidator(
 1420        IEventSignatureValidator signatureValidator,
 1421        IEventIdValidator eventIdValidator,
 1422        IEventKindValidator kindValidator,
 1423        IEventTagValidator tagValidator,
 1424        ILogger<ModularNostrEventValidator>? logger = null)
 1425    {
 1426        _signatureValidator = signatureValidator;
 1427        _eventIdValidator = eventIdValidator;
 1428        _kindValidator = kindValidator;
 1429        _tagValidator = tagValidator;
 1430        _logger = logger;
 1431    }
 32
 33    public async Task<ValidationResult> ValidateAsync(NostrEvent evt, CancellationToken cancellationToken = default)
 10434    {
 35        // Fast path: validate cheap operations first
 10436        var kindResult = _kindValidator.ValidateKind(evt);
 10437        if (!kindResult.IsValid)
 138        {
 139            _logger?.LogWarning("Event kind validation failed: {Error}", kindResult.Error?.Message);
 140            return kindResult;
 41        }
 42
 10343        var tagResult = _tagValidator.ValidateTags(evt);
 10344        if (!tagResult.IsValid)
 145        {
 146            _logger?.LogWarning("Event tag validation failed: {Error}", tagResult.Error?.Message);
 147            return tagResult;
 48        }
 49
 50        // Expensive operations with async support for potential parallelization
 10251        var eventIdTask = _eventIdValidator.ValidateEventIdAsync(evt, cancellationToken);
 10252        var signatureTask = _signatureValidator.ValidateSignatureAsync(evt, cancellationToken);
 53
 54        // Wait for both expensive operations to complete
 10255        await Task.WhenAll(eventIdTask, signatureTask);
 56
 10257        var eventIdResult = eventIdTask.Result;
 10258        if (!eventIdResult.IsValid)
 059        {
 060            _logger?.LogWarning("Event ID validation failed: {Error}", eventIdResult.Error?.Message);
 061            return eventIdResult;
 62        }
 63
 10264        var signatureResult = signatureTask.Result;
 10265        if (!signatureResult.IsValid)
 166        {
 167            _logger?.LogWarning("Signature validation failed: {Error}", signatureResult.Error?.Message);
 168            return signatureResult;
 69        }
 70
 10171        _logger?.LogDebug("Event validation completed successfully for event {EventId}", evt.Id);
 10172        return ValidationResult.Success();
 10473    }
 74
 75    public ValidationResult Validate(NostrEvent evt)
 076    {
 077        return ValidateAsync(evt).GetAwaiter().GetResult();
 078    }
 79
 80    #region Legacy Compatibility Methods
 81
 82    public bool ValidateSignature(NostrEvent evt, out string error)
 183    {
 184        var result = _signatureValidator.ValidateSignature(evt);
 185        error = result.Error?.Message ?? string.Empty;
 186        return result.IsValid;
 187    }
 88
 89    public bool ValidateKind(NostrEvent evt, out string error)
 190    {
 191        var result = _kindValidator.ValidateKind(evt);
 192        error = result.Error?.Message ?? string.Empty;
 193        return result.IsValid;
 194    }
 95
 96    public bool ValidateTags(NostrEvent evt, out string error)
 197    {
 198        var result = _tagValidator.ValidateTags(evt);
 199        error = result.Error?.Message ?? string.Empty;
 1100        return result.IsValid;
 1101    }
 102
 103    public bool ValidateEventId(NostrEvent evt, out string error)
 1104    {
 1105        var result = _eventIdValidator.ValidateEventId(evt);
 1106        error = result.Error?.Message ?? string.Empty;
 1107        return result.IsValid;
 1108    }
 109
 110    #endregion
 111}