diff --git a/backend/app/routers/predictions.py b/backend/app/dtos/predictions.py similarity index 100% rename from backend/app/routers/predictions.py rename to backend/app/dtos/predictions.py diff --git a/backend/app/models/house.py b/backend/app/models/house.py new file mode 100644 index 0000000..45c953e --- /dev/null +++ b/backend/app/models/house.py @@ -0,0 +1,10 @@ +from sqlmodel import SQLModel, Field +from uuid import uuid4 + +class House(SQLModel, table=True): + id: int = Field(primary_key=True, default_factory=uuid4), + address: str + city: str + country: str + price: float + description: str = None diff --git a/backend/app/models/owner.py b/backend/app/models/owner.py new file mode 100644 index 0000000..fb034a2 --- /dev/null +++ b/backend/app/models/owner.py @@ -0,0 +1,7 @@ +from sqlmodel import SQLModel, Field +from uuid import uuid4 + +class Owner(SQLModel, table=True): + id: int = Field(default_factory=uuid4, primary_key=True) + name: str + email: str diff --git a/backend/app/models/prediction.py b/backend/app/models/prediction.py index 587255c..8a51284 100644 --- a/backend/app/models/prediction.py +++ b/backend/app/models/prediction.py @@ -5,15 +5,6 @@ class HousePredictionInput(BaseModel): square_feet: float = Field(..., gt=0, description="Square footage of the house") bedrooms: int = Field(..., ge=1, description="Number of bedrooms") bathrooms: float = Field(..., gt=0, description="Number of bathrooms") - - class Config: - json_schema_extra = { - "example": { - "square_feet": 2000, - "bedrooms": 3, - "bathrooms": 2.5 - } - } class HousePredictionOutput(BaseModel): predicted_price: float diff --git a/backend/app/models/user.py b/backend/app/models/user.py new file mode 100644 index 0000000..4fed662 --- /dev/null +++ b/backend/app/models/user.py @@ -0,0 +1,7 @@ +from sqlmodel import SQLModel, Field + +class User(SQLModel, table=True): + id: int = Field(default=None, primary_key=True) + username: str = Field(unique=True, nullable=False) + email: str = Field(unique=True, nullable=False) + password_hash: str = Field(nullable=False) diff --git a/backend/app/repositories/house_repository.py b/backend/app/repositories/house_repository.py new file mode 100644 index 0000000..c9f6ee4 --- /dev/null +++ b/backend/app/repositories/house_repository.py @@ -0,0 +1,30 @@ +from sqlalchemy.orm import Session +from app.models import House + +class HouseRepository: + def __init__(self, db: Session): + self.db = db + + def get_all(self): + return self.db.query(House).all() + + def get_by_id(self, house_id: int): + return self.db.query(House).filter(House.id == house_id).first() + + def create(self, house: House): + self.db.add(house) + self.db.commit() + self.db.refresh(house) + return house + + def update(self, house: House): + self.db.merge(house) + self.db.commit() + return house + + def delete(self, house_id: int): + house = self.db.query(House).filter(House.id == house_id).first() + if house: + self.db.delete(house) + self.db.commit() + return house diff --git a/backend/app/repositories/owner_repository.py b/backend/app/repositories/owner_repository.py new file mode 100644 index 0000000..1f1628d --- /dev/null +++ b/backend/app/repositories/owner_repository.py @@ -0,0 +1,37 @@ + +from sqlalchemy.orm import Session +from app.models.owner import Owner +from app.schemas.owner import OwnerCreate, OwnerUpdate + +class OwnerRepository: + def __init__(self, db: Session): + self.db = db + + def get(self, owner_id: int) -> Owner: + return self.db.query(Owner).filter(Owner.id == owner_id).first() + + def get_all(self, skip: int = 0, limit: int = 100) -> list[Owner]: + return self.db.query(Owner).offset(skip).limit(limit).all() + + def create(self, owner: OwnerCreate) -> Owner: + db_owner = Owner(**owner.dict()) + self.db.add(db_owner) + self.db.commit() + self.db.refresh(db_owner) + return db_owner + + def update(self, owner_id: int, owner: OwnerUpdate) -> Owner: + db_owner = self.get(owner_id) + if db_owner: + for key, value in owner.dict().items(): + setattr(db_owner, key, value) + self.db.commit() + self.db.refresh(db_owner) + return db_owner + + def delete(self, owner_id: int) -> Owner: + db_owner = self.get(owner_id) + if db_owner: + self.db.delete(db_owner) + self.db.commit() + return db_owner \ No newline at end of file diff --git a/backend/app/routers/get_houses.py b/backend/app/routers/get_houses.py new file mode 100644 index 0000000..08b6295 --- /dev/null +++ b/backend/app/routers/get_houses.py @@ -0,0 +1,13 @@ +from fastapi import APIRouter, Depends +from sqlalchemy.orm import Session +from typing import List +from .. import models, schemas, database, repositories + +router = APIRouter() + + +@router.get("/houses", response_model=List[schemas.House]) +def list_houses(db: Session = Depends(database.get_db)): + houses = repositories.house.get_all_houses(db) + return houses + diff --git a/backend/app/routers/list_house.py b/backend/app/routers/list_house.py new file mode 100644 index 0000000..bf807b8 --- /dev/null +++ b/backend/app/routers/list_house.py @@ -0,0 +1,14 @@ +from fastapi import APIRouter, HTTPException, Depends +from typing import List +from app.models import House # Assuming you have a House model +from app.dtos import HouseCreate # Assuming you have a HouseCreate DTO +from app.repositories.house_repository import HouseRepository # Assuming you have a HouseRepository + +router = APIRouter() + +@router.post("/houses", response_model=House) +async def create_house(house: HouseCreate, house_repo: HouseRepository = Depends()): + new_house = house_repo.create(house) + if not new_house: + raise HTTPException(status_code=400, detail="House creation failed") + return new_house diff --git a/backend/app/services/ml_model.py b/backend/app/services/house_price_predictor.py similarity index 100% rename from backend/app/services/ml_model.py rename to backend/app/services/house_price_predictor.py diff --git a/backend/app/services/investor_predictor.py b/backend/app/services/investor_predictor.py new file mode 100644 index 0000000..7ed40cf --- /dev/null +++ b/backend/app/services/investor_predictor.py @@ -0,0 +1,5 @@ +import random + +class InvestorPredictor(): + def is_investor(user: User) -> bool: + return random.random() < 0.5