sass-imobiliaria/backend/app/routes/catalog.py

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]
)