Skip to content

Adds Docker support and updates dependencies#42

Merged
jldsilva merged 2 commits into
developmentfrom
Docker-Support
Aug 13, 2025
Merged

Adds Docker support and updates dependencies#42
jldsilva merged 2 commits into
developmentfrom
Docker-Support

Conversation

@jldsilva

@jldsilva jldsilva commented Aug 12, 2025

Copy link
Copy Markdown
Owner

Introduces Dockerfile and docker-compose for containerization.

Refactors project structure and moves external services to their own project.

Updates dependencies to the latest versions and fixes related issues.
Also adds .dockerignore to exclude unnecessary files during build.

Description by Callstackai

This PR introduces Docker support with a Dockerfile and docker-compose for containerization, refactors project structure, updates dependencies, and adds a .dockerignore file.

Diagrams of code changes
sequenceDiagram
    participant Client
    participant Docker
    participant API
    participant ConfigService
    participant Database

    Client->>Docker: Build Container
    Docker->>Docker: Multi-stage build
    Note over Docker: Uses base, build, publish, and final stages

    Docker->>API: Start API Container
    API->>ConfigService: Initialize Configuration
    ConfigService->>ConfigService: Load Configuration Sources
    Note over ConfigService: Loads from:<br/>1. appsettings.json<br/>2. appsettings.{env}.json<br/>3. User Secrets (Dev only)<br/>4. Environment Variables

    API->>Database: Configure PostgreSQL Connection
    Note over Database: Uses connection string from configuration

    Client->>API: HTTP/HTTPS Requests
    Note over API: Exposes ports:<br/>8080 (HTTP)<br/>8081 (HTTPS)
Loading
Files Changed
FileSummary
.dockerignoreAdds a .dockerignore file to exclude unnecessary files during Docker build.
Directory.Packages.propsUpdates package versions and adds central package transitive pinning.
InvoiceReminder.API/DockerfileAdds a Dockerfile for the InvoiceReminder API with multi-stage build.
docker-compose.ymlAdds a docker-compose file to define the service configuration.

This PR includes files in programming languages that we currently do not support. We have not reviewed files with the extensions .dockerignore, .props, .csproj, .json, .cs, .sln, .yml. See list of supported languages.

Summary by CodeRabbit

  • New Features
    • Docker multiestágio para a API, docker-compose, perfil "Container (Dockerfile)" e .dockerignore abrangente.
  • Refactor
    • Reescrita da montagem de configuração para suportar appsettings, environment variables e user secrets; ajustes na resolução de conexão DB.
  • Tests
    • Suite de testes reestruturada por projeto; testes de configuração convertidos para ConfigurationBuilder in-memory e mais cobertura.
  • Chores
    • Atualização de dependências (MSTest, EF Core, IdentityModel, tooling de containers), ajustes em csproj/solution e reorganização de referências de projetos.

Introduces Dockerfile and docker-compose for containerization.

Refactors project structure and moves external services to their own project.

Updates dependencies to the latest versions and fixes related issues.
Also adds .dockerignore to exclude unnecessary files during build.
@jldsilva jldsilva self-assigned this Aug 12, 2025
@jldsilva jldsilva added .NET Pull requests that update .NET code dependencies Pull requests that update a dependency file labels Aug 12, 2025
@coderabbitai

coderabbitai Bot commented Aug 12, 2025

Copy link
Copy Markdown

Walkthrough

Atualiza a infraestrutura de containerização (Dockerfile multi-stage, docker-compose, .dockerignore, perfis de lançamento), centraliza e atualiza versões de pacotes, migra referências para InvoiceReminder.ExternalServices, refatora ConfigurationService para receber IConfiguration e ajusta DI/tests conforme o novo fluxo de configuração.

Changes

Cohort / File(s) Resumo das mudanças
Dockerização e execução
InvoiceReminder.API/Dockerfile, docker-compose.yml, .dockerignore, InvoiceReminder.API/Properties/launchSettings.json, InvoiceReminder.API/InvoiceReminder.API.csproj
Novo Dockerfile multi-stage targeting .NET 9, novo docker-compose com serviço api, .dockerignore abrangente (ignora artefatos, IDE/OS, node_modules, etc.), perfil de lançamento "Container (Dockerfile)" e DockerDefaultTargetOS=Linux + Containers.Tools.Targets adicionado ao csproj.
Gerenciamento central de pacotes
Directory.Packages.props
Acrescenta CentralPackageTransitivePinningEnabled, reorganiza EF Core em grupo separado (v9.0.8), adiciona Microsoft.VisualStudio.Azure.Containers.Tools.Targets e Microsoft.Extensions.Configuration.EnvironmentVariables, e faz bumps para Scalar.AspNetCore, System.IdentityModel.Tokens.Jwt e ferramentas de teste (MSTest.*, TrxReport).
Bumps MSTest nos projetos de teste
**/*.UnitTests/*.csproj, InvoiceReminder.UnitTests.Assets/*.csproj, InvoiceReminder.ArchitectureTests/*.csproj
Atualiza MSTest.Sdk de 3.10.1 → 3.10.2 em múltiplos projetos de teste (alguns arquivos com BOM/encoding ajustado).
Migração para InvoiceReminder.ExternalServices
InvoiceReminder.API/InvoiceReminder.API.csproj, InvoiceReminder.Application/InvoiceReminder.Application.csproj, InvoiceReminder.CrossCutting.IoC/InvoiceReminder.CrossCutting.IoC.csproj, InvoiceReminder.JobScheduler/InvoiceReminder.JobScheduler.csproj, **/*UnitTests/*.csproj, InvoiceReminder.sln
Atualiza ProjectReference de ..\InvoiceReminder.Services\InvoiceReminder.ExternalServices.csproj..\InvoiceReminder.ExternalServices\InvoiceReminder.ExternalServices.csproj; adiciona projeto ExternalServices à solução e atualiza entradas de testes na .sln.
Configuração e DI
InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs, InvoiceReminder.CrossCutting.IoC/DependencyInjectionConfig.cs, InvoiceReminder.Domain/InvoiceReminder.Domain.csproj
ConfigurationService agora recebe IConfiguration, constrói ConfigurationBuilder (appsettings.json, appsettings.{env}.json, user secrets em Dev, env vars); IoC registra DbContext usando IConfiguration; adiciona Microsoft.Extensions.Configuration.EnvironmentVariables ao Domain.
Testes de ConfigurationService
InvoiceReminder.DomainEntities.UnitTests/Services/Configuration/ConfigurationServiceTests.cs
Refatoração para usar ConfigurationBuilder in-memory, novos cenários cobrindo GetAppSetting/GetConnectionString/GetSecret/GetSection, introduz DTO de teste MyTestSection e adapta nomes/assinaturas dos testes ao novo construtor.
Ajustes de PackageReference PrivateAssets
InvoiceReminder.Data/InvoiceReminder.Data.csproj, InvoiceReminder.API/InvoiceReminder.API.csproj
Microsoft.EntityFrameworkCore.Design e Microsoft.EntityFrameworkCore.Design em csprojs agora têm PrivateAssets="all"; adiciona Microsoft.VisualStudio.Azure.Containers.Tools.Targets com PrivateAssets="all" ao API csproj.
Reestruturação da solução
InvoiceReminder.sln
Substitui agrupamento genérico de testes por projetos de testes dedicados, adiciona InvoiceReminder.ExternalServices ao solution, e inclui itens de solução .env e docker-compose.yml.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant App as Aplicação / Host
  participant DI as Contêiner DI
  participant CfgRoot as IConfiguration (root)
  participant ConfigSvc as ConfigurationService

  App->>DI: Registra IConfiguration (appsettings + env + user secrets)
  App->>ConfigSvc: new ConfigurationService(IConfiguration)
  ConfigSvc->>ConfigSvc: Constrói ConfigurationBuilder\nAddConfiguration + AddJsonFiles + AddEnvironmentVariables\n(Dev -> AddUserSecrets)
  ConfigSvc-->>App: Instância pronta

  App->>ConfigSvc: GetConnectionString("DatabaseConnection")
  ConfigSvc-->>App: connection string ou null/default

  App->>ConfigSvc: GetSecret("Section","Key") / GetSecret("Section","Key__Name")
  ConfigSvc-->>App: secret ou null/default
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutos

Possibly related PRs

  • Uses central package management #41: altera Directory.Packages.props e versionamento centralizado de pacotes — forte relação com as mudanças de pacote aqui.
  • Development #30: atualiza MSTest SDK e pacotes de testes em múltiplos projetos — relacionado às atualizações de testes.
  • Atualização de pacote nuget #32: toca csproj de testes e referências de projeto, alinhado à migração para InvoiceReminder.ExternalServices.

Poem

Pulei na caixa do Docker com alegria,
troquei referências, variáveis e melodia.
Secrets e appsettings dançam no ar,
configs alinhadas prontas pra rodar.
Coelho dev sorri: build pronto pra festa! 🥕

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch Docker-Support

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR/Issue comments)

Type @coderabbitai help to get the list of available commands.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 11

🧹 Nitpick comments (21)
InvoiceReminder.Application.UnitTests/InvoiceReminder.Application.UnitTests.csproj (1)

1-1: Remover BOM (caractere invisível) no início do arquivo

Há um BOM UTF-8 antes da tag . Evite-o para reduzir diffs desnecessários entre plataformas/editores.

Aplique este diff para remover o BOM:

-<Project Sdk="MSTest.Sdk/3.10.2">
+<Project Sdk="MSTest.Sdk/3.10.2">
InvoiceReminder.UnitTests.Assets/InvoiceReminder.UnitTests.Assets.csproj (1)

1-1: Evitar BOM UTF-8 no início do arquivo

Há um caractere BOM antes de . Remova para manter consistência.

-<Project Sdk="MSTest.Sdk/3.10.2">
+<Project Sdk="MSTest.Sdk/3.10.2">
InvoiceReminder.ExternalServices.UnitTests/InvoiceReminder.ExternalServices.UnitTests.csproj (1)

1-1: Remover BOM no início do arquivo

Há um BOM UTF-8 antes da tag .

-<Project Sdk="MSTest.Sdk/3.10.2">
+<Project Sdk="MSTest.Sdk/3.10.2">
.dockerignore (1)

27-30: Reinclusão de metadados do Git no contexto de build — confirme necessidade

As exceções para .git (HEAD/config/packed-refs/refs/heads) aumentam o contexto e podem afetar cache. Se não estiver usando BuildKit com git metadata (ou versionamento via git rev-parse no build), considere remover estas reinclusões.

Gostaria que eu propusesse uma variante do Dockerfile que obtenha a versão via --mount=type=bind,source=.git (BuildKit) sem precisar re-incluir arquivos do .git no contexto?

InvoiceReminder.CrossCutting.IoC/DependencyInjectionConfig.cs (1)

133-133: Evitar “magic string” para o nome da connection string

Considere extrair "DatabaseConnection" para uma constante compartilhada/Options fortemente tipadas (ex.: DatabaseOptions.ConnectionName) para reduzir risco de typos e facilitar manutenção.

InvoiceReminder.API/Dockerfile (2)

33-35: Torne explícito o diretório de trabalho no stage publish

O FROM build AS publish herda o WORKDIR da stage anterior, o que é frágil e pode quebrar em alterações futuras. Recomendo setar o WORKDIR explicitamente antes do dotnet publish.

Aplique:

 FROM build AS publish
 ARG BUILD_CONFIGURATION=Release
+WORKDIR "/src/InvoiceReminder.API"
 RUN dotnet publish "./InvoiceReminder.API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

30-30: Build redundante pode ser removido para reduzir tempo de build

O dotnet publish recompila; o dotnet build anterior não é utilizado no artefato final. Se não houver dependência explícita dessa etapa (ex.: debug do VS), você pode removê-la para acelerar builds.

Aplique:

-RUN dotnet build "./InvoiceReminder.API.csproj" -c $BUILD_CONFIGURATION -o /app/build
docker-compose.yml (1)

2-12: Considere adicionar healthcheck e política de restart

Melhora observabilidade e resiliência ao rodar standalone ou em CI.

Sugestão:

 services:
   api:
     build:
       context: .
       dockerfile: InvoiceReminder.API/Dockerfile
     ports:
       - "8080:8080"
       - "8081:8081"
     env_file:
       - .env
+    healthcheck:
+      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/healthz"]
+      interval: 30s
+      timeout: 5s
+      retries: 3
+    restart: unless-stopped

Ajuste o endpoint do healthcheck conforme o endpoint de saúde disponível.

InvoiceReminder.API/Properties/launchSettings.json (1)

23-33: Perfil Docker pode falhar com HTTPS se o certificado não for injetado

O useSSL: true e ASPNETCORE_HTTPS_PORTS exigem certificado no container. Em ambientes fora do Visual Studio, isso não ocorre automaticamente.

  • Se for usar HTTPS apenas no VS, mantenha assim.
  • Para execução fora do VS, ou configure o certificado (variáveis ASPNETCORE_Kestrel__Certificates__Default__Path/...Password) ou remova o useSSL/HTTPS.

Além disso, defina o ambiente explicitamente para consistência:

     "environmentVariables": {
+      "ASPNETCORE_ENVIRONMENT": "Development",
       "ASPNETCORE_HTTPS_PORTS": "8081",
       "ASPNETCORE_HTTP_PORTS": "8080"
     },
InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs (1)

59-62: Compatibilidade com DOTNET_ENVIRONMENT

Muitos apps usam DOTNET_ENVIRONMENT. Considere suportá-lo além de ASPNETCORE_ENVIRONMENT.

Aplique:

-    return Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development";
+    var env = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT")
+              ?? Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
+    return string.Equals(env, "Development", StringComparison.OrdinalIgnoreCase);
InvoiceReminder.DomainEntities.UnitTests/InvoiceReminder.DomainEntities.UnitTests.csproj (1)

1-1: Remover BOM (U+FEFF) no início do arquivo

Há um caractere BOM antes da tag . Não quebra o build, mas pode gerar diffs desnecessários e problemas com algumas ferramentas.

Sugestão de ajuste mínimo:

-<Project Sdk="MSTest.Sdk/3.10.2">
+<Project Sdk="MSTest.Sdk/3.10.2">
InvoiceReminder.Domain/InvoiceReminder.Domain.csproj (1)

12-12: Evitar provider de configuração na camada de Domínio (mover para o composition root)

Adicionar Microsoft.Extensions.Configuration.EnvironmentVariables no projeto de Domínio tende a acoplar o domínio a providers de configuração. Idealmente, o domínio recebe IConfiguration (ou Options) já composto pela camada host (API, Job, etc.), que agrega appsettings, secrets e variáveis de ambiente — especialmente agora com Docker. Isso mantém o domínio mais puro e facilita testes.

Possíveis caminhos:

  • Remover o PackageReference do Domínio e compor a IConfiguration (com AddEnvironmentVariables) apenas em projetos host.
  • Se o Domínio não estiver criando ConfigurationBuilder internamente, este PackageReference pode ser removido sem impacto.

Se quiser, eu ajudo a preparar um commit movendo a composição para a API/Job e ajustando a injeção no IoC.

InvoiceReminder.JobScheduler.UnitTests/InvoiceReminder.JobScheduler.UnitTests.csproj (1)

16-16: Nova referência a ExternalServices no projeto de testes

A referência ao InvoiceReminder.ExternalServices em testes de JobScheduler é plausível diante da reorganização. Só valide se os testes realmente dependem de tipos concretos da implementação; se o objetivo for apenas contratos/abstrações, preferir referenciar apenas esses contratos reduz o acoplamento.

InvoiceReminder.API/InvoiceReminder.API.csproj (1)

28-28: Tornar Microsoft.VisualStudio.Azure.Containers.Tools.Targets um pacote apenas de desenvolvimento

Este pacote fornece targets para integração com ferramentas de containers (VS/VS Code) e não precisa fluir transitivamente. Recomendo marcar como PrivateAssets=all para evitar influência em projetos consumidores e manter escopo de build/dev.

Aplicar:

-    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" />
+    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets">
+      <PrivateAssets>all</PrivateAssets>
+      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+    </PackageReference>
Directory.Packages.props (2)

37-38: Alinhar patches do Npgsql e do provider EF Core PostgreSQL

Para reduzir riscos de incompatibilidades sutis, recomendo alinhar os patches de Npgsql e do provider EFCore. Como o provider está em 9.0.4, sugiro subir o Npgsql de 9.0.3 para 9.0.4 também.

Aplicar:

-    <PackageVersion Include="Npgsql" Version="9.0.3" />
+    <PackageVersion Include="Npgsql" Version="9.0.4" />

Se preferirem, posso verificar em notas de versão se há correção relevante no 9.0.4 que justifique a padronização.


36-36: Containers.Tools.Targets no gerenciamento central

Centralizar a versão é ok, mas mantenham a recomendação de marcar como PrivateAssets=all nos projetos que usam (como sugerido no API.csproj) para evitar propagação transitive de assets de build para outros projetos.

InvoiceReminder.sln (1)

16-17: "2.3 - External Services" continua no .sln; confirmar se essa pasta deve ser removida ou mantida

O resumo diz que o bloco de solução “2.3 - External Services” foi removido e que InvoiceReminder.ExternalServices virou projeto de nível superior. Entretanto, a pasta de solução “2.3 - External Services” ainda está definida e, no mapeamento de NestedProjects (ver Linhas 156-157), o novo projeto é aninhado dentro dela. Alinhar intenção x estrutura final (ou atualizar o resumo).

InvoiceReminder.DomainEntities.UnitTests/Services/Configuration/ConfigurationServiceTests.cs (4)

10-16: Boa prática: restaurar o ambiente entre testes — considere desabilitar paralelismo

Ótimo capturar/restaurar ASPNETCORE_ENVIRONMENT. Porém, se o runner estiver paralelo, mexer em variável de ambiente global pode causar interferência entre testes/classe. Considere marcar a classe como não paralelizável.

Você pode anotar a classe assim (fora do trecho alterado):

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
[DoNotParallelize]
public class ConfigurationServiceTests
{
    // ...
}

Also applies to: 18-22


35-45: Nome do teste sugere validação de UserSecrets, mas não há assert específico

O teste apenas assegura que não lança exceção. Se a intenção é somente isso, renomeie para refletir o comportamento (ex.: Constructor_DevelopmentEnvironment_DoesNotThrow). Caso contrário, considere validar a presença do provider de secrets (difícil sem expor a configuração interna).


47-56: Mesmo ponto do teste anterior: nome x assert

O nome indica que não adiciona UserSecrets, mas o teste só garante que não lança. Recomendo alinhar o nome ao objetivo real ou criar assert mais específico (se viável).


86-99: Cobertura extra: connection string via "ConnectionStrings__Name"

Vocês já testam GetSecret com __. Seria útil adicionar um teste análogo para connection strings com ConnectionStrings__MyDb via provider de env vars, garantindo que a convenção dupla underscore também funciona para connection strings.

Posso esboçar o teste se acharem útil.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4f9729e and 10b243d.

📒 Files selected for processing (22)
  • .dockerignore (1 hunks)
  • Directory.Packages.props (1 hunks)
  • InvoiceReminder.API.UnitTests/InvoiceReminder.API.UnitTests.csproj (2 hunks)
  • InvoiceReminder.API/Dockerfile (1 hunks)
  • InvoiceReminder.API/InvoiceReminder.API.csproj (2 hunks)
  • InvoiceReminder.API/Properties/launchSettings.json (1 hunks)
  • InvoiceReminder.Application.UnitTests/InvoiceReminder.Application.UnitTests.csproj (1 hunks)
  • InvoiceReminder.Application/InvoiceReminder.Application.csproj (1 hunks)
  • InvoiceReminder.ArchitectureTests/InvoiceReminder.ArchitectureTests.csproj (2 hunks)
  • InvoiceReminder.CrossCutting.IoC/DependencyInjectionConfig.cs (1 hunks)
  • InvoiceReminder.CrossCutting.IoC/InvoiceReminder.CrossCutting.IoC.csproj (1 hunks)
  • InvoiceReminder.Domain/InvoiceReminder.Domain.csproj (1 hunks)
  • InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs (3 hunks)
  • InvoiceReminder.DomainEntities.UnitTests/InvoiceReminder.DomainEntities.UnitTests.csproj (1 hunks)
  • InvoiceReminder.DomainEntities.UnitTests/Services/Configuration/ConfigurationServiceTests.cs (1 hunks)
  • InvoiceReminder.ExternalServices.UnitTests/InvoiceReminder.ExternalServices.UnitTests.csproj (2 hunks)
  • InvoiceReminder.Infrastructure.UnitTests/InvoiceReminder.Infrastructure.UnitTests.csproj (1 hunks)
  • InvoiceReminder.JobScheduler.UnitTests/InvoiceReminder.JobScheduler.UnitTests.csproj (2 hunks)
  • InvoiceReminder.JobScheduler/InvoiceReminder.JobScheduler.csproj (1 hunks)
  • InvoiceReminder.UnitTests.Assets/InvoiceReminder.UnitTests.Assets.csproj (1 hunks)
  • InvoiceReminder.sln (4 hunks)
  • docker-compose.yml (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (7)
InvoiceReminder.CrossCutting.IoC/DependencyInjectionConfig.cs (2)
InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs (1)
  • GetConnectionString (29-32)
InvoiceReminder.Domain/Services/Configuration/IConfigurationService.cs (2)
  • GetConnectionString (6-6)
  • IConfigurationService (3-12)
InvoiceReminder.UnitTests.Assets/InvoiceReminder.UnitTests.Assets.csproj (5)
InvoiceReminder.DomainEntities.UnitTests/Entities/InvoiceTests.cs (1)
  • InvoiceTests (6-17)
InvoiceReminder.ArchitectureTests/Domain/ExtensionsTests.cs (1)
  • ExtensionsTests (7-28)
InvoiceReminder.Application.UnitTests/ViewModels/InvoiceViewModelTests.cs (1)
  • InvoiceViewModelTests (6-17)
InvoiceReminder.UnitTests.Assets/PropertyTester.cs (1)
  • TestProperties (93-120)
InvoiceReminder.ArchitectureTests/Presentation/EndpointsTests.cs (1)
  • EndpointsTests (7-43)
InvoiceReminder.Application.UnitTests/InvoiceReminder.Application.UnitTests.csproj (3)
InvoiceReminder.DomainEntities.UnitTests/Entities/InvoiceTests.cs (2)
  • InvoiceTests (6-17)
  • TestProperties (9-16)
InvoiceReminder.Application.UnitTests/ViewModels/InvoiceViewModelTests.cs (1)
  • InvoiceViewModelTests (6-17)
InvoiceReminder.API.UnitTests/Endpoints/InvoiceEndpointsTests.cs (1)
  • InvoiceEndpointsTests (19-663)
InvoiceReminder.Infrastructure.UnitTests/InvoiceReminder.Infrastructure.UnitTests.csproj (4)
InvoiceReminder.DomainEntities.UnitTests/Entities/InvoiceTests.cs (2)
  • InvoiceTests (6-17)
  • TestProperties (9-16)
InvoiceReminder.ArchitectureTests/Domain/ExtensionsTests.cs (1)
  • ExtensionsTests (7-28)
InvoiceReminder.API.UnitTests/Endpoints/InvoiceEndpointsTests.cs (1)
  • InvoiceEndpointsTests (19-663)
InvoiceReminder.Application.UnitTests/ViewModels/InvoiceViewModelTests.cs (1)
  • InvoiceViewModelTests (6-17)
InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs (2)
InvoiceReminder.DomainEntities.UnitTests/Services/Configuration/ConfigurationServiceTests.cs (1)
  • ConfigurationService (24-31)
InvoiceReminder.Domain/Services/Configuration/IConfigurationService.cs (2)
  • IConfigurationService (3-12)
  • GetSecret (8-8)
InvoiceReminder.DomainEntities.UnitTests/Services/Configuration/ConfigurationServiceTests.cs (3)
InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs (7)
  • ConfigurationService (5-63)
  • ConfigurationService (9-22)
  • GetAppSetting (24-27)
  • GetConnectionString (29-32)
  • GetSecret (34-37)
  • GetSecret (39-42)
  • GetSecret (44-47)
InvoiceReminder.CrossCutting.IoC/DependencyInjectionConfig.cs (1)
  • GetConnectionString (129-136)
InvoiceReminder.Domain/Services/Configuration/IConfigurationService.cs (1)
  • IConfigurationService (3-12)
Directory.Packages.props (2)
InvoiceReminder.Data/Migrations/CoreDbContextModelSnapshot.cs (2)
  • BuildModel (18-257)
  • CoreDbContextModelSnapshot (14-258)
InvoiceReminder.Data/Migrations/20250509040148_Initial_Create.Designer.cs (2)
  • BuildTargetModel (19-258)
  • Initial_Create (14-259)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Analyze (csharp)
🔇 Additional comments (22)
InvoiceReminder.Application.UnitTests/InvoiceReminder.Application.UnitTests.csproj (1)

1-1: Atualização do MSTest.Sdk para 3.10.2 — OK

Mudança coerente com a padronização do repositório. Sem impactos aparentes.

InvoiceReminder.UnitTests.Assets/InvoiceReminder.UnitTests.Assets.csproj (1)

1-1: Atualização do MSTest.Sdk para 3.10.2 — OK

Alinha a versão com os demais projetos de teste.

InvoiceReminder.ExternalServices.UnitTests/InvoiceReminder.ExternalServices.UnitTests.csproj (3)

1-1: MSTest.Sdk 3.10.2 — atualização correta

Alinhado ao restante da solução e ao Directory.Packages.props.


27-29: Atualização do caminho do ProjectReference — OK

A referência foi atualizada para o novo projeto top-level InvoiceReminder.ExternalServices. Está correta para a estrutura descrita no PR.


27-29: Nenhuma referência ao caminho antigo encontrada

A busca por referências a InvoiceReminder.Services\InvoiceReminder.ExternalServices.csproj em arquivos .csproj não retornou resultados, indicando que não há menções remanescentes ao caminho anterior.

InvoiceReminder.API.UnitTests/InvoiceReminder.API.UnitTests.csproj (1)

1-1: Todas as versões do Sdk MSTest estão alinhadas

Verificamos que:

  • Todos os projetos de teste usam <Project Sdk="MSTest.Sdk/3.10.2">.
  • Em Directory.Packages.props, os pacotes MSTest.Analyzers, MSTest.TestAdapter e MSTest.TestFramework também estão na versão 3.10.2.

Não há inconsistências de versionamento a serem ajustadas.

InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs (1)

39-42: Boa abordagem para suportar ENV (__) e configuração hierárquica (:)

A resolução priorizando key:secretName e fallback para key__secretName cobre bem cenários de JSON vs. variáveis de ambiente.

InvoiceReminder.DomainEntities.UnitTests/InvoiceReminder.DomainEntities.UnitTests.csproj (1)

1-1: Bump do MSTest.Sdk para 3.10.2: OK

Atualização consistente com o restante do PR e com o .NET 9.

InvoiceReminder.Infrastructure.UnitTests/InvoiceReminder.Infrastructure.UnitTests.csproj (1)

1-1: Upgrade do MSTest.Sdk: coerente e seguro

A troca para MSTest.Sdk/3.10.2 é alinhada às demais suites de teste e ao .NET 9.

InvoiceReminder.JobScheduler.UnitTests/InvoiceReminder.JobScheduler.UnitTests.csproj (1)

1-1: Upgrade do MSTest.Sdk para 3.10.2: aprovado

Mantém consistência entre projetos de teste e o Testing Platform.

InvoiceReminder.ArchitectureTests/InvoiceReminder.ArchitectureTests.csproj (2)

1-1: Atualização para MSTest.Sdk/3.10.2: OK

Compatível com a suíte e sem impactos aparentes.


20-20: Adicionar ExternalServices às ArchitectureTests: faz sentido

Para validar regras de arquitetura envolvendo o novo projeto ExternalServices, esta referência é adequada.

InvoiceReminder.JobScheduler/InvoiceReminder.JobScheduler.csproj (1)

11-11: Verificação concluída: referências antigas removidas
Nenhuma referência ao caminho antigo (InvoiceReminder.Services/.../InvoiceReminder.ExternalServices.csproj) foi encontrada. As ocorrências de InvoiceReminder.ExternalServices.csproj registradas apontam exclusivamente para o novo diretório em todos os projetos, conforme esperado.

InvoiceReminder.API/InvoiceReminder.API.csproj (2)

8-8: DockerDefaultTargetOS=Linux: bom alinhamento com imagens Linux

Configurar o alvo Docker para Linux é compatível com o uso de imagens .NET base Linux. Apenas garanta que o Dockerfile esteja baseado em imagens linux e que as portas/publicações no docker-compose acompanhem essa escolha.

Se quiser, posso validar o Dockerfile/Docker Compose para checar consistência de base image, portas e variáveis de ambiente.


15-15: LGTM: referência para ExternalServices atualizada

A referência está em linha com a nova estrutura do solution.

InvoiceReminder.CrossCutting.IoC/InvoiceReminder.CrossCutting.IoC.csproj (1)

13-13: LGTM: IoC como composition root referenciando ExternalServices

Faz sentido que o projeto de IoC agregue as implementações concretas (ExternalServices) para fazer o wiring de dependências. Apenas mantenha Domain/Application livres de referências a concreções.

Directory.Packages.props (1)

18-23: Consistência de pacotes centralizados confirmada

Não foram encontradas referências diretas a MSTest.Sdk em nenhum arquivo *.csproj, logo não é necessário adicionar

<PackageVersion Update="MSTest.Sdk" Version="3.10.2" />

no Directory.Packages.props para manter consistência.

InvoiceReminder.sln (2)

28-29: "5 - Unit Tests" ainda existe; discrepância com o resumo

O resumo aponta remoção do bloco “5 - Unit Tests”, mas ele segue presente no .sln, com diversos projetos aninhados (Linhas 158-166). Ajustar o resumo ou remover a pasta, se de fato não for mais desejada.


42-42: Verificação concluída: sem referências obsoletas ao caminho antigo
Executamos a busca nas entradas de ProjectReference e não há nenhuma referência a
InvoiceReminder.Services/InvoiceReminder.ExternalServices.csproj. Todos os projetos apontam corretamente para
..\InvoiceReminder.ExternalServices\InvoiceReminder.ExternalServices.csproj.

InvoiceReminder.DomainEntities.UnitTests/Services/Configuration/ConfigurationServiceTests.cs (3)

145-153: Bom teste cobrindo convenção de dupla underscore

Validar Secrets__MySecret cobre o cenário comum de variáveis de ambiente em contêineres/orquestradores.


168-183: Boa cobertura para default em GetSecret com chave ausente

O teste garante que o fallback para defaultValue funciona como esperado.


24-31: Compatibilidade confirmada: Uso de C# 12/C# “collection expressions” é suportado
Os projetos estão configurados com <LangVersion>latest</LangVersion> e <TargetFramework>net9.0</TargetFramework>, garantindo que a expressão [] de C# 12 seja válida. Nenhuma alteração é necessária.

Likely an incorrect or invalid review comment.

Comment thread .dockerignore
Comment thread Directory.Packages.props
Comment thread docker-compose.yml
Comment thread InvoiceReminder.API.UnitTests/InvoiceReminder.API.UnitTests.csproj Outdated
Comment thread InvoiceReminder.API/Dockerfile Outdated
Comment thread InvoiceReminder.CrossCutting.IoC/DependencyInjectionConfig.cs Outdated
Comment thread InvoiceReminder.Domain/InvoiceReminder.Domain.csproj
Comment thread InvoiceReminder.sln

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 14

🔭 Outside diff range comments (1)
InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs (1)

59-62: Método IsDevelopment() pode não funcionar corretamente em contêineres

O método verifica apenas ASPNETCORE_ENVIRONMENT, mas em aplicações não-web ou serviços em background (como o JobScheduler mencionado no PR), a variável de ambiente pode ser DOTNET_ENVIRONMENT. Isso é especialmente importante com a adição de suporte Docker.

 private static bool IsDevelopment()
 {
-    return Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == "Development";
+    var aspNetEnv = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
+    var dotNetEnv = Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT");
+    return aspNetEnv == "Development" || dotNetEnv == "Development";
 }
🧹 Nitpick comments (13)
InvoiceReminder.Infrastructure.UnitTests/InvoiceReminder.Infrastructure.UnitTests.csproj (1)

1-1: BOM (byte order mark) no início do arquivo

Há um BOM antes da tag <Project>. Não é crítico, mas pode causar diffs ruidosos e inconsistência entre projetos. Se possível, padronize os .csproj para UTF-8 sem BOM.

InvoiceReminder.API/Properties/launchSettings.json (1)

34-36: Posicionamento do $schema

Funciona mesmo ao final, mas editores/IDE costumam reconhecer melhor o schema se estiver no topo do arquivo. Opcional mover a propriedade $schema para a primeira linha para melhorar a experiência de edição.

docker-compose.yml (1)

4-11: Adicionar healthcheck e política de restart para robustez em dev/CI

Recomendo incluir healthcheck (por ex., GET /health ou /scalar/v1 se aplicável) e restart: unless-stopped para melhorar resiliência local/CI.

Exemplo:

   api:
     build:
       context: .
       dockerfile: InvoiceReminder.API/Dockerfile
     ports:
       - "8080:8080"
-      - "8081:8081"
+      # - "8081:8081" # ver comentário acima sobre HTTPS
     env_file:
       - .env
+    restart: unless-stopped
+    healthcheck:
+      test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:8080/health"]
+      interval: 10s
+      timeout: 3s
+      retries: 5
InvoiceReminder.JobScheduler.UnitTests/InvoiceReminder.JobScheduler.UnitTests.csproj (1)

3-13: Defina IsPackable=false em projetos de teste

Evita geração acidental de pacotes NuGet de projetos de teste.

   <PropertyGroup>
     <TargetFramework>net9.0</TargetFramework>
     <LangVersion>latest</LangVersion>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>disable</Nullable>
+    <IsPackable>false</IsPackable>
     <!--
       Displays error on console in addition to the log file. Note that this feature comes with a performance impact.
       For more information, visit https://learn.microsoft.com/dotnet/core/testing/unit-testing-platform-integration-dotnet-test#show-failure-per-test
       -->
     <TestingPlatformShowTestsFailure>true</TestingPlatformShowTestsFailure>
   </PropertyGroup>
InvoiceReminder.Domain/InvoiceReminder.Domain.csproj (1)

12-12: Provider de variáveis de ambiente no projeto de Domain: mova para o composition root

Idealmente, o Domain depende apenas de abstrações (IConfiguration) e não referencia providers/concretudes. Registre EnvironmentVariables no host (API/JobScheduler/IoC) e injete IConfiguration no Domain.

Sugestão de remoção aqui e adição no projeto host:

   <ItemGroup>
     <PackageReference Include="Microsoft.Extensions.Configuration.Binder" />
-    <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" />
     <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" />
     <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" />
     <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
InvoiceReminder.API/InvoiceReminder.API.csproj (1)

28-28: Evite vazar Containers.Tools.Targets como dependência transitiva

Apenas tooling de build/IDE. Marque como PrivateAssets=all para não transitar para consumidores.

-    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" />
+    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets">
+      <PrivateAssets>all</PrivateAssets>
+      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+    </PackageReference>
InvoiceReminder.API/Dockerfile (4)

15-17: Aprimorar cache: copie Directory.Packages.props diretamente para /src

Copiar o props para a raiz “/” funciona, mas é menos explícito. Copiar para /src alinha com o fluxo de restore por projeto e melhora a clareza do cache.

-# Adiciona o arquivo de versões centralizadas
-COPY Directory.Packages.props ./
+# Adiciona o arquivo de versões centralizadas ao contexto de build dos projetos
+COPY Directory.Packages.props /src/

27-31: Evitar restore duplicado no build

Como já foi executado dotnet restore antes, use --no-restore no build para otimizar etapas e cache.

-RUN dotnet build "./InvoiceReminder.API.csproj" -c $BUILD_CONFIGURATION -o /app/build
+RUN dotnet build "./InvoiceReminder.API.csproj" -c $BUILD_CONFIGURATION -o /app/build --no-restore

33-35: Evitar restore duplicado no publish

Mesma otimização do build: acrescente --no-restore.

-RUN dotnet publish "./InvoiceReminder.API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
+RUN dotnet publish "./InvoiceReminder.API.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false --no-restore

39-41: (Opcional) Definir ASPNETCORE_URLS para garantir bind no 8080

Embora o runtime .NET em contêiner já use 8080/8081 por padrão, explicitar ASPNETCORE_URLS evita ambiguidades em ambientes heterogêneos.

 FROM base AS final
 WORKDIR /app
+ENV ASPNETCORE_URLS=http://0.0.0.0:8080
 COPY --from=publish /app/publish .
 ENTRYPOINT ["dotnet", "InvoiceReminder.API.dll"]
InvoiceReminder.DomainEntities.UnitTests/Services/Configuration/ConfigurationServiceTests.cs (3)

10-16: Campo de ambiente deve aceitar null — evite warnings/erros com NRT.

Environment.GetEnvironmentVariable pode retornar null. Marque o campo como nullable para evitar warning (ou erro se TreatWarningsAsErrors está ativo) e deixar o intent explícito.

Aplique:

-    private string _originalEnvironment;
+    private string? _originalEnvironment;

Also applies to: 18-22


86-99: Padronize usando o helper CreateService nas configurações in-memory.

Para consistência e legibilidade, use o helper CreateService também neste teste.

Aplique:

-        var service = new ConfigurationService(new ConfigurationBuilder()
-            .AddInMemoryCollection(new Dictionary<string, string>
-            {
-                ["ConnectionStrings:MyDb"] = "Server=.;Database=Test;"
-            })
-            .Build());
+        var service = CreateService(new()
+        {
+            ["ConnectionStrings:MyDb"] = "Server=.;Database=Test;"
+        });

33-45: Tests de construtor sem assert útil — consider ar validar efeito observável.

Os testes de construtor apenas checam “não nulo”. Se a intenção é validar inclusão (ou não) de UserSecrets por ambiente, proponho validar algum comportamento observável (p.ex., carregar um valor simulado por UserSecrets quando Development). Caso isso não seja trivial, considere re-enquadrar o teste para refletir o objetivo ou convertê-lo em smoke test com nome condizente.

Also applies to: 47-57

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4f9729e and 10b243d.

📒 Files selected for processing (22)
  • .dockerignore (1 hunks)
  • Directory.Packages.props (1 hunks)
  • InvoiceReminder.API.UnitTests/InvoiceReminder.API.UnitTests.csproj (2 hunks)
  • InvoiceReminder.API/Dockerfile (1 hunks)
  • InvoiceReminder.API/InvoiceReminder.API.csproj (2 hunks)
  • InvoiceReminder.API/Properties/launchSettings.json (1 hunks)
  • InvoiceReminder.Application.UnitTests/InvoiceReminder.Application.UnitTests.csproj (1 hunks)
  • InvoiceReminder.Application/InvoiceReminder.Application.csproj (1 hunks)
  • InvoiceReminder.ArchitectureTests/InvoiceReminder.ArchitectureTests.csproj (2 hunks)
  • InvoiceReminder.CrossCutting.IoC/DependencyInjectionConfig.cs (1 hunks)
  • InvoiceReminder.CrossCutting.IoC/InvoiceReminder.CrossCutting.IoC.csproj (1 hunks)
  • InvoiceReminder.Domain/InvoiceReminder.Domain.csproj (1 hunks)
  • InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs (3 hunks)
  • InvoiceReminder.DomainEntities.UnitTests/InvoiceReminder.DomainEntities.UnitTests.csproj (1 hunks)
  • InvoiceReminder.DomainEntities.UnitTests/Services/Configuration/ConfigurationServiceTests.cs (1 hunks)
  • InvoiceReminder.ExternalServices.UnitTests/InvoiceReminder.ExternalServices.UnitTests.csproj (2 hunks)
  • InvoiceReminder.Infrastructure.UnitTests/InvoiceReminder.Infrastructure.UnitTests.csproj (1 hunks)
  • InvoiceReminder.JobScheduler.UnitTests/InvoiceReminder.JobScheduler.UnitTests.csproj (2 hunks)
  • InvoiceReminder.JobScheduler/InvoiceReminder.JobScheduler.csproj (1 hunks)
  • InvoiceReminder.UnitTests.Assets/InvoiceReminder.UnitTests.Assets.csproj (1 hunks)
  • InvoiceReminder.sln (4 hunks)
  • docker-compose.yml (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (4)
InvoiceReminder.CrossCutting.IoC/DependencyInjectionConfig.cs (1)
InvoiceReminder.Domain/Services/Configuration/IConfigurationService.cs (2)
  • GetConnectionString (6-6)
  • IConfigurationService (3-12)
InvoiceReminder.ArchitectureTests/InvoiceReminder.ArchitectureTests.csproj (2)
InvoiceReminder.ArchitectureTests/Services/AppServicesTests.cs (1)
  • AppServicesTests (9-67)
InvoiceReminder.ArchitectureTests/Domain/EntitiesTests.cs (1)
  • GivenDomainLayer_ThenShouldNotHaveAnyDependencies (10-22)
InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs (1)
InvoiceReminder.Domain/Services/Configuration/IConfigurationService.cs (1)
  • IConfigurationService (3-12)
InvoiceReminder.DomainEntities.UnitTests/Services/Configuration/ConfigurationServiceTests.cs (1)
InvoiceReminder.Domain/Services/Configuration/IConfigurationService.cs (1)
  • IConfigurationService (3-12)
🔇 Additional comments (27)
InvoiceReminder.UnitTests.Assets/InvoiceReminder.UnitTests.Assets.csproj (1)

1-1: Upgrade do MSTest.Sdk para 3.10.2: OK

A atualização para Sdk="MSTest.Sdk/3.10.2" está alinhada ao restante do PR e ao alvo net9.0. Nenhuma inconsistência aparente neste projeto.

InvoiceReminder.Infrastructure.UnitTests/InvoiceReminder.Infrastructure.UnitTests.csproj (1)

1-1: Upgrade do MSTest.Sdk para 3.10.2: OK

A migração para Sdk="MSTest.Sdk/3.10.2" e o restante das referências (via central package management) parecem consistentes para a suíte de testes de Infra. Sem impacto funcional negativo aparente.

InvoiceReminder.API/Properties/launchSettings.json (3)

9-12: Reordenação de propriedades (http): OK

Mover dotnetRunMessages e applicationUrl após environmentVariables não altera comportamento. Mantém legibilidade.


19-22: Reordenação de propriedades (https): OK

Sem impacto funcional; URLs e ambiente permanecem corretos.


23-33: Perfil de execução em contêiner adicionado: verifique HTTPS/ports

O perfil Docker está coerente com os ports (8080/8081) e a URL de lançamento. Dois pontos de atenção:

  • HTTPS em container requer certificados configurados/montados. Verifique se a configuração de Kestrel/cert dev está operacional neste perfil; caso contrário, considere expor apenas HTTP ou configurar corretamente os certificados.
  • Se o Dockerfile já expõe 8080/8081, essa configuração deve funcionar. Alternativamente, você pode definir ASPNETCORE_URLS=http://+:8080;https://+:8081 para maior previsibilidade em cenários fora do VS.

Gostaria que eu validasse a presença de configuração de certificado para o perfil Docker e a consistência com o docker-compose?

InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs (1)

16-19: Não há problemas com AddUserSecrets no container Docker

Verificamos que:

  • Todos os projetos têm a propriedade <UserSecretsId> definida nos arquivos .csproj, o que garante que o atributo de assembly será gerado corretamente.
  • O Dockerfile não define ASPNETCORE_ENVIRONMENT=Development, logo o bloco if (IsDevelopment()) não será executado dentro do container – portanto, o AddUserSecrets<ConfigurationService>() nem será chamado em produção.
  • Há um teste automatizado (Constructor_ProductionEnvironment_DoesNotAddUserSecrets) que valida esse comportamento.

Como resultado, não é necessário adicionar tratamento de erro extra nem ajustes na configuração de Docker.

InvoiceReminder.API.UnitTests/InvoiceReminder.API.UnitTests.csproj (2)

1-1: Atualização do MSTest.Sdk aprovada

A atualização para a versão 3.10.2 está alinhada com as outras atualizações de pacotes MSTest no PR.


18-18: Nova referência ao projeto ExternalServices adicionada corretamente

A adição da referência ao projeto InvoiceReminder.ExternalServices está consistente com a reestruturação do projeto mencionada nos objetivos do PR.

InvoiceReminder.DomainEntities.UnitTests/InvoiceReminder.DomainEntities.UnitTests.csproj (1)

1-1: Atualização consistente do MSTest.Sdk

A versão 3.10.2 está alinhada com as atualizações em outros projetos de teste.

InvoiceReminder.Application.UnitTests/InvoiceReminder.Application.UnitTests.csproj (1)

1-1: Versão do MSTest.Sdk atualizada corretamente

Atualização consistente com os demais projetos de teste para a versão 3.10.2.

InvoiceReminder.Application/InvoiceReminder.Application.csproj (1)

20-20: Referência ao projeto ExternalServices atualizada com sucesso

A mudança do caminho do projeto ExternalServices está alinhada com a reestruturação mencionada nos objetivos do PR, movendo serviços externos para seu próprio projeto.

docker-compose.yml (1)

8-9: Evite expor HTTPS (8081) sem certificados montados/configurados

Mapear 8081:8081 sugere HTTPS no container. Sem certificados (volumes/ASP.NET Core dev-certs) o endpoint 8081 provavelmente não subirá ou ficará inútil. Considere remover 8081 ou montar certificados e definir variáveis necessárias.

Sugestão (se não houver certificados em uso no container):

     ports:
       - "8080:8080"
-      - "8081:8081"

Se for manter HTTPS, adicione volumes e variáveis conforme necessário (Kestrel/ASP.NET Core), por ex.:

     ports:
       - "8080:8080"
       - "8081:8081"
+    environment:
+      - ASPNETCORE_HTTP_PORTS=8080
+      - ASPNETCORE_HTTPS_PORTS=8081
+    volumes:
+      - ~/.aspnet/https:/https:ro
+      - ~/.microsoft/usersecrets:/root/.microsoft/usersecrets:ro
InvoiceReminder.JobScheduler.UnitTests/InvoiceReminder.JobScheduler.UnitTests.csproj (1)

1-1: Atualização do MSTest.Sdk para 3.10.2: OK

Uso do Sdk com versão inline está consistente com MSTest v3. Sem objeções.

InvoiceReminder.CrossCutting.IoC/InvoiceReminder.CrossCutting.IoC.csproj (1)

13-13: Nenhuma referência órfã ao caminho antigo
A busca não retornou nenhuma ocorrência de InvoiceReminder.Services/InvoiceReminder.ExternalServices.csproj, confirmando que todos os .csproj já apontam para o novo caminho InvoiceReminder.ExternalServices\InvoiceReminder.ExternalServices.csproj.

InvoiceReminder.API/InvoiceReminder.API.csproj (2)

8-8: DockerDefaultTargetOS=Linux: alinhado com o Dockerfile

Definição coerente com a imagem Linux do Dockerfile. Sem pontos a ajustar.


15-15: Atualização da ProjectReference para ExternalServices: OK

Caminho atualizado condiz com a nova estrutura. Sem ressalvas.

InvoiceReminder.ExternalServices.UnitTests/InvoiceReminder.ExternalServices.UnitTests.csproj (3)

1-1: Atualização do Sdk MSTest para 3.10.2 — OK

Alinha com os bumps centralizados no Directory.Packages.props e com net9.0. Sem observações funcionais aqui.


27-29: Validação concluída — sem referências ao caminho antigo

O comando de busca não encontrou nenhuma ocorrência de
..\InvoiceReminder.Services\InvoiceReminder.ExternalServices.csproj,
portanto não há resíduos de referências ao caminho anterior.


9-13: Nome da propriedade MSBuild confirmado

A grafia “TestingPlatformShowTestsFailure” está correta para exibir falhas por teste no modelo clássico de integração do Test Platform.

Pontos de atenção:

  • Arquivo InvoiceReminder.ExternalServices.UnitTests/InvoiceReminder.ExternalServices.UnitTests.csproj (linhas 9–13) – a propriedade está corretamente definida como <TestingPlatformShowTestsFailure>true</TestingPlatformShowTestsFailure>.
  • Se o seu pipeline de testes estiver usando o novo modo Microsoft.Testing.Platform (ativo via dotnet.config ou .NET 10+), essa propriedade não será aplicada. Nesse caso, forneça os argumentos através de TestingPlatformCommandLineArguments ou ajuste diretamente as opções do test runner.
InvoiceReminder.JobScheduler/InvoiceReminder.JobScheduler.csproj (1)

11-11: Ref. para ExternalServices atualizada — OK

Moveu corretamente para ..\InvoiceReminder.ExternalServices\InvoiceReminder.ExternalServices.csproj. Sem impactos aparentes.

InvoiceReminder.ArchitectureTests/InvoiceReminder.ArchitectureTests.csproj (3)

1-1: Atualização do Sdk MSTest para 3.10.2 — OK

Consistente com a migração geral. Mantém o alvo em net9.0.


20-20: Inclusão de ProjectReference para ExternalServices — OK

Faz sentido para carregar o assembly nas regras de arquitetura (NetArchTest). Sem objeções.


8-13: Propriedade MSBuild confirmada
A propriedade TestingPlatformShowTestsFailure está correta conforme a documentação oficial do .NET (dotnet test –p:TestingPlatformShowTestsFailure=true). Não é necessária nenhuma alteração.

InvoiceReminder.sln (2)

16-17: Resumo inconsistente: os nós de pasta "2.3 - External Services" e "5 - Unit Tests" ainda existem na solução.

O resumo afirma que o placeholder “2.3 - External Services” foi substituído e que o nó “5 - Unit Tests” foi removido. Porém, o arquivo mantém ambos os nós (Linhas 16-17 e 28-29), e os projetos de testes estão devidamente aninhados sob “5 - Unit Tests”. Sem problema funcional aqui, apenas divergência do resumo.

Also applies to: 28-29


42-42: Tudo verificado: referência ao InvoiceReminder.ExternalServices está correta

O arquivo InvoiceReminder.ExternalServices/InvoiceReminder.ExternalServices.csproj existe, está referenciado na InvoiceReminder.sln (linha 42) e o GUID {F2EB382B-25E4-43D8-8159-53DB5085DED6} aparece corretamente nos blocos de configuração (linhas 103–106) e de aninhamento (linhas 156–157).
Nenhuma ação adicional é necessária.

InvoiceReminder.DomainEntities.UnitTests/Services/Configuration/ConfigurationServiceTests.cs (2)

254-269: DTO de teste com Equals/GetHashCode — bom para asserções de igualdade.

A presença de Equals/GetHashCode aqui viabiliza as asserções ShouldBe no cenário “WithDefault”. Após a remoção do tipo aninhado (Linhas 189-193), este tipo será usado nas asserções corretamente.


24-31: Nenhuma ação necessária: C# 12+ já está configurado
Todos os projetos usam <LangVersion>latest</LangVersion> e <TargetFramework>net9.0</TargetFramework>, garantindo suporte à expressão de coleção [].

Comment thread .dockerignore Outdated
Comment thread Directory.Packages.props
Comment thread Directory.Packages.props
Comment thread Directory.Packages.props
Comment thread Directory.Packages.props
Comment thread InvoiceReminder.sln
Streamlines project dependencies by removing unnecessary external service references from unit tests and application layers.

Updates Dockerfile to define APP_UID as an argument for better flexibility.

Configures central package version management and transitive pinning for more consistent dependency resolution.

Updates configuration loading to correctly handle environment-specific settings.

Adds `PrivateAssets="all"` attribute to several package references to improve build performance and reduce output size.

Excludes `TestResults` from Docker image.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (4)
.dockerignore (1)

28-28: Boa correção: Dockerfile da API reintroduzido no contexto de build

A exceção !InvoiceReminder.API/Dockerfile resolve o problema anteriormente apontado de o Dockerfile ficar fora do contexto e quebrar o docker build/docker compose build.

InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs (2)

45-48: Superfície silenciosa de erro ao buscar secrets; sugerir log/erro descritivo quando não encontrado

Atualmente retorna null silenciosamente quando as chaves não existem, o que dificulta diagnóstico (especialmente em Docker/prod). Proponho registrar em Development e considerar lançar exceção (ou deixe apenas o log e use o overload com default quando apropriado).

     public string GetSecret(string key, string secretName)
     {
-        return _configuration[$"{key}:{secretName}"] ?? _configuration[$"{key}__{secretName}"];
+        var colonKey = $"{key}:{secretName}";
+        var underscoreKey = $"{key}__{secretName}";
+        var value = _configuration[colonKey] ?? _configuration[underscoreKey];
+
+        if (value == null)
+        {
+            // Evita falhas silenciosas em Dev; em Prod, avalie lançar InvalidOperationException
+            System.Diagnostics.Debug.WriteLine(
+                $"[Configuration] Secret não encontrado para '{colonKey}' ou '{underscoreKey}'.");
+        }
+
+        return value;
     }

9-28: Evite reconstruir IConfiguration aqui (duplicação de provedores e possível inversão de precedência); prefira pass-through no composition root

Reconstruir a configuração dentro do serviço pode duplicar provedores (JSON, env vars, secrets) já presentes no host, aumentar consumo de memória e alterar precedência inesperadamente. Mantenha a composição no host/IoC e use o IConfiguration injetado como está.

Opção A (recomendada): pass-through simples

-    public ConfigurationService(IConfiguration configuration)
-    {
-        var environment = configuration["ASPNETCORE_ENVIRONMENT"]
-            ?? Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")
-            ?? "Production";
-
-        var builder = new ConfigurationBuilder()
-            .AddConfiguration(configuration)
-            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
-            .AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true);
-
-        if (string.Equals(environment, "Development", StringComparison.OrdinalIgnoreCase))
-        {
-            _ = builder.AddUserSecrets<ConfigurationService>();
-        }
-
-        _ = builder.AddEnvironmentVariables();
-
-        _configuration = builder.Build();
-    }
+    public ConfigurationService(IConfiguration configuration)
+    {
+        _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration));
+    }

Opção B (se insistir em montar aqui): inclua fallback para DOTNET_ENVIRONMENT e mantenha a ordem “UserSecrets antes de EnvVars”

     public ConfigurationService(IConfiguration configuration)
     {
-        var environment = configuration["ASPNETCORE_ENVIRONMENT"]
-            ?? Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")
-            ?? "Production";
+        var environment = configuration["ASPNETCORE_ENVIRONMENT"]
+            ?? configuration["DOTNET_ENVIRONMENT"]
+            ?? Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")
+            ?? Environment.GetEnvironmentVariable("DOTNET_ENVIRONMENT")
+            ?? "Production";

         var builder = new ConfigurationBuilder()
             .AddConfiguration(configuration)
             .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
             .AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true);
 
         if (string.Equals(environment, "Development", StringComparison.OrdinalIgnoreCase))
         {
-            _ = builder.AddUserSecrets<ConfigurationService>();
+            builder.AddUserSecrets<ConfigurationService>();
         }
 
-        _ = builder.AddEnvironmentVariables();
+        builder.AddEnvironmentVariables();
 
         _configuration = builder.Build();
     }
Directory.Packages.props (1)

16-16: Remover pacotes AspNetCore.*.Abstractions 2.3.0 (legados e potencialmente conflitantes no .NET 9)

Esses pacotes são da era 2.x e geralmente são providos pelo shared framework. Mantê-los fixa versões antigas e pode gerar conflitos/duplicidades. Remova-os do gerenciamento central (e quaisquer referências diretas em csproj).

-    <PackageVersion Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.3.0" />
...
-    <PackageVersion Include="Microsoft.AspNetCore.Authentication.Abstractions" Version="2.3.0" />

Caso algum projeto ainda os referencie explicitamente, remova o PackageReference correspondente.

Also applies to: 48-48

🧹 Nitpick comments (3)
.dockerignore (2)

18-28: Evite ignorar Dockerfiles globalmente para reduzir risco de regressões futuras

Ignorar **/Dockerfile* e depois re-incluir seletivamente um arquivo específico é frágil: qualquer novo Dockerfile que vier a ser adicionado (por exemplo, de serviços auxiliares) será excluído por padrão e poderá quebrar builds. Dockerfiles são pequenos e não impactam significativamente o tamanho do contexto.

Sugestão: remova a regra global que ignora Dockerfiles e também a exceção correspondente; isso simplifica e evita pegadinhas futuras.

Aplicar este diff:

-**/Dockerfile*
 ...
-!InvoiceReminder.API/Dockerfile

1-29: Reduza o contexto de build definindo o build.context no serviço da API

Se o docker-compose atualmente usa o diretório raiz como contexto, considere apontar o contexto diretamente para InvoiceReminder.API. Isso:

  • reduz o contexto enviado ao daemon,
  • elimina a necessidade de exceções como !InvoiceReminder.API/Dockerfile,
  • diminui a dependência de padrões frágeis no .dockerignore.

Exemplo (no docker-compose):

services:
  api:
    build:
      context: ./InvoiceReminder.API
      dockerfile: Dockerfile

Isso permite simplificar este .dockerignore e acelera builds.

InvoiceReminder.Data/InvoiceReminder.Data.csproj (1)

19-22: Duplicação de PrivateAssets no mesmo PackageReference

Você adicionou PrivateAssets="all" no atributo e mantém o nó interno all. É redundante; escolha um só para evitar ruído.

-    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" PrivateAssets="all">
-      <PrivateAssets>all</PrivateAssets>
-      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
-    </PackageReference>
+    <PackageReference Include="Microsoft.EntityFrameworkCore.Design" PrivateAssets="all">
+      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
+    </PackageReference>
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 10b243d and e994b5b.

📒 Files selected for processing (11)
  • .dockerignore (1 hunks)
  • Directory.Packages.props (1 hunks)
  • InvoiceReminder.API.UnitTests/InvoiceReminder.API.UnitTests.csproj (1 hunks)
  • InvoiceReminder.API/Dockerfile (1 hunks)
  • InvoiceReminder.API/InvoiceReminder.API.csproj (1 hunks)
  • InvoiceReminder.Application/InvoiceReminder.Application.csproj (1 hunks)
  • InvoiceReminder.CrossCutting.IoC/DependencyInjectionConfig.cs (1 hunks)
  • InvoiceReminder.Data/InvoiceReminder.Data.csproj (1 hunks)
  • InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs (3 hunks)
  • InvoiceReminder.DomainEntities.UnitTests/Services/Configuration/ConfigurationServiceTests.cs (1 hunks)
  • InvoiceReminder.JobScheduler.UnitTests/InvoiceReminder.JobScheduler.UnitTests.csproj (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (7)
  • InvoiceReminder.Application/InvoiceReminder.Application.csproj
  • InvoiceReminder.API/Dockerfile
  • InvoiceReminder.API.UnitTests/InvoiceReminder.API.UnitTests.csproj
  • InvoiceReminder.CrossCutting.IoC/DependencyInjectionConfig.cs
  • InvoiceReminder.API/InvoiceReminder.API.csproj
  • InvoiceReminder.JobScheduler.UnitTests/InvoiceReminder.JobScheduler.UnitTests.csproj
  • InvoiceReminder.DomainEntities.UnitTests/Services/Configuration/ConfigurationServiceTests.cs
🧰 Additional context used
🧬 Code Graph Analysis (3)
InvoiceReminder.Data/InvoiceReminder.Data.csproj (2)
InvoiceReminder.Data/Migrations/20250509040148_Initial_Create.Designer.cs (3)
  • Initial_Create (14-259)
  • BuildTargetModel (19-258)
  • b (29-80)
InvoiceReminder.Data/Migrations/CoreDbContextModelSnapshot.cs (1)
  • CoreDbContextModelSnapshot (14-258)
InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs (2)
InvoiceReminder.DomainEntities.UnitTests/Services/Configuration/ConfigurationServiceTests.cs (1)
  • ConfigurationService (24-31)
InvoiceReminder.Domain/Services/Configuration/IConfigurationService.cs (1)
  • IConfigurationService (3-12)
Directory.Packages.props (2)
InvoiceReminder.Data/Migrations/CoreDbContextModelSnapshot.cs (1)
  • CoreDbContextModelSnapshot (14-258)
InvoiceReminder.Data/Migrations/20250509040148_Initial_Create.Designer.cs (1)
  • BuildTargetModel (19-258)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Analyze (csharp)
🔇 Additional comments (6)
.dockerignore (1)

3-3: Boa prática: .env fora do contexto do build

Ignorar **/.env evita enviar segredos ao daemon durante o build. Mantendo as variáveis via env_file/compose em runtime, você reduz risco de vazamento.

InvoiceReminder.Domain/Services/Configuration/ConfigurationService.cs (2)

50-53: Overload com default para secrets: bom incremento de DX

O fallback para defaultValue evita null checks espalhados. LGTM.


60-63: Overload com default para sections: boa ergonomia

Facilita configuração opcional sem boilerplate. LGTM.

Directory.Packages.props (3)

4-4: Pinagem transitiva ativada: ótimo para builds determinísticos

A propriedade CentralPackageTransitivePinningEnabled=true está correta e alinha o restore com o versionamento central. LGTM.


39-39: Alinhar Npgsql.EntityFrameworkCore.PostgreSQL à versão do EF Core

Você fixou Microsoft.EntityFrameworkCore em 9.0.8, porém o provider Npgsql EFCore está em 9.0.4. Recomendo alinhar o provider para reduzir risco de incompatibilidades.

Proposta:

-    <PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.4" />
+    <PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.8" />

Depois, valide restore/build/testes.


37-37: Referências ao pacote de containers já estão marcadas como dev-only

Verificamos que apenas o projeto InvoiceReminder.API/InvoiceReminder.API.csproj referencia
Microsoft.VisualStudio.Azure.Containers.Tools.Targets e já inclui PrivateAssets="all".
Nenhuma outra referência sem a flag foi encontrada.

@jldsilva jldsilva merged commit cc5cbac into development Aug 13, 2025
5 checks passed
@jldsilva jldsilva deleted the Docker-Support branch August 13, 2025 00:51
@coderabbitai coderabbitai Bot mentioned this pull request Dec 5, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file .NET Pull requests that update .NET code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant