--- description: "Tasks para a feature 023 - Melhorias UX/UI — Listagem de Imóveis" --- # Tasks: Melhorias UX/UI — Listagem de Imóveis (023) **Input**: Design documents de `specs/023-ux-melhorias-imoveis/` **Prerequisites**: plan.md ✅ · spec.md ✅ · data-model.md ✅ · contracts/properties-api.md ✅ · auditoria: specs/022-ux-audit-imoveis/ux-audit.md ✅ **Sem migrations** — todos os campos usados já existem no modelo `Property` --- ## Format: `[ID] [P?] [Story?] Description — arquivo` - **[P]**: Pode executar em paralelo (arquivo diferente, sem bloqueadores incompletos) - **[Story]**: User story correspondente (US1–US8) - Arquivo exato indicado em cada task - **Sprint** de cada fase indicado no cabeçalho --- ## Phase 1: Foundational — Backend (Bloqueador de testes de integração) **Sprint**: Pré-sprint (deve preceder o início do Sprint 1) **Purpose**: Adicionar `q` e `sort` na rota existente `GET /api/v1/properties`. Sem migration — campos `title`, `address`, `code`, `neighborhood_id`, `price`, `area_m2`, `created_at`, `is_featured` já existem. Este phase não tem dependências de frontend. **⚠️ CRÍTICO**: As tasks T003–T010 do Sprint 1 que dependem do backend (integração de busca textual) requerem T001 completo. As tasks de refactor de frontend (T004–T007) podem ser iniciadas em paralelo com T001/T002. - [ ] T001 Adicionar parâmetros `q` (busca ILIKE em `title`, `address`, `code`, `neighborhood.name` via `outerjoin` com `aliased(Neighborhood)`) e `sort` (whitelist com `sort_map`) na rota `GET /api/v1/properties` em `backend/app/routes/properties.py` — sanitização de `q`: `.strip()` + truncamento a 200 chars; `sort` com fallback para `created_at.desc()` **Critérios de aceitação**: - `GET /api/v1/properties?q=Jardins` retorna apenas imóveis com "Jardins" no título, endereço, código ou bairro - `GET /api/v1/properties?sort=price_asc` retorna imóveis em ordem crescente de preço - `GET /api/v1/properties?sort=invalido` retorna imóveis na ordem padrão (sem erro 400/500) - `GET /api/v1/properties?q=` não causa SQL injection nem 500 - [ ] T002 [P] Criar/atualizar testes pytest em `backend/tests/test_properties.py` para validar `q` (busca por título, por bairro, por código) e `sort` (price_asc retorna menor primeiro, area_desc retorna maior primeiro, valor desconhecido usa default) — fixture com ao menos 3 imóveis de preços distintos **Critérios de aceitação**: - `test_search_by_title_q`, `test_search_by_neighborhood_q`, `test_search_by_code_q` passam - `test_sort_price_asc`, `test_sort_price_desc`, `test_sort_area_desc`, `test_sort_unknown_fallback` passam - `pytest tests/test_properties.py -v` termina verde sem erros **Checkpoint**: `curl "http://localhost:5000/api/v1/properties?q=test&sort=price_asc"` retorna 200 com `items` e `total`. --- ## Phase 2: Sprint 1 — Correções Críticas (P1) **Sprint**: 1 **Purpose**: Resolver os 5 problemas 🔴 críticos identificados na auditoria: semântica HTML inválida (FR-001), carrossel inacessível em mobile (FR-002), ausência de tratamento de erro de rede (FR-003), layout fixo em tablets (FR-004) e campo de busca textual (FR-005 a FR-008). **Independent Test (US1)**: Abrir `/imoveis` em mobile, navegar pelas fotos tocando em prev/next, simular falha de rede e verificar mensagem de erro. Inspecionar DOM e confirmar ausência de `