4.1 KiB
API Catalog Enhancements — Contrato de Interface
Feature: 024-filtro-busca-avancada
Tipo de mudança: Adição de campo somente-leitura em endpoints existentes (backward-compatible)
Versão da API: /api/v1 (sem mudança de versão — campo adicional não quebra clientes existentes)
Resumo das Mudanças
Três endpoints existentes passam a incluir o campo property_count na resposta. Nenhum endpoint novo é criado. Nenhum parâmetro de entrada é modificado.
GET /api/v1/cities
Sem alteração na assinatura. O campo property_count é adicionado à resposta.
Response (200 OK)
[
{
"id": 1,
"name": "Rio de Janeiro",
"slug": "rio-de-janeiro",
"state": "RJ",
"property_count": 47
},
{
"id": 2,
"name": "São Paulo",
"slug": "sao-paulo",
"state": "SP",
"property_count": 12
},
{
"id": 3,
"name": "Belo Horizonte",
"slug": "belo-horizonte",
"state": "MG",
"property_count": 0
}
]
Regras:
property_countconta apenas imóveis comis_active = trueassociados à cidade viaproperties.city_id- Cidades sem imóveis ativos retornam
property_count: 0(não são omitidas da lista) - Ordenação mantida:
state ASC, name ASC
GET /api/v1/neighborhoods
Sem alteração na assinatura. Parâmetro opcional ?city_id=<int> permanece inalterado.
Response (200 OK)
[
{
"id": 10,
"name": "Copacabana",
"slug": "copacabana",
"city_id": 1,
"property_count": 23
},
{
"id": 11,
"name": "Ipanema",
"slug": "ipanema",
"city_id": 1,
"property_count": 15
},
{
"id": 12,
"name": "Santa Teresa",
"slug": "santa-teresa",
"city_id": 1,
"property_count": 0
}
]
Regras:
property_countconta apenas imóveis comis_active = trueviaproperties.neighborhood_id- Bairros sem imóveis ativos retornam
property_count: 0 - Ordenação mantida:
name ASC - Filtro
?city_idmantém comportamento existente
GET /api/v1/property-types
Sem alteração na assinatura. property_count é adicionado nos subtypes (leaf nodes). Os tipos pai (parent_id = null) retornam property_count: 0 (sem significado — contagem relevante é nos subtipos).
Response (200 OK)
[
{
"id": 1,
"name": "Residencial",
"slug": "residencial",
"parent_id": null,
"property_count": 0,
"subtypes": [
{
"id": 2,
"name": "Apartamento",
"slug": "apartamento",
"parent_id": 1,
"property_count": 38,
"subtypes": []
},
{
"id": 3,
"name": "Casa",
"slug": "casa",
"parent_id": 1,
"property_count": 14,
"subtypes": []
},
{
"id": 4,
"name": "Cobertura",
"slug": "cobertura",
"parent_id": 1,
"property_count": 5,
"subtypes": []
}
]
},
{
"id": 5,
"name": "Comercial",
"slug": "comercial",
"parent_id": null,
"property_count": 0,
"subtypes": [
{
"id": 6,
"name": "Sala Comercial",
"slug": "sala-comercial",
"parent_id": 5,
"property_count": 7,
"subtypes": []
}
]
}
]
Regras:
property_countnos subtypes conta imóveis comis_active = trueviaproperties.subtype_id- Tipos pai recebem
property_count: 0(campo presente para consistência de schema, não usado pelo frontend) - Ordenação mantida: por
PropertyType.id ASC(categorias pai); subtypes herdados via SQLAlchemy relationship
Backward Compatibility
| Aspecto | Garantia |
|---|---|
| Clientes existentes que ignoram campos extras | ✅ Não quebram — campo adicional em JSON é ignorado |
| Frontend antes da feature 024 | ✅ property_count?: number (opcional no TypeScript) — não causa erro de tipo |
Testes existentes (test_properties.py, test_homepage.py) |
✅ Não testam payload de catálogo em detalhe; COUNT adicional não altera filtros |
| Admin panel | ✅ Não consome esses endpoints; sem impacto |