63 lines
2.1 KiB
Python
63 lines
2.1 KiB
Python
from flask import Blueprint, jsonify
|
|
from sqlalchemy import func
|
|
|
|
from app.extensions import db
|
|
from app.models.catalog import Amenity, PropertyType
|
|
from app.models.imobiliaria import Imobiliaria
|
|
from app.models.property import Property
|
|
from app.schemas.catalog import AmenityOut, ImobiliariaOut, PropertyTypeOut
|
|
|
|
catalog_bp = Blueprint("catalog", __name__, url_prefix="/api/v1")
|
|
|
|
|
|
@catalog_bp.get("/property-types")
|
|
def list_property_types():
|
|
"""Return top-level categories with their subtypes nested."""
|
|
# Build count_map for subtypes (leaf nodes with parent_id IS NOT NULL)
|
|
rows = (
|
|
db.session.query(PropertyType.id, func.count(Property.id).label("cnt"))
|
|
.filter(PropertyType.parent_id.isnot(None))
|
|
.outerjoin(
|
|
Property,
|
|
(Property.subtype_id == PropertyType.id) & (Property.is_active.is_(True)),
|
|
)
|
|
.group_by(PropertyType.id)
|
|
.all()
|
|
)
|
|
count_map: dict[int, int] = {row.id: row.cnt for row in rows}
|
|
|
|
categories = (
|
|
PropertyType.query.filter_by(parent_id=None).order_by(PropertyType.id).all()
|
|
)
|
|
|
|
def serialize_category(cat) -> dict:
|
|
data = PropertyTypeOut.model_validate(cat).model_dump(mode="json")
|
|
data["subtypes"] = [
|
|
{**sub, "property_count": count_map.get(sub["id"], 0)}
|
|
for sub in data["subtypes"]
|
|
]
|
|
return data
|
|
|
|
return jsonify([serialize_category(c) for c in categories])
|
|
|
|
|
|
@catalog_bp.get("/amenities")
|
|
def list_amenities():
|
|
"""Return all amenities grouped."""
|
|
amenities = Amenity.query.order_by(Amenity.group, Amenity.name).all()
|
|
return jsonify(
|
|
[AmenityOut.model_validate(a).model_dump(mode="json") for a in amenities]
|
|
)
|
|
|
|
|
|
@catalog_bp.get("/imobiliarias")
|
|
def list_imobiliarias():
|
|
"""Return active imobiliárias ordered by display_order."""
|
|
items = (
|
|
Imobiliaria.query.filter_by(is_active=True)
|
|
.order_by(Imobiliaria.display_order, Imobiliaria.name)
|
|
.all()
|
|
)
|
|
return jsonify(
|
|
[ImobiliariaOut.model_validate(i).model_dump(mode="json") for i in items]
|
|
)
|