95 lines
3.0 KiB
Python
95 lines
3.0 KiB
Python
from typing import Annotated, Literal
|
|
|
|
from fastapi import APIRouter, Depends
|
|
|
|
from backend.app.dtos.house.house_create_request import HouseCreateRequest
|
|
from backend.app.dtos.house.house_create_response import HouseCreateResponse
|
|
from backend.app.dtos.house.house_features import HouseFeatures
|
|
from backend.app.dtos.house.house_predict_request import HousePricePredictionRequest
|
|
from backend.app.dtos.house.house_predict_response import HousePricePredictionResponse
|
|
from backend.app.dtos.house.house_response import HouseResponse
|
|
from backend.app.dtos.house.houses_list_response import HousesListResponse
|
|
from ..models.house import House
|
|
from ..models.owner import Owner
|
|
from ..providers.auth_provider import AuthContext
|
|
from ..repositories.house_repository import HouseRepository
|
|
from ..repositories.owner_repository import OwnerRepository
|
|
from ..services.house_price_predictor import HousePricePredictor
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("")
|
|
async def create_house(
|
|
body: HouseCreateRequest,
|
|
auth: Annotated[AuthContext, Depends()],
|
|
house_repository: Annotated[HouseRepository, Depends()],
|
|
owner_repository: Annotated[OwnerRepository, Depends()],
|
|
) -> HouseCreateResponse:
|
|
owner = await owner_repository.get_by_user_id(auth.user.id)
|
|
|
|
if not owner:
|
|
new_owner = Owner(user_id=auth.user.id)
|
|
|
|
await owner_repository.save(new_owner)
|
|
|
|
house = House(
|
|
owner_user_id=auth.user.id,
|
|
address=body.address,
|
|
city=body.city,
|
|
country=body.country,
|
|
price=body.price,
|
|
description=body.description,
|
|
square_feet=body.square_feet,
|
|
bedrooms=body.bedrooms,
|
|
bathrooms=body.bathrooms,
|
|
)
|
|
|
|
await house_repository.save(house)
|
|
|
|
return HouseCreateResponse(id=str(house.id))
|
|
|
|
|
|
@router.get("")
|
|
async def get_all_houses(
|
|
house_repository: Annotated[HouseRepository, Depends()],
|
|
order_by: Literal["PRICE"] = "PRICE",
|
|
sort_order: Literal["ASC", "DESC"] = "DESC",
|
|
limit: int = 100,
|
|
offset: int = 0,
|
|
) -> HousesListResponse:
|
|
all_houses = await house_repository.get_all(
|
|
offset=offset, limit=limit, order_by=order_by, sort_order=sort_order
|
|
)
|
|
|
|
house_responses = [
|
|
HouseResponse(
|
|
id=str(house.id),
|
|
description=house.description,
|
|
address=house.address,
|
|
city=house.city,
|
|
country=house.country,
|
|
price=house.price,
|
|
)
|
|
for house in all_houses
|
|
]
|
|
|
|
|
|
return HousesListResponse(houses=house_responses)
|
|
|
|
@router.post("/predict-price")
|
|
async def predict_house_price(
|
|
body: HouseFeatures,
|
|
price_predictor: Annotated[HousePricePredictor, Depends()],
|
|
) -> HousePricePredictionResponse:
|
|
"""
|
|
Predict the price of a house based on its features.
|
|
"""
|
|
predicted_price = await price_predictor.predict_california(
|
|
square_feet=body.square_feet,
|
|
bedrooms=body.bedrooms,
|
|
bathrooms=body.bathrooms
|
|
)
|
|
|
|
return HousePricePredictionResponse(predicted_price=predicted_price)
|
|
|