Refatoração e atualizações de dependências

- Modificado `InvoiceIngestionService` para usar `IServiceScopeFactory`, permitindo melhor gerenciamento do ciclo de vida de dependências.
- Atualizações de pacotes em diversos projetos (`ComplianceNFs.Core`, `ComplianceNFs.Infrastructure`, `ComplianceNFs.Service`, `ComplianceNFs.Monitor`, `ComplianceNFs.Infrastructure.Tests`).
- Alterado namespace de `AuditComplianceNFsTest.cs` para `ComplianceNFs.Infrastructure.Tests`.
- Refatorações no `AttachmentRepository` e `ComplianceNFsDbContext` para simplificar código e melhorar legibilidade.
- Atualizado teste `InvoiceIngestionServiceTests` para refletir mudanças no uso de escopos de serviço.
- Melhorias gerais na arquitetura e alinhamento com boas práticas.
This commit is contained in:
Giuliano Paschoalino 2025-10-01 09:10:18 -03:00
parent c48ba4710d
commit e49192dac1
10 changed files with 45 additions and 37 deletions

View File

@ -8,6 +8,7 @@ using ComplianceNFs.Core.Ports;
using System.Linq; using System.Linq;
using System.Numerics; using System.Numerics;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
namespace ComplianceNFs.Core.Application.Services namespace ComplianceNFs.Core.Application.Services
{ {
@ -15,15 +16,14 @@ namespace ComplianceNFs.Core.Application.Services
public class InvoiceIngestionService : IInvoiceIngestionService public class InvoiceIngestionService : IInvoiceIngestionService
{ {
private readonly IMailListener _mailListener; private readonly IMailListener _mailListener;
private readonly IAttachmentRepository _attachmentRepository;
private readonly IXmlParser _xmlParser; private readonly IXmlParser _xmlParser;
private readonly IPdfParser _pdfParser; private readonly IPdfParser _pdfParser;
private readonly ILogger<InvoiceIngestionService> _logger; private readonly ILogger<InvoiceIngestionService> _logger;
private readonly IServiceScopeFactory _scopeFactory;
public InvoiceIngestionService(IMailListener mailListener, IAttachmentRepository attachmentRepository, IXmlParser xmlParser, IPdfParser pdfParser, ILogger<InvoiceIngestionService> logger) public InvoiceIngestionService(IMailListener mailListener, IServiceScopeFactory scopeFactory, IXmlParser xmlParser, IPdfParser pdfParser, ILogger<InvoiceIngestionService> logger)
{ {
_mailListener = mailListener; _mailListener = mailListener;
_attachmentRepository = attachmentRepository; _scopeFactory = scopeFactory;
_xmlParser = xmlParser; _xmlParser = xmlParser;
_pdfParser = pdfParser; _pdfParser = pdfParser;
_logger = logger; _logger = logger;
@ -31,6 +31,8 @@ namespace ComplianceNFs.Core.Application.Services
} }
private async void OnNewMailReceived(MailMessage mail) private async void OnNewMailReceived(MailMessage mail)
{ {
using var scope = _scopeFactory.CreateScope();
var _attachmentRepository = scope.ServiceProvider.GetRequiredService<IAttachmentRepository>();
_logger.LogInformation("New mail received: {Subject}", mail.Subject); _logger.LogInformation("New mail received: {Subject}", mail.Subject);
try try
{ {

View File

@ -6,6 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.0-preview.4.25258.110" /> <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.0-preview.4.25258.110" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.0-preview.4.25258.110" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0-preview.4.25258.110" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0-preview.4.25258.110" />
</ItemGroup> </ItemGroup>

View File

@ -3,7 +3,7 @@ using System.Text.Json;
using System.IO; using System.IO;
using NUnit.Framework; using NUnit.Framework;
namespace ComplianceNFs.Tests namespace ComplianceNFs.Infrastructure.Tests
{ {
[TestFixture] [TestFixture]
public class AuditComplianceNFsTest public class AuditComplianceNFsTest

View File

@ -10,13 +10,20 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="coverlet.collector" Version="3.2.0" /> <PackageReference Include="coverlet.collector" Version="6.0.4">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.9" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0-preview.4.25258.110" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0-preview.4.25258.110" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.7.1" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
<PackageReference Include="Moq" Version="4.20.72" /> <PackageReference Include="Moq" Version="4.20.72" />
<PackageReference Include="NUnit" Version="4.3.2" /> <PackageReference Include="NUnit" Version="4.4.0" />
<PackageReference Include="xunit" Version="2.4.2" /> <PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5" /> <PackageReference Include="xunit.runner.visualstudio" Version="3.1.4">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -9,6 +9,7 @@ using ComplianceNFs.Core.Application.Services;
using ComplianceNFs.Core.Ports; using ComplianceNFs.Core.Ports;
using ComplianceNFs.Core.Entities; using ComplianceNFs.Core.Entities;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
namespace ComplianceNFs.Infrastructure.Tests namespace ComplianceNFs.Infrastructure.Tests
{ {
@ -19,17 +20,26 @@ namespace ComplianceNFs.Infrastructure.Tests
{ {
// Arrange // Arrange
var mockMailListener = new Mock<IMailListener>(); var mockMailListener = new Mock<IMailListener>();
var mockScopeFactory = new Mock<IServiceScopeFactory>();
var mockScope = new Mock<IServiceScope>();
var mockProvider = new Mock<IServiceProvider>();
var mockAttachmentRepo = new Mock<IAttachmentRepository>(); var mockAttachmentRepo = new Mock<IAttachmentRepository>();
var mockXmlParser = new Mock<IXmlParser>(); var mockXmlParser = new Mock<IXmlParser>();
var mockPdfParser = new Mock<IPdfParser>(); var mockPdfParser = new Mock<IPdfParser>();
var mockLogger = new Mock<ILogger<InvoiceIngestionService>>(); var mockLogger = new Mock<ILogger<InvoiceIngestionService>>();
mockProvider.Setup(x => x.GetService(typeof(IAttachmentRepository)))
.Returns(mockAttachmentRepo.Object);
mockScope.Setup(x => x.ServiceProvider).Returns(mockProvider.Object);
mockScopeFactory.Setup(x => x.CreateScope()).Returns(mockScope.Object);
var testParsed = new ParsedInvoice { CnpjComp = "123", NumeroNF = "456" }; var testParsed = new ParsedInvoice { CnpjComp = "123", NumeroNF = "456" };
mockXmlParser.Setup(x => x.Parse(It.IsAny<Stream>())).Returns(testParsed); mockXmlParser.Setup(x => x.Parse(It.IsAny<Stream>())).Returns(testParsed);
var service = new InvoiceIngestionService( var service = new InvoiceIngestionService(
mockMailListener.Object, mockMailListener.Object,
mockAttachmentRepo.Object, mockScopeFactory.Object,
mockXmlParser.Object, mockXmlParser.Object,
mockPdfParser.Object, mockPdfParser.Object,
mockLogger.Object mockLogger.Object

View File

@ -5,22 +5,22 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="MailKit" Version="4.12.1" /> <PackageReference Include="MailKit" Version="4.13.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.6" /> <PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.6"> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.9">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.0-preview.4.25258.110" /> <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="10.0.0-preview.4.25258.110" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.0-preview.4.25258.110" /> <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.0-preview.4.25258.110" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.0" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="9.0.9" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.0-preview.4.25258.110" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.0-preview.4.25258.110" />
<PackageReference Include="Microsoft.Office.Interop.Outlook" Version="15.0.4797.1004" /> <PackageReference Include="Microsoft.Office.Interop.Outlook" Version="15.0.4797.1004" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.4" />
<PackageReference Include="Npgsql" Version="9.0.3" /> <PackageReference Include="Npgsql" Version="9.0.3" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
<PackageReference Include="System.Data.OleDb" Version="10.0.0-preview.4.25258.110" /> <PackageReference Include="System.Data.OleDb" Version="10.0.0-preview.4.25258.110" />
<PackageReference Include="Unimake.DFe" Version="20250610.1145.39" /> <PackageReference Include="Unimake.DFe" Version="20250924.1732.21" />
</ItemGroup> </ItemGroup>
<PropertyGroup> <PropertyGroup>

View File

@ -10,16 +10,10 @@ using Microsoft.EntityFrameworkCore;
namespace ComplianceNFs.Infrastructure.Repositories namespace ComplianceNFs.Infrastructure.Repositories
{ {
public class AttachmentRepository : IAttachmentRepository public class AttachmentRepository(ComplianceNFsDbContext dbContext, ILogger<AttachmentRepository> logger) : IAttachmentRepository
{ {
private readonly ComplianceNFsDbContext _dbContext; private readonly ComplianceNFsDbContext _dbContext = dbContext;
private readonly ILogger<AttachmentRepository> _logger; private readonly ILogger<AttachmentRepository> _logger = logger;
public AttachmentRepository(ComplianceNFsDbContext dbContext, ILogger<AttachmentRepository> logger)
{
_dbContext = dbContext;
_logger = logger;
}
public async Task SaveRawAsync(EnergyInvoice invoice) public async Task SaveRawAsync(EnergyInvoice invoice)
{ {
@ -40,11 +34,7 @@ namespace ComplianceNFs.Infrastructure.Repositories
{ {
try try
{ {
var invoice = await _dbContext.EnergyInvoices.FirstOrDefaultAsync(e => e.InvoiceId == invoiceId); var invoice = await _dbContext.EnergyInvoices.FirstOrDefaultAsync(e => e.InvoiceId == invoiceId) ?? throw new InvalidOperationException($"Invoice with ID {invoiceId} not found.");
if (invoice == null)
{
throw new InvalidOperationException($"Invoice with ID {invoiceId} not found.");
}
invoice.MatchedCodTE = matchedCodTE; invoice.MatchedCodTE = matchedCodTE;
invoice.Status = status; invoice.Status = status;
invoice.DiscrepancyNotes = notes; invoice.DiscrepancyNotes = notes;

View File

@ -3,10 +3,8 @@ using ComplianceNFs.Core.Entities;
namespace ComplianceNFs.Infrastructure.Repositories namespace ComplianceNFs.Infrastructure.Repositories
{ {
public class ComplianceNFsDbContext : DbContext public class ComplianceNFsDbContext(DbContextOptions<ComplianceNFsDbContext> options) : DbContext(options)
{ {
public ComplianceNFsDbContext(DbContextOptions<ComplianceNFsDbContext> options) : base(options) { }
public DbSet<EnergyInvoice> EnergyInvoices { get; set; } public DbSet<EnergyInvoice> EnergyInvoices { get; set; }
// Add other DbSets as needed (e.g., BuyingRecord, etc.) // Add other DbSets as needed (e.g., BuyingRecord, etc.)
} }

View File

@ -3,8 +3,8 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.0-preview.4.25258.110" /> <PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.0-preview.4.25258.110" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.0-preview.4.25258.110" /> <PackageReference Include="Microsoft.Extensions.Logging" Version="10.0.0-preview.4.25258.110" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.6" /> <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="9.0.9" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="9.0.6" /> <PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="9.0.9" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@ -8,7 +8,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.6"> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.9">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>