Skip to content

Sprint 1: Clean Architecture + dominio Empreendimento/Torre/Tipologia#22

Merged
gustavograciano merged 2 commits into
mainfrom
feat/sprint-1-domain
Apr 22, 2026
Merged

Sprint 1: Clean Architecture + dominio Empreendimento/Torre/Tipologia#22
gustavograciano merged 2 commits into
mainfrom
feat/sprint-1-domain

Conversation

@gustavograciano

Copy link
Copy Markdown
Owner

Base: este PR depende do #1 (Sprint 0). Rebaseia para `main` quando o #1 mergear.

Summary

Sprint 1 do PLANO-DESENVOLVIMENTO.md — refatoração estrutural da solução e introdução do domínio de empreendimento/torre/tipologia que destrava todo o resto do roadmap.

Commit 1 — Clean Architecture (5 projetos)

  • `src/ImovelStand.Domain` — entidades, enums, value objects
  • `src/ImovelStand.Application` — `TokenService` + DTOs de login
  • `src/ImovelStand.Infrastructure` — `ApplicationDbContext` + Migrations + Interceptors
  • `src/ImovelStand.Jobs` — stub pra Hangfire (Sprint 11)
  • `ImovelStand.Api` — controllers, Program.cs, DI

Refs: `Api → Application/Infrastructure/Jobs`; `Infrastructure → Application → Domain`. Pacotes EF Core movidos para Infrastructure; JWT/BCrypt para Application. Todos os `git mv` preservam histórico de arquivo (ver diff renames).

Commit 2 — Domínio novo

Entidades (`src/ImovelStand.Domain/Entities`):

Enums: `StatusApartamento`, `StatusEmpreendimento`, `Orientacao`, `TipoEntidadeFoto`.

Refatoração de Apartamento:

  • FKs novas: `TorreId`, `TipologiaId`
  • `Andar → Pavimento`, `Preco → PrecoAtual`
  • `Status` agora enum (era string)
  • Removidos: `Quartos`, `Banheiros`, `AreaMetrosQuadrados` (migraram para Tipologia)

HistoricoPrecoInterceptor: `SaveChangesInterceptor` que detecta mudanças em `Apartamento.PrecoAtual` e registra `HistoricoPreco` automaticamente. Registrado como singleton + `AddInterceptors` no DbContext.

Migration RefatoracaoDominio: gerada via `dotnet ef migrations add`. Preserva dados antigos via UpdateData (apartamentos 1–5 viram parte da Torre A / Tipologias 1–3); cria tabelas novas; adiciona FKs ao final para evitar ordering issues.

Seed demo atualizado: 1 Empreendimento ("Residencial Exemplo"), 2 Torres (A/B), 3 Tipologias (2Q/3Q/Cobertura), 48 apartamentos (12 pav × 2 apts × 2 torres) com prêmio de preço de 1% por andar.

Test plan

  • `dotnet build ImovelStand.sln --configuration Release` — 0 erros
  • `dotnet test` — 10 testes passando (3 novos do `HistoricoPrecoInterceptor`)
  • `dotnet ef database update --project src/ImovelStand.Infrastructure --startup-project ImovelStand.Api` aplica a migration em DB zerado
  • Rodar API local, `PUT /api/apartamentos/{id}` mudando `PrecoAtual` → linha em `HistoricoPrecos` aparece automaticamente
  • Swagger continua renderizando endpoints existentes

O que fica pra próximo PR

  • Sprint 2 (multi-tenant + auth hardening): `Tenant`/`Plano`, `HasQueryFilter` global, `RefreshToken`, rate limiting, testes de isolamento cross-tenant. Nessa hora vira `TenantEntity` e IDs migram `int → long`.

🤖 Generated with Claude Code

gustavograciano and others added 2 commits April 21, 2026 20:34
Estrutura alvo do PLANO-DESENVOLVIMENTO.md - Sprint 0/1:
- src/ImovelStand.Domain: entidades (Apartamento, Cliente, Reserva, Usuario, Venda)
- src/ImovelStand.Application: TokenService + DTOs de login
- src/ImovelStand.Infrastructure: ApplicationDbContext + Migrations
- src/ImovelStand.Jobs: stub para Hangfire (Sprint 11)
- ImovelStand.Api: controllers, Program.cs, DI

Refs: Api -> Application/Infrastructure/Jobs; Infra -> Application -> Domain.
Pacotes EF Core movidos para Infrastructure; JWT/BCrypt para Application.
Namespaces renomeados via git mv (preserva historico).
Usings atualizados em controllers, Program.cs e tests.

Build Release sem erros, 8 testes passando.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sprint 1 do PLANO-DESENVOLVIMENTO.md: refatoracao do dominio para
suportar empreendimentos com multiplas torres/tipologias.

Novas entidades (Domain):
- Empreendimento (+Endereco owned, +Slug unico, +VgvEstimado)
- Torre (FK Empreendimento, unique por nome dentro do emp)
- Tipologia (FK Empreendimento, caracteristicas fisicas + PrecoBase)
- HistoricoPreco (FK Apartamento, preco anterior/novo + motivo)
- Foto (polymorphic por EntidadeTipo+EntidadeId)

Novos enums: StatusApartamento, StatusEmpreendimento, Orientacao,
TipoEntidadeFoto. Value object Endereco (owned type).

Refatoracao de Apartamento:
- FKs: TorreId, TipologiaId (antes nao tinha nenhuma)
- Andar -> Pavimento; Preco -> PrecoAtual; Status string -> enum
- Removidos Quartos/Banheiros/AreaMetrosQuadrados (agora em Tipologia)

Infrastructure:
- HistoricoPrecoInterceptor (SaveChangesInterceptor): detecta mudancas
  em Apartamento.PrecoAtual e registra HistoricoPreco automaticamente
- Registrado como singleton no Program.cs e adicionado ao DbContext
- Migration RefatoracaoDominio: preserva dados antigos via
  UpdateData; cria novas tabelas; adiciona FKs ao final

Seed demo atualizado: 1 Empreendimento, 2 Torres, 3 Tipologias, 48
Apartamentos (12 pavimentos x 2 apts x 2 torres). Preco por andar
com premio de 1%/pavimento. Ultimo pavimento = cobertura (tipologia 3).

Controllers Apartamentos/Reservas/Vendas migrados para comparar
Status como enum em vez de string.

Program.cs: HostAbortedException silenciada no catch (esperado em
design-time do EF Core migrations).

Tests: 3 novos testes do HistoricoPrecoInterceptor (InMemory DB),
placeholder UnitTest1 removido. Total: 10 testes passando.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@gustavograciano gustavograciano changed the base branch from feat/sprint-0-platform to main April 22, 2026 00:00
@gustavograciano gustavograciano merged commit d38a354 into main Apr 22, 2026
gustavograciano added a commit that referenced this pull request May 3, 2026
Sprint 1: Clean Architecture + dominio Empreendimento/Torre/Tipologia
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant