Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
95 commits
Select commit Hold shift + click to select a range
95f52e7
fix: configurar caminhos Aspire para pacotes NuGet locais
Jan 9, 2026
60cbb06
fix: eliminar todos os warnings de NuGet
Jan 9, 2026
5bdc442
fix: corrigir detecção de SolutionRoot no Directory.Build.targets
Jan 9, 2026
e04dacb
fix: configurar variáveis de ambiente Aspire via código
Jan 9, 2026
895db26
fix: corrigir builds Linux CI e melhorar detecção de plataforma
Jan 12, 2026
725d78f
refactor: melhorar qualidade de código e confiabilidade dos scripts
Jan 12, 2026
cb57ca6
fix: corrigir end-of-line dos scripts PowerShell para LF
Jan 12, 2026
c00a388
fix: corrigir password mismatch e adicionar suporte DB_PASSWORD
Jan 12, 2026
c9e2d8e
fix: Corrigir seeding e DI para local development
Jan 13, 2026
69135f3
fix: Corrigir retorno de Effect methods no ProvidersEffects
Jan 13, 2026
dcc9645
feat: Adicionar scripts de permissões para todos os módulos
Jan 13, 2026
9421b58
chore: Remover backups .disabled dos módulos de database
Jan 13, 2026
ad21980
fix: Corrigir assinatura de HandleLoadAllowedCitiesAction
Jan 13, 2026
011f0e7
refactor: Aplicar correções de segurança e boas práticas
Jan 13, 2026
4e22195
refactor: Aplicar melhorias de revisão de código (parte 1)
Jan 13, 2026
e89ed27
fix: Consolidar migrations duplicadas de SearchProviders
Jan 13, 2026
2679b49
fix: Registrar ILocationsApi e IDocumentsApi no Admin Portal
Jan 13, 2026
6945a8c
refactor: Aplicar melhorias de revisão de código (parte 2)
Jan 13, 2026
a3b5ade
fix: Remover página Home.razor duplicada que conflitava com Dashboard
Jan 13, 2026
6146fdf
fix: Adicionar AuthenticationService.js ao index.html do Admin Portal
Jan 13, 2026
4d2d244
refactor: Remover reflection com BindingFlags.NonPublic em MigrationH…
Jan 13, 2026
ab38143
refactor: Eliminar uso de reflection em Builders e testes de arquitetura
Jan 13, 2026
6dd92e6
refactor: Aplicar melhorias finais de revisão de código
Jan 13, 2026
e25367d
refactor: Aplicar melhorias de revisão de código - parte 3
Jan 13, 2026
97c3dfe
ci: Adicionar cleanup de disco antes dos testes de integração
Jan 13, 2026
ddd8d77
fix: Suprimir warning PendingModelChangesWarning em Development
Jan 13, 2026
de42eea
refactor: Aplicar melhorias de code review - parte 4
Jan 13, 2026
72d679c
fix: Remover cleanup de SDKs .NET que estava causando falha nos testes
Jan 13, 2026
81b75fd
fix: Suprimir PendingModelChangesWarning corretamente no registro DI …
Jan 13, 2026
9fecb10
refactor: Aplicar melhorias de code review - parte 5
Jan 13, 2026
b6e0de0
fix: Corrigir URLs hardcoded no Blazor para usar service discovery do…
Jan 13, 2026
05c2402
fix: Configurar portas fixas para desenvolvimento (API 7001, Keycloak…
Jan 13, 2026
f205d4b
fix: Remover WithHttpsEndpoint duplicado (conflito com launchSettings…
Jan 13, 2026
fce280a
refactor: aplicar melhorias de code review (SQL guards, protected set…
Jan 13, 2026
9fc57cd
refactor(tests): implement on-demand module migrations in integration…
Jan 14, 2026
c7a0ae6
refactor(tests): implement on-demand module migrations in integration…
Jan 14, 2026
68f85d5
Merge branch 'fix/aspire-initialization' of https://github.com/frigin…
Jan 14, 2026
953aa3e
Merge branch 'fix/aspire-initialization' of https://github.com/frigin…
Jan 14, 2026
20d8ce3
Remove SearchProviders migrations to recreate cleanly
Jan 14, 2026
1f4ceda
Fix critical issues from code review
Jan 14, 2026
3c154fa
Apply non-critical code review improvements
Jan 14, 2026
2b3f093
Update technical-debt.md with complete optimization stats
Jan 14, 2026
84586a6
Remove unused legacy code and simplify reflection-based tests
Jan 14, 2026
b8eabd0
Apply final code review feedback
Jan 14, 2026
659fceb
Fix AuthConstants.Claims property names in PermissionArchitectureTests
Jan 14, 2026
7d3676f
Fix Blazor Admin Portal CORS and Keycloak integration
Jan 14, 2026
e9e2c6f
fix: corrige testes de IBGE fallback configurando módulos necessários
Jan 14, 2026
047a38e
refactor: aplica sugestões de code review
Jan 14, 2026
3113d2c
feat: Implementar tema Keycloak customizado e corrigir autenticação A…
Jan 16, 2026
e94b2b1
refactor: Melhorias de qualidade e correções de code review
Jan 16, 2026
7b5eacd
feat(web-admin): add FluentValidation with Brazilian business rules
Jan 16, 2026
8f727ab
feat(web-admin): implement secure configuration management
Jan 16, 2026
737da41
Ref: Web Admin Review Part 3/15 - Fix memory leak in App.razor
Jan 16, 2026
b04051b
Ref: Web Admin Review Pre-Part 4 - Security, Performance & Code Quali…
Jan 16, 2026
6c8064e
Ref: Web Admin Review Additional Fixes - Security, Configuration & Co…
Jan 16, 2026
834581b
Ref: Web Admin Review Part 4/15 - Comprehensive Authorization Impleme…
Jan 16, 2026
c23e4b1
Part 5/15 - Implement Content Security Policy (CSP)
Jan 16, 2026
57c35a5
Code review fixes: security, translations, and quality improvements
Jan 16, 2026
8f436e9
refactor: reorganizar estrutura de projetos removendo duplicações
Jan 16, 2026
337117e
fix: resolve compilation errors after namespace migration
Jan 16, 2026
fbf9cfb
fix: complete namespace migration in test files and remove obsolete t…
Jan 16, 2026
4c8b24b
fix: update test files to use correct PagedResult API and fix CreateP…
Jan 16, 2026
77ec10d
fix: continue test fixes for pagination API changes
Jan 16, 2026
7dfdcbe
fix: resolve remaining E2E and Integration test compilation errors
Jan 16, 2026
1970a77
fix: update architecture tests for new namespace structure
Jan 16, 2026
f2ee93c
fix: restore accidentally deleted test files with updated namespaces
Jan 16, 2026
93b7618
feat(blazor): implement comprehensive API resilience patterns with Polly
Jan 16, 2026
e8baa71
docs: add minor improvements roadmap and deployment guides
Jan 16, 2026
b98bac9
refactor(web-admin): enforce strict Flux pattern for Provider delete …
Jan 16, 2026
152a22c
refactor(web-admin): enforce strict Flux pattern for Documents operat…
Jan 16, 2026
1afa2da
refactor(web-admin): enforce strict Flux pattern for Categories opera…
Jan 16, 2026
399ee25
refactor(web-admin): enforce strict Flux pattern for Services operations
Jan 16, 2026
9ee405e
refactor(web-admin): enforce strict Flux pattern for AllowedCities op…
Jan 16, 2026
c1e3391
docs(architecture): add comprehensive Flux pattern implementation guide
Jan 16, 2026
9e5da3a
fix: resolve test build errors
Jan 16, 2026
3e49786
docs: add Sprint 7.7 and 7.8 to roadmap
Jan 16, 2026
0857cf0
refactor: eliminate magic strings with centralized constants
Jan 16, 2026
b3b4cc5
docs: add Sprint 7.9 (Magic Strings Elimination) to roadmap
Jan 16, 2026
3865985
feat: implement accessibility features (Part 10) - WCAG 2.1 AA compli…
Jan 16, 2026
da1d130
feat: implement global error boundaries (Part 11) - Complete error ha…
Jan 16, 2026
fa8a959
feat: implement performance optimizations (Part 12) - Virtualization,…
Jan 16, 2026
b6443c6
docs: add Sprints 7.10-7.12 to roadmap (Parts 10-12 complete)
Jan 16, 2026
c198d88
feat(sprint-7.13): implement standardized error handling with retry l…
Jan 16, 2026
2e97790
feat(sprint-7.14): implement complete localization (i18n)
Jan 16, 2026
980c729
docs: update roadmap with Sprint 7.13 and 7.14
Jan 16, 2026
9dabf00
docs: add Part 13 (Unit Tests) to roadmap as future improvement
Jan 16, 2026
b56d446
fix(e2e): correct UpdateProvider test to match simplified DTO
Jan 16, 2026
83ecc99
fix(blazor): wire ErrorBoundary recovery and fix NotAuthorized context
Jan 16, 2026
2b49155
fix(security): implement safe retry policy to prevent duplicate writes
Jan 16, 2026
f41b921
fix(resilience): eliminate double-retry stacking (9→3 attempts)
Jan 16, 2026
49e8014
docs(resilience): add comprehensive resilience architecture guide
Jan 16, 2026
01ae905
fix(memory): eliminate memory leaks in LocalizationService and Perfor…
Jan 16, 2026
e9761f0
refactor(localization): migrate from custom Dictionary to .resx/IStri…
Jan 16, 2026
98f12e2
feat(error-handling): standardize correlation ID strategy and add can…
Jan 16, 2026
b36abac
feat(design): apply brand color scheme to Admin Portal
Jan 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
25 changes: 25 additions & 0 deletions .github/workflows/master-ci-cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,31 @@ jobs:
echo "✅ Frontend component tests completed successfully"
echo "===================================="

- name: Free Disk Space for Integration Tests
run: |
echo "🧹 Freeing disk space before integration tests..."

# Show disk usage before cleanup
echo "📊 Disk usage before cleanup:"
df -h

# Remove Docker images and containers that are not needed
echo "🗑️ Removing unused Docker resources..."
docker system prune -af --volumes || true

# Remove large packages/tools not needed for tests
echo "🗑️ Removing unnecessary packages..."
sudo apt-get clean
sudo rm -rf /usr/local/lib/android || true
sudo rm -rf /opt/ghc || true
sudo rm -rf /usr/local/.ghcup || true

# Show disk usage after cleanup
echo "📊 Disk usage after cleanup:"
df -h

echo "✅ Disk space cleanup completed"

- name: Run integration tests
env:
ASPNETCORE_ENVIRONMENT: Testing
Expand Down
25 changes: 25 additions & 0 deletions .github/workflows/pr-validation.yml
Original file line number Diff line number Diff line change
Expand Up @@ -259,8 +259,8 @@
# ⚠️ TEST CREDENTIALS ONLY - These are the standard Azurite local emulator credentials
# These are intentionally public and documented at:
# https://learn.microsoft.com/en-us/azure/storage/common/storage-use-azurite#well-known-storage-account-and-key
AZURE_STORAGE_CONNECTION_STRING: "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://localhost:10000/devstoreaccount1;"

Check warning on line 262 in .github/workflows/pr-validation.yml

View workflow job for this annotation

GitHub Actions / YAML Syntax Check

262:121 [line-length] line too long (257 > 120 characters)
AzureStorage__ConnectionString: "DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://localhost:10000/devstoreaccount1;"

Check warning on line 263 in .github/workflows/pr-validation.yml

View workflow job for this annotation

GitHub Actions / YAML Syntax Check

263:121 [line-length] line too long (256 > 120 characters)
# Map connection strings to .NET configuration using double underscore
ConnectionStrings__DefaultConnection: ${{ steps.db.outputs.connection-string }}
ConnectionStrings__Users: ${{ steps.db.outputs.connection-string }}
Expand Down Expand Up @@ -467,7 +467,7 @@
find ./coverage -type f \( -name "*.opencover.xml" -o -name "*.cobertura.xml" \) | wc -l
echo ""
echo "Coverage files by module:"
find ./coverage -type f \( -name "*.opencover.xml" -o -name "*.cobertura.xml" \) -printf "%f\n" | sort | head -20

Check warning on line 470 in .github/workflows/pr-validation.yml

View workflow job for this annotation

GitHub Actions / YAML Syntax Check

470:121 [line-length] line too long (123 > 120 characters)
echo ""

echo "🔍 DEBUG: Verifying coverage files for CodeCoverageSummary..."
Expand Down Expand Up @@ -601,6 +601,31 @@
echo "✅ Frontend component tests completed successfully"
echo "===================================="

- name: Free Disk Space for Integration Tests
run: |
echo "🧹 Freeing disk space before integration tests..."

# Show disk usage before cleanup
echo "📊 Disk usage before cleanup:"
df -h

# Remove Docker images and containers that are not needed
echo "🗑️ Removing unused Docker resources..."
docker system prune -af --volumes || true

# Remove large packages/tools not needed for tests
echo "🗑️ Removing unnecessary packages..."
sudo apt-get clean
sudo rm -rf /usr/local/lib/android || true
sudo rm -rf /opt/ghc || true
sudo rm -rf /usr/local/.ghcup || true

# Show disk usage after cleanup
echo "📊 Disk usage after cleanup:"
df -h

echo "✅ Disk space cleanup completed"

- name: Run Integration Tests
env:
ASPNETCORE_ENVIRONMENT: Testing
Expand Down
12 changes: 8 additions & 4 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
<!-- Microsoft.Extensions.* family version alignment -->
<!-- Keep all Microsoft.Extensions.* packages on the same major version (10.x) -->
<!-- This prevents Refit.HttpClientFactory from pulling in 9.x versions -->
<PackageVersion Include="HtmlSanitizer" Version="8.1.870" />
<PackageVersion Include="Microsoft.Extensions.Http" Version="10.0.1" />
<!-- .NET & Microsoft Core -->
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
Expand Down Expand Up @@ -142,6 +143,9 @@
<PackageVersion Include="Microsoft.Extensions.TimeProvider.Testing" Version="10.0.1" />
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.1" />
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="10.1.0" />
<PackageVersion Include="Microsoft.Extensions.Http.Polly" Version="10.0.1" />
<PackageVersion Include="Polly" Version="8.6.0" />
<PackageVersion Include="Polly.Extensions.Http" Version="3.0.0" />
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.1" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.1" />
<PackageVersion Include="Microsoft.Extensions.Logging.Configuration" Version="10.0.1" />
Expand Down Expand Up @@ -173,6 +177,7 @@
<!-- Validation -->
<PackageVersion Include="FluentValidation" Version="12.1.1" />
<PackageVersion Include="FluentValidation.DependencyInjectionExtensions" Version="12.1.1" />
<PackageVersion Include="FluentValidation.AspNetCore" Version="12.1.1" />
<!-- Azure -->
<PackageVersion Include="Azure.AI.DocumentIntelligence" Version="1.0.0" />
<PackageVersion Include="Azure.Storage.Blobs" Version="12.26.0" />
Expand Down Expand Up @@ -232,11 +237,10 @@
<PackageVersion Include="Aspire.Hosting.Azure.ServiceBus" Version="13.1.0" />
<PackageVersion Include="Aspire.Hosting.Testing" Version="13.1.0" />
<!-- Aspire.Hosting.Keycloak: NO STABLE VERSION EXISTS - using latest preview -->
<!-- ERROR NU1102: Unable to find package Aspire.Hosting.Keycloak with version >= 13.0.2 -->
<!-- Nearest available: 13.0.2-preview.1.25603.5 (updated from 13.0.0-preview.1.25560.3) -->
<!-- Nearest available: 13.1.0-preview.1.25616.3 (updated from 13.0.2-preview.1.25603.5) -->
<!-- MONITORING: Check https://www.nuget.org/packages/Aspire.Hosting.Keycloak for stable release -->
<!-- DECISION: Package will remain in preview until Keycloak integration stabilizes in Aspire -->
<PackageVersion Include="Aspire.Hosting.Keycloak" Version="13.0.2-preview.1.25603.5" />
<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" />
<PackageVersion Include="Aspire.Hosting.Redis" Version="13.1.0" />
Expand All @@ -248,7 +252,7 @@
<!-- Code Analysis -->
<PackageVersion Include="SonarAnalyzer.CSharp" Version="10.18.0.131500" />
<!-- Blazor UI & State Management -->
<PackageVersion Include="MudBlazor" Version="7.21.0" />
<PackageVersion Include="MudBlazor" Version="8.0.0" />
<PackageVersion Include="Fluxor.Blazor.Web" Version="6.9.0" />
<PackageVersion Include="Fluxor.Blazor.Web.ReduxDevTools" Version="6.9.0" />
<PackageVersion Include="Refit" Version="9.0.2" />
Expand Down
4 changes: 3 additions & 1 deletion MeAjudaAi.slnx
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,10 @@
<Folder Name="/src/Modules/Users/Tests/">
<Project Path="src/Modules/Users/Tests/MeAjudaAi.Modules.Users.Tests.csproj" />
</Folder>
<Folder Name="/src/Contracts/">
<Project Path="src/Contracts/MeAjudaAi.Contracts.csproj" />
</Folder>
<Folder Name="/src/Shared/">
<Project Path="src/Shared/MeAjudaAi.Shared.Contracts/MeAjudaAi.Shared.Contracts.csproj" />
<Project Path="src/Shared/MeAjudaAi.Shared.csproj" />
</Folder>
<Folder Name="/src/Web/">
Expand Down
173 changes: 102 additions & 71 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.

<!-- Last updated: January 5, 2026 - Sprint 6 COMPLETED (Blazor Admin Portal Setup) / Sprint 7 Planning -->
<!-- Last updated: January 9, 2026 - Sprint 7.5 COMPLETED (0 warnings, automação, Aspire fix) -->

## 🎯 Visão Geral

Expand All @@ -19,10 +19,13 @@ O **MeAjudaAi** é uma plataforma moderna de marketplace de serviços que implem
### 🚀 Tecnologias Principais

- **.NET 10** - Framework principal
- **.NET Aspire 13** - Orquestração e observabilidade
- **.NET Aspire 13.1** - Orquestração e observabilidade
- **Blazor WASM** - Admin Portal SPA
- **MudBlazor 8.0** - Material Design UI components
- **Fluxor 6.9** - Redux state management
- **Entity Framework Core 10** - ORM e persistência
- **PostgreSQL** - Banco de dados principal
- **Keycloak** - Autenticação e autorização
- **Keycloak** - Autenticação OAuth2/OIDC
- **Redis** - Cache distribuído
- **RabbitMQ/Azure Service Bus** - Messaging
- **Docker** - Containerização
Expand Down Expand Up @@ -107,85 +110,103 @@ O projeto foi organizado para facilitar navegação e manutenção:

## 🚀 Início Rápido

### Para Desenvolvedores
### ⚡ Setup em 2 Comandos (Primeira Vez)

Para instruções detalhadas, consulte o [**Guia de Desenvolvimento Completo**](./docs/development.md).

**Setup via .NET Aspire:**
```powershell
# Execute o AppHost do Aspire
cd src/Aspire/MeAjudaAi.AppHost
dotnet run
```
# 1. Setup inicial (verificar dependências + build)
.\scripts\setup.ps1

**Ou via Docker Compose:**
```powershell
cd infrastructure/compose
docker compose -f environments/development.yml up -d
# 2. Iniciar desenvolvimento
.\scripts\dev.ps1
```

### Para Testes
**Pronto!** 🎉 Acesse:
- **Aspire Dashboard**: https://localhost:17063
- **Admin Portal**: Veja no dashboard (tab Resources)
- **API Swagger**: https://localhost:7524/swagger
- **Keycloak**: http://localhost:8080 (admin/admin)

---

### 🔄 Uso Diário

```powershell
# Todos os testes
# Iniciar desenvolvimento
.\scripts\dev.ps1

# OU usar Make (se tiver Make instalado)
make dev

# Executar testes
dotnet test

# Com relatório de cobertura
dotnet test --collect:"XPlat Code Coverage"
# Ver comandos disponíveis
make help
```

📖 **[Guia Completo de Desenvolvimento](docs/development.md)**
### 📝 Configuração Necessária (Uma Vez)

### Pré-requisitos
⚠️ **Keycloak Client**: O Admin Portal Blazor precisa de configuração manual no Keycloak.

- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
- [Docker Desktop](https://www.docker.com/products/docker-desktop)
- [Azure CLI](https://docs.microsoft.com/cli/azure/install-azure-cli) (para deploy em produção)
- [Git](https://git-scm.com/) para controle de versão
👉 Siga: [docs/keycloak-admin-portal-setup.md](docs/keycloak-admin-portal-setup.md)

### ⚙️ Configuração de Ambiente

**Para deployments não-desenvolvimento:** Configure as variáveis de ambiente necessárias copiando `infrastructure/.env.example` para `infrastructure/.env` e definindo valores seguros. As seguintes variáveis são obrigatórias:
- `POSTGRES_PASSWORD` - Senha do banco de dados PostgreSQL
- `RABBITMQ_USER` e `RABBITMQ_PASS` - Credenciais do RabbitMQ
---

### Scripts de Automação
### 📖 Documentação Completa

O projeto inclui scripts automatizados na raiz:
- [**Guia de Desenvolvimento**](docs/development.md) - Setup detalhado e workflows
- [**Arquitetura**](docs/architecture.md) - Design e padrões do sistema
- [**Documentação Online**](https://frigini.github.io/MeAjudaAi/) - GitHub Pages

| Script | Descrição | Quando usar |
|--------|-----------|-------------|
| `setup-cicd.ps1` | Setup completo CI/CD com Azure | Para pipelines com deploy |
| `setup-ci-only.ps1` | Setup apenas CI sem custos | Para validação de código apenas |
| `run-local.sh` | Execução local com orquestração | Desenvolvimento local |
---

### Execução Local
### 🧪 Para Testes

#### Opção 1: .NET Aspire (Recomendado)
```powershell
# Todos os testes
dotnet test

```bash
# Clone o repositório
git clone https://github.com/frigini/MeAjudaAi.git
cd MeAjudaAi
# Com relatório de cobertura
dotnet test --collect:"XPlat Code Coverage"

# Execute o AppHost do Aspire
cd src/Aspire/MeAjudaAi.AppHost
dotnet run
# Testes rápidos (make)
make test
```

#### Opção 2: Docker Compose
### Pré-requisitos

```bash
# PRIMEIRO: Defina as senhas necessárias
export KEYCLOAK_ADMIN_PASSWORD=$(openssl rand -base64 32)
export RABBITMQ_PASS=$(openssl rand -base64 32)
| Ferramenta | Versão | Link |
|------------|--------|------|
| **.NET SDK** | 10.0+ | [Download](https://dotnet.microsoft.com/download/dotnet/10.0) |
| **Docker Desktop** | Latest | [Download](https://www.docker.com/products/docker-desktop) |
| **Git** | Latest | [Download](https://git-scm.com/) |
| Azure CLI (opcional) | Latest | Para deploy em produção |

# Execute usando Docker Compose
cd infrastructure/compose
docker compose -f environments/development.yml up -d
```
✅ **Verificar instalação**: Execute `.\scripts\setup.ps1` que valida tudo automaticamente.

### 🛠️ Scripts Disponíveis

| Script | Descrição | Uso |
|--------|-----------|-----|
| **`scripts/setup.ps1`** | Setup inicial completo | Primeira vez no projeto |
| **`scripts/dev.ps1`** | Iniciar desenvolvimento | Uso diário |
| `scripts/ef-migrate.ps1` | Entity Framework migrations | Gerenciar banco de dados |
| `scripts/seed-dev-data.ps1` | Popular dados de teste | Ambiente de desenvolvimento |
| `scripts/export-openapi.ps1` | Exportar especificação API | Gerar documentação/clientes |

### URLs dos Serviços
**Automação CI/CD** (em `infrastructure/automation/`):
- `setup-cicd.ps1` - Setup completo CI/CD com Azure
- `setup-ci-only.ps1` - Setup apenas CI sem deploy

**Makefile** (em `build/Makefile`):
- `make help` - Ver todos os comandos disponíveis
- `make dev` - Iniciar desenvolvimento
- `make test` - Executar testes
- `make clean` - Limpar artefatos

---

## 🌐 URLs dos Serviços

> **📝 Nota**: As URLs abaixo são baseadas nas configurações em `launchSettings.json` e `docker-compose.yml`.
> Para atualizações de portas, consulte:
Expand Down Expand Up @@ -276,56 +297,66 @@ MeAjudaAi/

---

## 🎨 Admin Portal (NEW - Sprint 6)
## 🎨 Admin Portal (Sprint 6 + 7)

### Blazor WebAssembly + Fluxor + MudBlazor

Portal administrativo moderno para gestão da plataforma MeAjudaAi.
Portal administrativo moderno para gestão completa da plataforma MeAjudaAi.

**Stack Tecnológica:**
- **Blazor WebAssembly**: .NET 10 SPA client-side
- **MudBlazor 7.21.0**: Material Design UI components
- **Fluxor 6.1.0**: Redux-pattern state management
- **MudBlazor 8.0.0**: Material Design UI components
- **Fluxor 6.9.0**: Redux-pattern state management
- **Refit 9.0.2**: Type-safe HTTP clients
- **Keycloak OIDC**: Authentication via Authorization Code flow

**Funcionalidades Implementadas (Sprint 6):**
- ✅ **Autenticação**: Login/Logout via Keycloak OIDC
- ✅ **Dashboard**: 3 KPIs (Total Providers, Pending Verifications, Active Services)
- ✅ **Providers Management**: Listagem paginada (read-only)
**Funcionalidades Implementadas:**
- ✅ **Autenticação**: Login/Logout via Keycloak OIDC (Sprint 6)
- ✅ **Dashboard**: KPIs + Charts com MudBlazor (Sprints 6-7)
- ✅ **Providers**: CRUD completo (Create, Update, Delete, Verify) - Sprint 7
- ✅ **Documents**: Upload, verificação, gestão - Sprint 7
- ✅ **Service Catalogs**: CRUD de categorias e serviços - Sprint 7
- ✅ **Geographic Restrictions**: Gestão de cidades permitidas - Sprint 7
- ✅ **Dark Mode**: Toggle com Fluxor state management
- ✅ **Portuguese Localization**: UI completa em português
- ✅ **30 testes bUnit**: Cobertura de componentes principais

**Como Executar:**

```powershell
# Via Aspire AppHost (recomendado)
.\scripts\dev.ps1

# OU diretamente
cd src/Aspire/MeAjudaAi.AppHost
dotnet run

# Acessar: https://localhost:7281
# Login: admin.portal / admin123 (após criar client no Keycloak)
# Acessar Admin Portal via Aspire Dashboard
# https://localhost:17063 -> Resources -> admin-portal
```

**Configuração Keycloak:**

Siga o guia completo em [docs/keycloak-admin-portal-setup.md](docs/keycloak-admin-portal-setup.md) para criar o client `admin-portal` no realm `meajudaai`.
⚠️ Necessário criar client `admin-portal` no Keycloak (uma vez apenas).

👉 Siga: [docs/keycloak-admin-portal-setup.md](docs/keycloak-admin-portal-setup.md)

**Testes:**

```powershell
# Executar testes bUnit
dotnet test tests/MeAjudaAi.Web.Admin.Tests
dotnet test src/Web/MeAjudaAi.Web.Admin.Tests

# 10 testes: ProvidersPage, Dashboard, DarkMode
# 30 testes: Providers, Documents, Categories, Services, AllowedCities, Dashboard
```

**Estrutura:**

```text
src/Web/MeAjudaAi.Web.Admin/
├── Pages/ # Razor pages (Dashboard, Providers, Authentication)
├── Features/ # Fluxor stores (Providers, Dashboard, Theme)
├── Pages/ # Razor pages (Dashboard, Providers, Documents, Categories, Services, AllowedCities)
├── Features/ # Fluxor stores (state management por feature)
├── Components/ # Dialogs e componentes reutilizáveis
├── Layout/ # MainLayout, NavMenu
└── wwwroot/ # appsettings.json, static assets

Expand Down
Loading
Loading