Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 13 additions & 14 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,11 @@
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.2" />
<!-- EFCore.NamingConventions: Updated to 10.0.0 stable -->
<PackageVersion Include="EFCore.NamingConventions" Version="10.0.1" />
<!-- Microsoft.OpenApi: Keep at 2.3.0 for compatibility with ASP.NET Core OpenApi source generators -->
<!-- TESTED: OpenApi 3.1.3 still breaks with SDK 10.0.102 (CS0200: IOpenApiMediaType.Example is read-only) -->
<!-- The source generator has not been updated yet to support OpenApi 3.x API changes -->
<!-- Monitor: https://github.com/dotnet/aspnetcore/issues for updates -->
<PackageVersion Include="Microsoft.OpenApi" Version="2.3.0" />
<!-- Microsoft.OpenApi: Updated to 2.6.1 (2026-02-05) -->
<!-- TESTED: 2.6.1 builds successfully with SDK 10.0.102 (NO CS0200 error) -->
<!-- Previous versions (2.3.0, 3.x) had incompatibility with ASP.NET Core source generators -->
<!-- Version 2.6.1 resolves the IOpenApiMediaType.Example read-only issue -->
<PackageVersion Include="Microsoft.OpenApi" Version="2.6.1" />
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.0" />
<PackageVersion Include="Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite" Version="10.0.0" />
<!-- ========================================================================== -->
Expand Down Expand Up @@ -187,8 +187,8 @@
<PackageVersion Include="AspNetCore.HealthChecks.NpgSql" Version="9.0.0" />
<PackageVersion Include="AspNetCore.HealthChecks.Redis" Version="9.0.0" />
<!-- Background Jobs -->
<PackageVersion Include="Hangfire.Core" Version="1.8.22" />
<PackageVersion Include="Hangfire.AspNetCore" Version="1.8.22" />
<PackageVersion Include="Hangfire.Core" Version="1.8.23" />
<PackageVersion Include="Hangfire.AspNetCore" Version="1.8.23" />
<PackageVersion Include="Hangfire.PostgreSql" Version="1.20.13" />
<PackageVersion Include="Hangfire.InMemory" Version="1.0.0" />
<!-- Dependency Injection -->
Expand Down Expand Up @@ -237,19 +237,18 @@
<PackageVersion Include="Aspire.Hosting.Keycloak" Version="13.1.0-preview.1.25616.3" />
<PackageVersion Include="Aspire.Hosting.PostgreSQL" Version="13.1.0" />
<PackageVersion Include="Aspire.Hosting.RabbitMQ" Version="13.1.0" />
<!-- Aspire.Hosting.Redis: DOWNGRADE para 13.0.2 devido a bug em 13.1.0 -->
<!-- 13.1.0 força configuração TLS (rediss://) causando erros de health check -->
<!-- Health check tenta conexão TCP sem TLS mas container espera SSL handshake -->
<!-- Erro observado: "An error occurred while writing to logger(s). (SSL Handshake failed)" -->
<!-- Monitorar: https://github.com/dotnet/aspire/issues para issue sobre Redis TLS em desenvolvimento -->
<PackageVersion Include="Aspire.Hosting.Redis" Version="13.0.2" />
<!-- Aspire.Hosting.Redis: Updated to 13.1.0 (2026-02-05) -->
<!-- TLS bug from early 13.1.0 release was FIXED in late 2025 -->
<!-- TESTED: 13.1.0 builds and runs without SSL Handshake errors -->
<!-- HTTPS termination is now opt-in (not forced) -->
<PackageVersion Include="Aspire.Hosting.Redis" Version="13.1.0" />
<PackageVersion Include="Aspire.Hosting.Seq" Version="13.1.0" />
<PackageVersion Include="Aspire.Npgsql" Version="13.1.0" />
<PackageVersion Include="Aspire.StackExchange.Redis" Version="13.0.2" />
<!-- Architecture Testing -->
<PackageVersion Include="NetArchTest.Rules" Version="1.3.2" />
<!-- Code Analysis -->
<PackageVersion Include="SonarAnalyzer.CSharp" Version="10.18.0.131500" />
<PackageVersion Include="SonarAnalyzer.CSharp" Version="10.19.0.132793" />
<!-- Blazor UI & State Management -->
<PackageVersion Include="MudBlazor" Version="8.15.0" />
<PackageVersion Include="Fluxor.Blazor.Web" Version="6.9.0" />
Expand Down
38 changes: 16 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Uma plataforma abrangente de serviços construída com .NET Aspire, projetada para conectar prestadores de serviços com clientes usando arquitetura monólito modular.

<!-- Atualizado: 17 Janeiro 2026 - Sprint 7.16 em andamento (Keycloak Automation + Technical Debt) -->
<!-- Atualizado: 5 Fevereiro 2026 - Sprint 7.21 (Package Updates: Microsoft.OpenApi 2.6.1, Aspire.Hosting.Redis 13.1.0, SonarAnalyzer.CSharp 10.19.0) -->

## 🎯 Visão Geral

Expand All @@ -24,6 +24,8 @@ O **MeAjudaAi** é uma plataforma moderna de marketplace de serviços que implem
- **MudBlazor 8.15.0** - Material Design UI components
- **Fluxor 6.9.0** - Redux state management
- **Entity Framework Core 10.0.2** - ORM e persistência
- **Microsoft.OpenApi 2.6.1** - OpenAPI specification
- **SonarAnalyzer.CSharp 10.19.0** - Code quality analysis
- **PostgreSQL 16** - Banco de dados principal
- **Keycloak 26.0.2** - Autenticação OAuth2/OIDC
- **Redis 7** - Cache distribuído
Expand Down Expand Up @@ -127,11 +129,19 @@ O projeto foi organizado para facilitar navegação e manutenção:
.\scripts\dev.ps1
```

**Pronto!** 🎉 Acesse:
- **Aspire Dashboard**: [https://localhost:17063/](https://localhost:17063/)
- **Admin Portal**: [https://localhost:7032/](https://localhost:7032/) (via Aspire)
- **API**: [https://localhost:7524/](https://localhost:7524/) (Swagger: /swagger)
- **Keycloak**: [http://localhost:8080/](http://localhost:8080/) (admin/senha gerada)
**Pronto!** 🎉 Acesse os serviços em desenvolvimento:

| Serviço | URL | Credenciais | Descrição |
|---------|-----|-------------|-----------|
| **Aspire Dashboard** | https://localhost:17063/ | - | Orquestração e observabilidade |
| **Admin Portal** | https://localhost:7032/ | admin.portal/admin123 | Portal administrativo Blazor |
| **API** | https://localhost:7524/swagger | - | API REST com Swagger UI |
| **Keycloak** | http://localhost:8080/ | admin/[console logs] | Autenticação OAuth2/OIDC |
| **PostgreSQL** | localhost:5432 | postgres/[gerada] | Banco de dados |
| **Redis** | localhost:6379 | - | Cache distribuído |
| **RabbitMQ** | http://localhost:15672/ | meajudaai/[gerada] | Message broker |

> ⚠️ **Ambiente local**: Credenciais/portas acima são valores de desenvolvimento. **Não reutilize em produção.**

### 🔄 Uso Diário

Expand Down Expand Up @@ -203,22 +213,6 @@ dotnet test tests/MeAjudaAi.Modules.Users.Tests/

---

## 🌐 URLs dos Serviços (Desenvolvimento)

> ⚠️ **Ambiente local**: Credenciais/portas abaixo são valores de desenvolvimento. **Não reutilize em produção.**

| Serviço | URL | Credenciais | Configuração |
|---------|-----|-------------|-------------|
| **Aspire Dashboard** | [https://localhost:17063/](https://localhost:17063/) | - | `AppHost/launchSettings.json` |
| **Admin Portal** | [https://localhost:7032/](https://localhost:7032/) | admin.portal/admin123 | Via Aspire (auto-start) |
| **API** | [https://localhost:7524/swagger](https://localhost:7524/swagger) | - | `ApiService/launchSettings.json` |
| **Keycloak** | [http://localhost:8080/](http://localhost:8080/) | admin/[console logs] | `compose/development.yml` |
| **PostgreSQL** | localhost:5432 | postgres/[gerada] | Docker Compose |
| **Redis** | localhost:6379 | - | Docker Compose |
| **RabbitMQ** | [http://localhost:15672/](http://localhost:15672/) | meajudaai/[gerada] | Docker Compose |



## 🧩 Módulos do Sistema

### 👥 Users
Expand Down
1 change: 1 addition & 0 deletions docs/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ Este documento consolida o planejamento estratégico e tático da plataforma MeA
- ✅ **16 Jan 2026**: Sprint 7.15 - Package Updates & Resilience Migration (CONCLUÍDO - .NET 10.0.2, deprecated packages removed)
- ✅ **17-21 Jan 2026**: Sprint 7.16 - Technical Debt Sprint (CONCLUÍDO - Keycloak automation, warnings, tests, records)
- ✅ **5 Fev 2026**: Sprint 7.20 - Dashboard Charts & Data Mapping Fixes (CONCLUÍDO - JSON property mapping, debug messages removed)
- ✅ **5 Fev 2026**: Sprint 7.21 - Package Updates & Bug Fixes (CONCLUÍDO - Microsoft.OpenApi 2.6.1, Aspire.Hosting.Redis 13.1.0, SonarAnalyzer.CSharp 10.19.0)
- ⏳ **22 Jan - 4 Fev 2026**: Sprint 8 - Customer App (Web + Mobile)
- ⏳ **5-14 Fev 2026**: Sprint 9 - BUFFER (Polishing, Risk Mitigation, Final Testing)
Comment thread
frigini marked this conversation as resolved.
- 🎯 **17 Fevereiro 2026**: MVP Launch (Admin Portal + Customer App)
Expand Down
41 changes: 0 additions & 41 deletions docs/technical-debt.md
Original file line number Diff line number Diff line change
Expand Up @@ -181,47 +181,6 @@ Hangfire.PostgreSql 1.20.13 foi compilado contra Npgsql 6.x, mas o projeto está

---

## 📦 Microsoft.OpenApi 2.3.0 - Bloqueio de Atualização

**Arquivo**: `Directory.Packages.props`
**Situação**: BLOQUEADO - Incompatibilidade com ASP.NET Core Source Generators
**Severidade**: BAIXA (funciona perfeitamente na versão atual)
**Status**: Pinado em 2.3.0

**Descrição**:
Microsoft.OpenApi 3.x é incompatível com os source generators do ASP.NET Core 10.0. Erro confirmado em teste realizado em 16/01/2026 com SDK 10.0.102.

**Erro Encontrado**:
```text
error CS0200: Property or indexer 'IOpenApiMediaType.Example' cannot be assigned to -- it is read only
```

**Testes Realizados**:
- ✅ Testado com SDK 10.0.101 (Dez 2025) - incompatível
- ✅ Testado com SDK 10.0.102 (Jan 2026) - incompatível
- ✅ Testado Microsoft.OpenApi 3.1.3 (16 Jan 2026) - build falha
- ✅ Confirmado que 2.3.0 funciona perfeitamente

**Causa Raiz**:
- Microsoft.OpenApi 3.x mudou `IOpenApiMediaType.Example` para read-only
- ASP.NET Core source generator ainda gera código que tenta escrever nessa propriedade
- Source generator não foi atualizado para API do OpenApi 3.x

**Decisão**: Manter Microsoft.OpenApi 2.3.0
- ✅ Funciona 100%
- ✅ Zero impacto em funcionalidades
- ✅ Swagger UI completo e funcional
- ⚠️ Versão desatualizada (mas estável)

**Monitoramento**:
- [ ] Verificar releases do .NET SDK para correções no source generator
- [ ] Testar Microsoft.OpenApi 3.x a cada atualização de SDK

**Prioridade**: BAIXA (não urgente, não afeta funcionalidade)
**Monitorar**: <https://github.com/dotnet/aspnetcore/issues>

---

## 📋 Padronização de Records

**Arquivo**: Múltiplos arquivos em `src/Shared/Contracts/**` e `src/Modules/**/Domain/**`
Expand Down
45 changes: 23 additions & 22 deletions src/Aspire/MeAjudaAi.AppHost/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -285,13 +285,13 @@
},
"Aspire.Hosting.Redis": {
"type": "Direct",
"requested": "[13.0.2, )",
"resolved": "13.0.2",
"contentHash": "c8aPhpzF9BSNNMyqbwWDgddwroGgju+DTrQ32dPZQSKuI/N1gqURNz7Wzuc6TedQK+RVNiObnBTy64aJVQWhPg==",
"requested": "[13.1.0, )",
"resolved": "13.1.0",
"contentHash": "UNRS9btygxg2T9JxiPp4HaUCAJDw/YwhlZvdCV+6tblWd+pqwFckGhiJSy78DTy7nulaLVWpfpfma0KMHrVLzQ==",
"dependencies": {
"AspNetCore.HealthChecks.Redis": "9.0.0",
"AspNetCore.HealthChecks.Uris": "9.0.0",
"Aspire.Hosting": "13.0.2",
"Aspire.Hosting": "13.1.0",
"Google.Protobuf": "3.33.0",
"Grpc.AspNetCore": "2.71.0",
"Grpc.Net.ClientFactory": "2.71.0",
Expand All @@ -303,6 +303,7 @@
"Microsoft.Extensions.Configuration.Binder": "8.0.2",
"Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
"Microsoft.Extensions.Diagnostics.HealthChecks": "8.0.22",
"Microsoft.Extensions.FileSystemGlobbing": "10.0.1",
"Microsoft.Extensions.Hosting": "8.0.1",
"Microsoft.Extensions.Hosting.Abstractions": "8.0.1",
"Microsoft.Extensions.Http": "8.0.1",
Expand Down Expand Up @@ -385,9 +386,9 @@
},
"SonarAnalyzer.CSharp": {
"type": "Direct",
"requested": "[10.18.0.131500, )",
"resolved": "10.18.0.131500",
"contentHash": "Rbad71/k5e8MfG81i03Yh2YQQgovIdmyhWcLRevrcW4h9i1DUB3kKX9O1QiOGXcULLjkTdRAXdR8A8XtinL3Pg=="
"requested": "[10.19.0.132793, )",
"resolved": "10.19.0.132793",
"contentHash": "vDQSFE+KU5pXfVNzz4R4CA0ZGuLO35Sn+a7z2nyV9EM/nHsvl+WFGZ61Uk9eTdbhta1YXzqCMXB2B+6dn6ykVA=="
},
"Asp.Versioning.Abstractions": {
"type": "Transitive",
Expand Down Expand Up @@ -826,10 +827,10 @@
},
"Hangfire.NetCore": {
"type": "Transitive",
"resolved": "1.8.22",
"contentHash": "I7LiUHpC3ks7k+vLFOdwwCwDHxT83H+Mv6bT+7vkI1SLOc4Vwv2zOWdeeN1K86vddu7R36ho+eKP0gvfYlSZjg==",
"resolved": "1.8.23",
"contentHash": "SmvUJF/u5MCP666R5Y1V+GntqBc4RCWJqn5ztMMN67d53Cx5cuaWR0YNLMrabjylwLarFYJ7EdR9RnGEZzp/dg==",
"dependencies": {
"Hangfire.Core": "[1.8.22]",
"Hangfire.Core": "[1.8.23]",
"Microsoft.Extensions.DependencyInjection.Abstractions": "3.0.0",
"Microsoft.Extensions.Hosting.Abstractions": "3.0.0",
"Microsoft.Extensions.Logging.Abstractions": "3.0.0"
Expand Down Expand Up @@ -1450,8 +1451,8 @@
"Dapper": "[2.1.66, )",
"FluentValidation": "[12.1.1, )",
"FluentValidation.DependencyInjectionExtensions": "[12.1.1, )",
"Hangfire.AspNetCore": "[1.8.22, )",
"Hangfire.Core": "[1.8.22, )",
"Hangfire.AspNetCore": "[1.8.23, )",
"Hangfire.Core": "[1.8.23, )",
"Hangfire.PostgreSql": "[1.20.13, )",
"MeAjudaAi.Contracts": "[1.0.0, )",
"Microsoft.AspNetCore.OpenApi": "[10.0.2, )",
Expand Down Expand Up @@ -1590,18 +1591,18 @@
},
"Hangfire.AspNetCore": {
"type": "CentralTransitive",
"requested": "[1.8.22, )",
"resolved": "1.8.22",
"contentHash": "Ud5ZNnH9q5+3MryiuPTW7baRERN9QYLyX+8muLwH9BqumoE9eWZRxna9RrunYaMVkNGbTUUuwOfSYIvCC222TQ==",
"requested": "[1.8.23, )",
"resolved": "1.8.23",
"contentHash": "TXpOl7kX4xXq5bLEqqWCpt9zh3TaouDwtb3GDtzGHX5uSC2RaAqZzn2swevivx3Uki16slXIigiPtgr4TPKpsg==",
"dependencies": {
"Hangfire.NetCore": "[1.8.22]"
"Hangfire.NetCore": "[1.8.23]"
}
},
"Hangfire.Core": {
"type": "CentralTransitive",
"requested": "[1.8.22, )",
"resolved": "1.8.22",
"contentHash": "fjgEtlfkLNnUcX9IB+fp3gTPtt5G7VJ0PCcoKLEWnXJXn5qTm/mvrm/t3/T+Xj35ZePtbWBm+j2PXE0beFwzbA==",
"requested": "[1.8.23, )",
"resolved": "1.8.23",
"contentHash": "YCOTtF3NNOQI83PlfjeNDDBkofJDfdET2CwhfQsiVBwmsU6lP19QW9NVTIH9epl+MnOsyFC2G1RnlPSGV8F1FQ==",
"dependencies": {
"Newtonsoft.Json": "11.0.1"
}
Expand Down Expand Up @@ -1886,9 +1887,9 @@
},
"Microsoft.OpenApi": {
"type": "CentralTransitive",
"requested": "[2.3.0, )",
"resolved": "2.3.0",
"contentHash": "5RZpjyt0JMmoc/aEgY9c1vE5pusdDGvkPl9qKIy9KFbRiIXD+w7gBJxX+unSjzzOcfgRoYxnO4okZyqDAL2WEw=="
"requested": "[2.6.1, )",
"resolved": "2.6.1",
"contentHash": "PsuxkZR3JXrfiMQUGkdb+U8sMgNqcEqmeBITnJswScWgxvQs73aagmaiww+TMgrAtPpIvveJb3nFICDkPfKXUQ=="
},
"Npgsql.EntityFrameworkCore.PostgreSQL.NetTopologySuite": {
"type": "CentralTransitive",
Expand Down
36 changes: 18 additions & 18 deletions src/Aspire/MeAjudaAi.ServiceDefaults/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -111,9 +111,9 @@
},
"SonarAnalyzer.CSharp": {
"type": "Direct",
"requested": "[10.18.0.131500, )",
"resolved": "10.18.0.131500",
"contentHash": "Rbad71/k5e8MfG81i03Yh2YQQgovIdmyhWcLRevrcW4h9i1DUB3kKX9O1QiOGXcULLjkTdRAXdR8A8XtinL3Pg=="
"requested": "[10.19.0.132793, )",
"resolved": "10.19.0.132793",
"contentHash": "vDQSFE+KU5pXfVNzz4R4CA0ZGuLO35Sn+a7z2nyV9EM/nHsvl+WFGZ61Uk9eTdbhta1YXzqCMXB2B+6dn6ykVA=="
},
"Asp.Versioning.Abstractions": {
"type": "Transitive",
Expand Down Expand Up @@ -162,10 +162,10 @@
},
"Hangfire.NetCore": {
"type": "Transitive",
"resolved": "1.8.22",
"contentHash": "I7LiUHpC3ks7k+vLFOdwwCwDHxT83H+Mv6bT+7vkI1SLOc4Vwv2zOWdeeN1K86vddu7R36ho+eKP0gvfYlSZjg==",
"resolved": "1.8.23",
"contentHash": "SmvUJF/u5MCP666R5Y1V+GntqBc4RCWJqn5ztMMN67d53Cx5cuaWR0YNLMrabjylwLarFYJ7EdR9RnGEZzp/dg==",
"dependencies": {
"Hangfire.Core": "[1.8.22]"
"Hangfire.Core": "[1.8.23]"
}
},
"Humanizer.Core": {
Expand Down Expand Up @@ -582,8 +582,8 @@
"Dapper": "[2.1.66, )",
"FluentValidation": "[12.1.1, )",
"FluentValidation.DependencyInjectionExtensions": "[12.1.1, )",
"Hangfire.AspNetCore": "[1.8.22, )",
"Hangfire.Core": "[1.8.22, )",
"Hangfire.AspNetCore": "[1.8.23, )",
"Hangfire.Core": "[1.8.23, )",
"Hangfire.PostgreSql": "[1.20.13, )",
"MeAjudaAi.Contracts": "[1.0.0, )",
"Microsoft.AspNetCore.OpenApi": "[10.0.2, )",
Expand Down Expand Up @@ -688,18 +688,18 @@
},
"Hangfire.AspNetCore": {
"type": "CentralTransitive",
"requested": "[1.8.22, )",
"resolved": "1.8.22",
"contentHash": "Ud5ZNnH9q5+3MryiuPTW7baRERN9QYLyX+8muLwH9BqumoE9eWZRxna9RrunYaMVkNGbTUUuwOfSYIvCC222TQ==",
"requested": "[1.8.23, )",
"resolved": "1.8.23",
"contentHash": "TXpOl7kX4xXq5bLEqqWCpt9zh3TaouDwtb3GDtzGHX5uSC2RaAqZzn2swevivx3Uki16slXIigiPtgr4TPKpsg==",
"dependencies": {
"Hangfire.NetCore": "[1.8.22]"
"Hangfire.NetCore": "[1.8.23]"
}
},
"Hangfire.Core": {
"type": "CentralTransitive",
"requested": "[1.8.22, )",
"resolved": "1.8.22",
"contentHash": "fjgEtlfkLNnUcX9IB+fp3gTPtt5G7VJ0PCcoKLEWnXJXn5qTm/mvrm/t3/T+Xj35ZePtbWBm+j2PXE0beFwzbA==",
"requested": "[1.8.23, )",
"resolved": "1.8.23",
"contentHash": "YCOTtF3NNOQI83PlfjeNDDBkofJDfdET2CwhfQsiVBwmsU6lP19QW9NVTIH9epl+MnOsyFC2G1RnlPSGV8F1FQ==",
"dependencies": {
"Newtonsoft.Json": "11.0.1"
}
Expand Down Expand Up @@ -789,9 +789,9 @@
},
"Microsoft.OpenApi": {
"type": "CentralTransitive",
"requested": "[2.3.0, )",
"resolved": "2.3.0",
"contentHash": "5RZpjyt0JMmoc/aEgY9c1vE5pusdDGvkPl9qKIy9KFbRiIXD+w7gBJxX+unSjzzOcfgRoYxnO4okZyqDAL2WEw=="
"requested": "[2.6.1, )",
"resolved": "2.6.1",
"contentHash": "PsuxkZR3JXrfiMQUGkdb+U8sMgNqcEqmeBITnJswScWgxvQs73aagmaiww+TMgrAtPpIvveJb3nFICDkPfKXUQ=="
},
"Npgsql.EntityFrameworkCore.PostgreSQL": {
"type": "CentralTransitive",
Expand Down
Loading
Loading