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
17 changes: 17 additions & 0 deletions .coderabbit.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# yaml-language-server: $schema=https://coderabbit.ai/export/schema.json
language: "pt-BR"
reviews:
path_filters:
- "!**/*.lock"
- "!**/package-lock.json"
- "!**/yarn.lock"
- "!**/pnpm-lock.yaml"
- "!**/Migrations/**"
- "!**/*.Designer.cs"
- "!**/*.generated.*"
- "!**/.nx/**"
- "!**/dist/**"
- "!**/bin/**"
- "!**/obj/**"
- "!**/CoverageReport/**"
- "!**/TestResults/**"
5 changes: 5 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ dotnet_diagnostic.CA1051.severity = none # Do not declare visible instance field
dotnet_diagnostic.CA1852.severity = none # Type can be sealed
dotnet_diagnostic.CA1507.severity = none # Use nameof in place of string literal

# Technical Excellence Sprint Suppressions (Avoiding source code pollution)
# S2068 (Hardcoded passwords) and S3267 (LINQ simplification) have been removed from global suppressions.
# They should be managed with inline `#pragma` warnings where strictly necessary.
dotnet_diagnostic.CS0105.severity = none # Duplicate using directive: Suppressed to avoid noise while refactoring Shared (TODO: Remove by the end of Sprint 8B.3)

# Restore critical rules to suggestions to catch potential bugs
dotnet_diagnostic.CS8602.severity = suggestion # Dereference of a possibly null reference
dotnet_diagnostic.CS8618.severity = suggestion # Non-nullable field must contain a non-null value
Expand Down
1,206 changes: 1,206 additions & 0 deletions docs/roadmap-current.md

Large diffs are not rendered by default.

51 changes: 51 additions & 0 deletions docs/roadmap-future.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
### 🔍 **Baixa Prioridade (12+ meses - Fase 3)**
1. 📅 Service Requests & Booking
2. 📱 Mobile Apps (iOS/Android nativo)
3. 🧠 Recomendações com ML
4. 🎮 Gamificação avançada
5. 💬 Chat interno
6. 🌐 Internacionalização

---

## 📚 Referências e Recursos

### 📖 Documentação Relacionada
- **Arquitetura**: [`docs/architecture.md`](./architecture.md) - Princípios e padrões arquiteturais
- **Desenvolvimento**: [`docs/development.md`](./development.md) - Guia de setup e workflow
- **Autenticação**: [`docs/authentication-and-authorization.md`](./authentication-and-authorization.md) - Keycloak e OIDC
- **CI/CD**: [`docs/ci-cd.md`](./ci-cd.md) - Pipeline e deployment

### 🔥 Ferramentas e Tecnologias
- **.NET 10.0** - Runtime principal (migrado de .NET 9.0)
- **PostgreSQL + PostGIS** - Database com suporte geoespacial
- **Keycloak** - Identity & Access Management
- **Stripe** - Payment processing
- **Azure Blob Storage** - Document storage
- **OpenTelemetry + Aspire** - Observability

### 🌐 APIs Externas
- **IBGE Localidades API** - Validação oficial de municípios brasileiros
- Base URL: `https://servicodados.ibge.gov.br/api/v1/localidades/`
- Documentação: <https://servicodados.ibge.gov.br/api/docs/localidades>
- Uso: Validação geográfica para restrição de cidades piloto
- **Nominatim (OpenStreetMap)** - Geocoding (planejado para Sprint 4 - optional improvement)
- Base URL: `https://nominatim.openstreetmap.org/`
- Documentação: <https://nominatim.org/release-docs/latest/>
- Uso: Geocoding (lat/lon lookup) para cidades/endereços
- **Note**: Post-MVP feature, não é blocker para geographic-restriction inicial
- **ViaCep API** - Lookup de CEP brasileiro
- Base URL: `https://viacep.com.br/ws/`
- Documentação: <https://viacep.com.br/>
- **BrasilApi CEP** - Lookup de CEP (fallback)
- Base URL: `https://brasilapi.com.br/api/cep/v1/`
- Documentação: <https://brasilapi.com.br/docs>
- **OpenCep API** - Lookup de CEP (fallback)
- Base URL: `https://opencep.com/v1/`
- Documentação: <https://opencep.com/>

---

*📅 Última atualização: 9 de Março de 2026 (Sprint 8B.2 Refinement)*
*🔄 Roadmap em constante evolução baseado em feedback, métricas e aprendizados*
*📊 Status atual: Sprint 8B.2 🔄 EM ANDAMENTO | MVP Launch em 12-16 de Maio de 2026*
3,903 changes: 3,903 additions & 0 deletions docs/roadmap-history.md

Large diffs are not rendered by default.

5,087 changes: 24 additions & 5,063 deletions docs/roadmap.md

Large diffs are not rendered by default.

174 changes: 35 additions & 139 deletions docs/technical-debt.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Débito Técnico e Rastreamento de Melhorias

Este documento rastreia **apenas débitos técnicos PENDENTES**. Itens resolvidos são removidos deste documento.
Este documento rastreia **débitos técnicos e seu histórico de otimização**. Itens podem aparecer como PENDENTES ou OTIMIZADO/FECHADO para histórico.

---

Expand All @@ -12,30 +12,21 @@ Este documento rastreia **apenas débitos técnicos PENDENTES**. Itens resolvido
### 🎨 Frontend - Warnings de Analyzers (BAIXA)

**Severidade**: BAIXA (code quality)
**Sprint**: Sprint 7.16 (planejado)
**Status**: 🔄 EM SPRINT 8B.2 (Refactoring)

**Descrição**: Build do Admin Portal gera warnings de analyzers (SonarLint + MudBlazor):
**Descrição**: Build do Admin Portal e Contracts gera warnings de analyzers (SonarLint + MudBlazor).

**Warnings SonarLint**:
1. **S2094** (6 ocorrências): Empty records em Actions
- `DashboardActions.cs`: `LoadDashboardStatsAction` (record vazio)
- `ProvidersActions.cs`: `LoadProvidersAction`, `GoToPageAction` (records vazios)
- `ThemeActions.cs`: `ToggleDarkModeAction`, `SetDarkModeAction` (records vazios)
- **Recomendação**: Converter para `interface` ou adicionar propriedades quando houver parâmetros

2. **S2953** (1 ocorrência): `App.razor:58` - Método `Dispose()` não implementa `IDisposable`
- **Recomendação**: Renomear método ou implementar interface corretamente
**Warnings MudBlazor (MeAjudaAi.Web.Admin)**:
1. **S2094** (records vazios em Actions)
2. **S2953** (App.razor Dispose)
3. **MUD0002** (Casing de atributos HTML em MainLayout.razor)

3. **S2933** (1 ocorrência): `App.razor:41` - Campo `_theme` deve ser `readonly`
- **Recomendação**: Adicionar modificador `readonly`
**Warnings Analisador de Segurança (MeAjudaAi.Contracts)**:
4. **Hard-coded Credential False Positive**: `src/Contracts/Utilities/Constants/ValidationMessages.cs`
- **Problema**: Mensagens de erro contendo a palavra "Password" disparam o scanner.
- **Ação**: Adicionar `[SuppressMessage]` ou `.editorconfig` exclusion.

**Warnings MudBlazor**:
4. **MUD0002** (3 ocorrências): Atributos com casing incorreto em `MainLayout.razor`
- `AriaLabel` → `aria-label` (lowercase)
- `Direction` → `direction` (lowercase)
- **Recomendação**: Atualizar para lowercase conforme padrão HTML

**Impacto**: Nenhum - build continua 100% funcional
**Impacto**: Nenhum - build continua 100% funcional.

---

Expand Down Expand Up @@ -77,144 +68,42 @@ Este documento rastreia **apenas débitos técnicos PENDENTES**. Itens resolvido

---

### 🔐 Keycloak Client - Configuração Manual (MÉDIA)

**Severidade**: MÉDIA (developer experience)
**Sprint**: Sprint 7.16 (automação desejável)

**Descrição**: Client `admin-portal` precisa ser criado MANUALMENTE no Keycloak realm `meajudaai`.

**Situação Atual**:
- ✅ Documentação completa: `docs/keycloak-admin-portal-setup.md`
- ❌ Processo manual (8-10 passos via Admin Console)

**Problemas**:
1. **Onboarding lento**: Novo desenvolvedor precisa seguir ~10 passos
2. **Erro humano**: Fácil esquecer redirect URIs ou roles
3. **Reprodutibilidade**: Ambiente local pode divergir de dev/staging

**Ações Recomendadas** (Sprint 7.16):
- [ ] Criar script de automação: `scripts/setup-keycloak-clients.ps1`
- [ ] Usar Keycloak Admin REST API para criar client programaticamente
- [ ] Integrar script em `dotnet run --project src/Aspire/MeAjudaAi.AppHost`

**Impacto**: Developer experience - não bloqueia produção

---

## 🔄 Refatorações de Código (BACKLOG)

**Status**: Baixa prioridade, não críticos para MVP

### 🏗️ Refatoração MeAjudaAi.Shared.Messaging (BACKLOG)

**Severidade**: BAIXA (manutenibilidade)
**Sprint**: BACKLOG

**Problemas Remanescentes**:
- `RabbitMqInfrastructureManager.cs` não possui interface separada `IRabbitMqInfrastructureManager` (avaliar necessidade)
- Integration Events ausentes: Documents, SearchProviders, ServiceCatalogs não possuem integration events
- Faltam event handlers para comunicação entre módulos
### 🏗️ Refatoração MeAjudaAi.Shared.Messaging (OTIMIZADO)

**Ações Pendentes**:
- [ ] Avaliar necessidade de extrair `IRabbitMqInfrastructureManager` para arquivo separado
- [ ] Adicionar integration events para módulos faltantes (quando houver necessidade)
- [ ] Criar testes unitários para classes de messaging (se coverage cair abaixo do threshold)

**Prioridade**: BAIXA
**Estimativa**: 4-6 horas
**Status**: ✅ `IRabbitMqInfrastructureManager` implementado.
**Pendente**: Event handlers para comunicação entre novos módulos (SearchProviders, ServiceCatalogs).

---

### 🔧 Refatoração Extensions (MeAjudaAi.Shared)

**Severidade**: BAIXA (manutenibilidade)
**Sprint**: BACKLOG
## 🔗 GitHub Issues - Débitos Técnicos Sincronizados

**Problemas**:
1. **Extensions dentro de classes de implementação**: `BusinessMetricsMiddlewareExtensions` está dentro de `BusinessMetricsMiddleware.cs`
2. **Falta de consolidação**: Extensions espalhadas em múltiplos arquivos
### 🔐 [ISSUE #141] Reintegrar login social com Instagram via Keycloak OIDC
**Severidade**: BAIXA (feature parity)
**Status**: OPEN
**Descrição**: Keycloak 26.x removeu built-in Instagram provider. Necessário configurar como generic OIDC.

**Ações Pendentes**:
- [ ] Extrair `BusinessMetricsMiddlewareExtensions` para arquivo próprio
- [ ] Criar arquivos consolidados: `MonitoringExtensions.cs`, `CachingExtensions.cs`, `MessagingExtensions.cs`, `AuthorizationExtensions.cs`
- [ ] Documentar padrão: cada funcionalidade tem seu `<Funcionalidade>Extensions.cs`

**Prioridade**: BAIXA
**Estimativa**: 4-6 horas
### 🚀 [ISSUE #112] tech: aguardar versão stable do Aspire.Hosting.Keycloak
**Status**: 📋 OTIMIZADO (Sprint 8B.2)
**Descrição**: Aspire.Hosting.Keycloak (preview) não suporta health checks reais. Serviços iniciam sem esperar Keycloak estar pronto.
**Impacto**: Console logs do backend e Admin Portal mostram falhas de conexão transientes até Keycloak inicializar.

---

## ⚠️ CRÍTICO: Hangfire + Npgsql 10.x Compatibility Risk

**Arquivo**: `Directory.Packages.props`
**Situação**: MONITORAMENTO CONTÍNUO
**Severidade**: MÉDIA (funciona em desenvolvimento, não validado em produção)
**Status**: Sistema rodando com Npgsql 10.0 + Hangfire.PostgreSql 1.20.13

**Descrição**:
Hangfire.PostgreSql 1.20.13 foi compilado contra Npgsql 6.x, mas o projeto está usando Npgsql 10.x (EF Core 10.0.2). A compatibilidade funciona em desenvolvimento mas não foi formalmente validada pelo mantenedor do Hangfire.

**Status Atual**:
- ✅ **Build**: Compila sem erros
- ✅ **Desenvolvimento**: Aplicação funciona normalmente
- ⚠️ **Produção**: Não validado com carga real

**Mitigação Implementada**:
1. ✅ Documentação detalhada em `Directory.Packages.props`
2. ✅ Health checks configurados
3. ✅ Procedimentos de rollback documentados
4. ⚠️ Monitoramento de produção pendente

**Ações Pendentes**:
- [ ] Validação em ambiente staging com carga similar a produção
- [ ] Monitoramento de taxa de falha de jobs (<5% threshold)
- [ ] Configuração de alertas para problemas Hangfire/Npgsql

**Fallback Strategies**:
1. **Downgrade para Npgsql 8.x** (se problemas detectados)
2. **Aguardar Hangfire.PostgreSql 2.x** (com suporte Npgsql 10)
3. **Backend alternativo** (Hangfire.Pro.Redis, Hangfire.SqlServer)

**Prioridade**: MÉDIA
**Monitorar**: <https://github.com/frankhommers/Hangfire.PostgreSql/issues>
**Situação**: MONITORAMENTO CONTÍNUO (Issue #39 CLOSED, mitigado)
**Severidade**: MÉDIA
**Status**: Atualizado para **Hangfire.PostgreSql 1.21.1**.
**Nota**: Compatibilidade com Npgsql 10.x validada em desenvolvimento. Aguardar versão 2.x para suporte oficial total.

---

## 📋 Padronização de Records

**Arquivo**: Múltiplos arquivos em `src/Shared/Contracts/**` e `src/Modules/**/Domain/**`
**Severidade**: MÉDIA (padronização importante)
**Sprint**: Sprint 7.16 (Dia 5, ~0.5 dia)

**Descrição**: Existem dois padrões de sintaxe para records no projeto:

**Padrão 1 - Positional Records**:
```csharp
public sealed record ModuleCoordinatesDto(double Latitude, double Longitude);
```

**Padrão 2 - Property-based Records**:
```csharp
public sealed record ModuleLocationDto
{
public required double Latitude { get; init; }
public required double Longitude { get; init; }
}
```

**Recomendação**:
- DTOs simples → Positional Records
- Value Objects com validação → Property-based Records

**Ação Sugerida** (Sprint 7.16):
- [ ] Padronizar records em `src/Shared/Contracts/**/*.cs`
- [ ] Padronizar records em `src/Modules/**/Domain/**/*.cs`

**Prioridade**: BAIXA
**Estimativa**: 2-3 horas

---

## 🔮 Melhorias Futuras (Backlog)

Expand Down Expand Up @@ -271,6 +160,13 @@ public sealed record ModuleLocationDto

---

## ✅ Resumo de Débitos Técnicos Resolvidos (Sprint 8B.2 - Tech Excellence)

### 🛡️ Final Technical Excellence - Automação e Padrões
- ✅ **Automação Keycloak**: Implementado `KeycloakBootstrapService` no AppHost para criar automaticamente os clients via API REST do Keycloak durante a inicialização, substituindo a necessidade de scripts PowerShell externos.
- ✅ **Refatoração Shared**: Extensões de monitoramento centralizadas em `MonitoringExtensions.cs`.
- ✅ **Issue #113**: Configuração de logging de resiliência HTTP com Polly modernizada para injetar `ILogger` a partir do DI, corrigindo problemas de log tracking.
- ✅ **Padronização de Records**: Sintaxe de DTOs atualizada para o formato "Positional Records" (ex: `ModuleDocumentDto`), mantendo a abordagem property-based apenas onde há validação complexa de domínio.
## 📝 Instruções para Mantenedores

1. **Conversão para Issues**: Copiar descrição para GitHub issue com labels (`technical-debt`, `testing`, `enhancement`)
Expand Down
10 changes: 10 additions & 0 deletions src/Aspire/MeAjudaAi.AppHost/Options/MeAjudaAiKeycloakOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,16 @@ public sealed class MeAjudaAiKeycloakOptions
/// </summary>
public bool ExposeHttpEndpoint { get; set; } = true;

/// <summary>
/// URL Endpoint Reference para o Admin Portal
/// </summary>
public Aspire.Hosting.ApplicationModel.EndpointReference? AdminPortalEndpoint { get; set; }

/// <summary>
/// URL Endpoint Reference para o Customer Web
/// </summary>
public Aspire.Hosting.ApplicationModel.EndpointReference? CustomerWebEndpoint { get; set; }

/// <summary>
/// Realm a ser importado na inicialização (configurar via KEYCLOAK_IMPORT_REALM se necessário)
/// </summary>
Expand Down
Loading
Loading