{"id":32862191,"url":"https://github.com/danhpaiva/krt-client-api-mvc-net-sqlite-xunit","last_synced_at":"2026-05-16T15:36:48.314Z","repository":{"id":320881904,"uuid":"1083646876","full_name":"danhpaiva/krt-client-api-mvc-net-sqlite-xunit","owner":"danhpaiva","description":"🌐 ~ WebAPI, API REST, EfCore, Sqlite, Xunit, Docker, Redis, DDD, Clean Code, Moq ~ CRUD Clientes/Contas","archived":false,"fork":false,"pushed_at":"2025-10-26T21:41:06.000Z","size":275,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-24T02:19:12.379Z","etag":null,"topics":["api-rest","asp-net-core","clean-code","ddd","docker","dotnet","efcore","moq","mvc","redis","sqlite","web","webapi","xunit"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/danhpaiva.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-10-26T13:01:56.000Z","updated_at":"2025-11-04T17:55:43.000Z","dependencies_parsed_at":"2025-10-26T15:11:41.262Z","dependency_job_id":"507baaae-1cac-439e-8313-67cca33e7f9e","html_url":"https://github.com/danhpaiva/krt-client-api-mvc-net-sqlite-xunit","commit_stats":null,"previous_names":["danhpaiva/krt-client-api-mvc-net-sqlite-xunit"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/danhpaiva/krt-client-api-mvc-net-sqlite-xunit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danhpaiva%2Fkrt-client-api-mvc-net-sqlite-xunit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danhpaiva%2Fkrt-client-api-mvc-net-sqlite-xunit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danhpaiva%2Fkrt-client-api-mvc-net-sqlite-xunit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danhpaiva%2Fkrt-client-api-mvc-net-sqlite-xunit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danhpaiva","download_url":"https://codeload.github.com/danhpaiva/krt-client-api-mvc-net-sqlite-xunit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danhpaiva%2Fkrt-client-api-mvc-net-sqlite-xunit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33108232,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T04:41:52.686Z","status":"ssl_error","status_checked_at":"2026-05-16T04:41:52.009Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-rest","asp-net-core","clean-code","ddd","docker","dotnet","efcore","moq","mvc","redis","sqlite","web","webapi","xunit"],"created_at":"2025-11-08T22:01:35.837Z","updated_at":"2026-05-16T15:36:48.305Z","avatar_url":"https://github.com/danhpaiva.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🚀 KRT.Cliente.API: \u003cbr\u003e Uma API de Clientes Construída com .NET e Redis\n\n\u003cp align=\"center\"\u003e\n   \u003cimg src=\"https://i.ibb.co/yFg0K21T/api.png?raw=true\" width=\"700\" alt=\"Link da imagem Quebrado por permissoes do GitHub - Clique aqui para ver a imagem da API\"\u003e\n\u003c/p\u003e\n\nEste repositório apresenta um projeto de API RESTful focada na gestão de dados de clientes (`Conta`), desenvolvido em **ASP.NET Core** e seguindo as melhores práticas de engenharia de software para garantir escalabilidade, manutenibilidade e alta performance.\n\n## ✨ Pilares de Qualidade e Boas Práticas\n\nO projeto KRT.Cliente.API demonstra uma arquitetura robusta e resiliente através da aplicação rigorosa de boas práticas:\n\n### 1. 🧼 Código Limpo (Clean Code) e Padrões S.O.L.I.D.\n\nAdotei a filosofia *Clean Code* para garantir que o código seja legível, conciso e autoexplicativo, minimizando a dívida técnica a longo prazo.\n\n  * **Responsabilidade Única (SRP):** Classes e métodos possuem responsabilidades bem definidas. Por exemplo, a camada de *Controller* foca apenas em roteamento e mapeamento de requisições, delegando a lógica de negócio e persistência.\n  * **Nomeclatura Clara:** Variáveis, métodos e classes são nomeados de forma explícita, eliminando a necessidade de comentários excessivos.\n  * **Tratamento de Erros:** Exceções são tratadas de forma controlada, com mensagens claras e *status codes* HTTP apropriados (`404 Not Found`, `400 Bad Request`, `204 No Content`).\n\n### 2. ✅ Test-Driven Development (TDD) e Cobertura Total\n\nA robustez da API é assegurada por uma bateria de testes unitários e de integração, seguindo o ciclo **TDD**:\n\n  * **Mocks e Isolamento:** Utilizamos o **Moq** para isolar o código de produção, garantindo que os testes de *Controller* e serviços se concentrem apenas na lógica a ser validada, sem dependência externa (como o serviço de cache ou o banco de dados real).\n  * **Testes de Integração com EF Core InMemory:** Para validação da camada de persistência, utilizamos o provedor EF Core InMemory, simulando as interações com o banco de dados de forma rápida e controlada, crucial para verificar a concorrência e o ciclo de vida das entidades.\n  * **Correção de Problemas de Rastreamento (EF Core):** O teste `PutConta` foi corrigido para explicitamente desanexar entidades do contexto (`EntityState.Detached`) antes de anexar uma nova versão, resolvendo problemas de rastreamento de concorrência comum em testes de `Update` com EF Core.\n\n### 3. 🚀 Performance e Escalabilidade com Cache Distribuído (Redis)\n\nPara reduzir a latência e a pressão sobre o banco de dados principal, foi implementada uma estratégia de *caching* avançada, seguindo o padrão **Cache-Aside**:\n\n  * **Abstração com `IDistributedCache`:** O projeto utiliza a interface `IDistributedCache` do ASP.NET Core, permitindo a fácil substituição do provedor de cache (ex: de Redis para Memcached) sem alterar a lógica da aplicação.\n  * **Estratégia de Cache Inteligente:** A API prioriza a leitura do cache e garante a invalidação consistente dos dados em operações de escrita (`POST`, `PUT`, `DELETE`), mantendo a precisão e a performance do sistema.\n\n***\n\n## 🎯 Detalhes da Implementação de Cache na `ContasController`\n\nA `ContasController` utiliza o Redis para otimizar *endpoints* de leitura custosos, garantindo alta performance através de uma gestão rigorosa de consistência e latência.\n\n### A. Métodos de Leitura (Estratégia Cache-Aside)\n\nEstes *endpoints* buscam a informação no Redis. Se não existir (*cache miss*), a consulta é feita no banco, e o resultado é salvo no cache com um TTL (Tempo de Vida) antes de ser retornado.\n\n| Método (HTTP GET)       | Chave do Cache no Redis | Propósito da Otimização                                              |\n| :---------------------- | :---------------------- | :------------------------------------------------------------------- |\n| `GetContasAtivas()`     | `\"ContasAtivas\"`        | Otimiza a busca de lista de todas as contas ativas.                  |\n| `GetContasInativas()`   | `\"ContasInativas\"`      | Otimiza a busca de lista de todas as contas inativas.                |\n| `GetResumoStatus()`     | `\"ResumoStatus\"`        | Otimiza o cálculo de totais de contas ativas e inativas (agregação). |\n| `GetContaPorCPF(cpf)`   | `conta:{cpf}`           | Otimiza a busca individual de uma conta por CPF.                     |\n| `GetTotaisPorAno(anos)` | `TotaisPorAno:A,B...`   | Otimiza consultas de agregação complexa (`GroupBy`, `Count`).        |\n\n### B. Invalidação de Cache (Consistência)\n\nA consistência dos dados é garantida pela função auxiliar `InvalidateCaches()`, que é chamada após qualquer modificação no banco de dados. Esta invalidação remove chaves específicas (`\"ResumoStatus\"`, `\"ContasAtivas\"`, `\"ContasInativas\"` e `conta:{cpf}`) para forçar a atualização do cache na próxima leitura.\n\n| Métodos de Escrita que Invalidam o Cache     | Ação no Banco de Dados                   |\n| :------------------------------------------- | :--------------------------------------- |\n| `PostConta()`, `PutConta()`, `DeleteConta()` | Criação, Atualização e Deleção de conta. |\n| `AtivarConta()`, `InativarConta()`           | Modificação do status de uma conta.      |\n| `SoftDelete()`, `RestaurarConta()`           | Modificação do status de deleção lógica. |\n\n***\n\n### 💾 Persistência de Dados: Adotando SQLite\n\nO projeto utiliza o **SQLite** como motor de banco de dados para o desenvolvimento local e testes de integração, aproveitando suas características singulares:\n\n  * **Zero Configuração (Serverless):** O SQLite dispensa um servidor de banco de dados dedicado. O banco de dados é armazenado em um único arquivo, o que elimina a complexidade de instalação, configuração e manutenção de instâncias de bancos de dados como SQL Server ou PostgreSQL.\n  * **Portabilidade Imediata:** A facilidade de movimentação do arquivo do banco de dados torna o ambiente de desenvolvimento extremamente portátil e rápido de configurar em qualquer nova máquina.\n  * **Agilidade em CI/CD e Testes:** Em pipelines de Integração Contínua/Entrega Contínua (CI/CD), a ausência de dependências de servidor para o banco de dados simplifica o ambiente de *build* e acelera a execução de testes de integração, contribuindo para ciclos de *feedback* mais rápidos.\n\n\u003cp align=\"center\"\u003e\n   \u003cimg src=\"https://i.ibb.co/NgmkLc3L/database.png?raw=true\" width=\"700\" alt=\"Link da imagem Quebrado por permissoes do GitHub - Clique aqui para ver a imagem do Database\"\u003e\n\u003c/p\u003e\n\n-----\n\n### 🛠️ Tecnologias Utilizadas\n\n  * **Linguagem:** C\\#\n  * **Framework:** ASP.NET Core\n  * **Persistência:** Entity Framework Core (EF Core) com **SQLite** e EF Core InMemory (para testes unitários)\n  * **Testes:** xUnit, Moq\n  * **Cache:** `IDistributedCache` (Pronto para Redis)\n\n### 🚀 Como Executar o Projeto\n\n1.  **Clone o repositório:**\n\n    ```bash\n    git clone https://github.com/danhpaiva/krt-client-api-mvc-net-sqlite-xunit.git\n    cd KRT.Cliente.API\n    ```\n\n2.  **Restaure as dependências:**\n\n    ```bash\n    dotnet restore\n    ```\n\n3.  **Execute a API:**\n\n    ```bash\n    dotnet run --project KRT.Cliente.Api\n    ```\n\n    A API estará acessível em `https://localhost:7249/swagger/index.html`.\n\n### ✅ Executando os Testes\n\nPara validar a integridade e a qualidade do código, execute o conjunto completo de testes a partir da linha de comando:\n\n```bash\ndotnet test KRT.Cliente.API.Test\n```\n\n\u003cp align=\"center\"\u003e\n   \u003cimg src=\"https://i.ibb.co/sd4M9wj9/testes-unitarios.png?raw=true\" width=\"700\" alt=\"Link da imagem Quebrado por permissoes do GitHub - Clique aqui para ver a imagem dos Testes\"\u003e\n\u003c/p\u003e\n\n## 👤 Desenvolvedor\n\nEste projeto foi desenvolvido por:\n\n  * **Nome:** Daniel Paiva\n  * **LinkedIn:** [https://www.linkedin.com/in/danhpaiva/](https://www.linkedin.com/in/danhpaiva/)\n\nSinta-se à vontade para conectar-se e discutir padrões de arquitetura e resiliência\\!\n\n***Criado com ❤️ e .NET***","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanhpaiva%2Fkrt-client-api-mvc-net-sqlite-xunit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanhpaiva%2Fkrt-client-api-mvc-net-sqlite-xunit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanhpaiva%2Fkrt-client-api-mvc-net-sqlite-xunit/lists"}