feat: house price prediction model integration

This commit is contained in:
nasim
2025-04-03 10:14:54 +02:00
parent 72375db5cd
commit 3aa78be3d6
22 changed files with 251 additions and 24 deletions
+26 -4
View File
@@ -2,15 +2,19 @@ from typing import Annotated, Literal
from fastapi import APIRouter, Depends
from ..dtos.house_create_request import HouseCreateRequest
from ..dtos.house_create_response import HouseCreateResponse
from ..dtos.houses_list_response import HouseResponse, HousesListResponse
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()
@@ -69,4 +73,22 @@ async def get_all_houses(
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)
+22 -5
View File
@@ -1,15 +1,14 @@
from typing import Annotated
from fastapi import APIRouter, Depends
from fastapi import APIRouter, Depends, HTTPException
from ..dtos.owner_detail_response import OwnerDetailResponse
from ..dtos.owner_list_response import OwnerListResponse, OwnerResponse
from ..dtos.owner.owner_detail_response import OwnerDetailResponse
from ..dtos.owner.owner_list_response import OwnerListResponse, OwnerResponse
from ..repositories.owner_repository import OwnerRepository
from ..repositories.user_repository import UserRepository
router = APIRouter()
@router.get("")
async def get_owners(
owner_repository: Annotated[OwnerRepository, Depends()],
@@ -22,7 +21,6 @@ async def get_owners(
return OwnerListResponse(owners=owners_response)
@router.get("/{id}")
async def get_owner(
id: str,
@@ -35,3 +33,22 @@ async def get_owner(
return OwnerDetailResponse(
id=str(owner.id), user_id=str(owner.user_id), email=user.email
)
@router.get("/byhouse/{house_id}")
async def get_owner_by_house_id(
house_id: str,
owner_repository: Annotated[OwnerRepository, Depends()],
) -> OwnerDetailResponse:
result = await owner_repository.get_details_by_house_id(house_id)
if result is None:
raise HTTPException(status_code=404, detail="House or owner not found")
owner = result["owner"]
user = result["user"]
return OwnerDetailResponse(
id=str(owner.id),
user_id=str(owner.user_id),
email=str(user.email)
)