diff --git a/backend/app/models/house.py b/backend/app/models/house.py index 45c953e..3dafd48 100644 --- a/backend/app/models/house.py +++ b/backend/app/models/house.py @@ -1,8 +1,8 @@ from sqlmodel import SQLModel, Field -from uuid import uuid4 +from uuid import uuid4, UUID class House(SQLModel, table=True): - id: int = Field(primary_key=True, default_factory=uuid4), + id: UUID = Field(primary_key=True, default_factory=uuid4), address: str city: str country: str diff --git a/backend/app/models/owner.py b/backend/app/models/owner.py index e93c3f6..0d3d857 100644 --- a/backend/app/models/owner.py +++ b/backend/app/models/owner.py @@ -1,8 +1,8 @@ from sqlmodel import SQLModel, Field -from uuid import uuid4 +from uuid import uuid4, UUID class Owner(SQLModel, table=True): - id: int = Field(default_factory=uuid4, primary_key=True) + id: UUID = Field(default_factory=uuid4, primary_key=True) name: str email: str # TODO add user_id diff --git a/backend/app/models/user.py b/backend/app/models/user.py index 4fed662..a281082 100644 --- a/backend/app/models/user.py +++ b/backend/app/models/user.py @@ -1,7 +1,8 @@ from sqlmodel import SQLModel, Field +from uuid import uuid4, UUID class User(SQLModel, table=True): - id: int = Field(default=None, primary_key=True) + id: UUID = Field(default_factory=uuid4, 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 index c9f6ee4..c625d21 100644 --- a/backend/app/repositories/house_repository.py +++ b/backend/app/repositories/house_repository.py @@ -1,30 +1,41 @@ -from sqlalchemy.orm import Session -from app.models import House +from sqlalchemy.ext.asyncio.session import AsyncSession +from typing import Annotated +from fastapi import Depends +from app.providers.db_provider import get_session +from ..models.house import House +from sqlmodel import select + +from uuid import UUID class HouseRepository: - def __init__(self, db: Session): - self.db = db + def __init__(self, session: Annotated[AsyncSession, Depends(get_session)]) -> None: + self.session = session - def get_all(self): - return self.db.query(House).all() + async def get_all(self) -> list[House]: + statement = select(House) + result = await self.session.execute(statement) + return result.scalars().all() - def get_by_id(self, house_id: int): - return self.db.query(House).filter(House.id == house_id).first() + async def get_by_id(self, house_id: UUID): + statement = select(House).where(House.id == house_id) + result = await self.session.execute(statement) + return result.scalar_one_or_none() - def create(self, house: House): - self.db.add(house) - self.db.commit() - self.db.refresh(house) - return house + async def save(self, house: House) -> None: + """ + Save a house to the database. If a house with that ID already exists, do an upsert. + """ + existing_house = await self.get_by_id(house.id) + if not existing_house: + existing_house = house - def update(self, house: House): - self.db.merge(house) - self.db.commit() - return house + for key, value in house.model_dump(exclude_unset=True).items(): + setattr(house, key, value) - 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 + try: + self.session.add(house) + await self.session.commit() + await self.session.refresh(house) + except Exception as e: + await self.session.rollback() + raise e diff --git a/backend/app/repositories/owner_repository.py b/backend/app/repositories/owner_repository.py index 1f1628d..72b44ee 100644 --- a/backend/app/repositories/owner_repository.py +++ b/backend/app/repositories/owner_repository.py @@ -1,37 +1,36 @@ +from sqlalchemy.ext.asyncio.session import AsyncSession +from typing import Annotated +from fastapi import Depends +from app.providers.db_provider import get_session +from ..models.owner import Owner +from sqlmodel import select -from sqlalchemy.orm import Session -from app.models.owner import Owner -from app.schemas.owner import OwnerCreate, OwnerUpdate +from uuid import UUID class OwnerRepository: - def __init__(self, db: Session): - self.db = db + def __init__(self, session: Annotated[AsyncSession, Depends(get_session)]) -> None: + self.session = session - def get(self, owner_id: int) -> Owner: - return self.db.query(Owner).filter(Owner.id == owner_id).first() + async def get_by_id(self, owner_id: UUID): + statement = select(Owner).where(Owner.id == owner_id) + result = await self.session.execute(statement) + return result.scalar_one_or_none() - def get_all(self, skip: int = 0, limit: int = 100) -> list[Owner]: - return self.db.query(Owner).offset(skip).limit(limit).all() + async def save(self, owner: Owner) -> None: + """ + Save a owner to the database. If an owner with that ID already exists, do an upsert. + """ + existing = await self.get_by_id(owner.id) + if not existing: + existing = owner - 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 + for key, value in owner.model_dump(exclude_unset=True).items(): + setattr(owner, key, value) - 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 + try: + self.session.add(owner) + await self.session.commit() + await self.session.refresh(owner) + except Exception as e: + await self.session.rollback() + raise e diff --git a/backend/app/repositories/user_repository.py b/backend/app/repositories/user_repository.py index e69de29..629be50 100644 --- a/backend/app/repositories/user_repository.py +++ b/backend/app/repositories/user_repository.py @@ -0,0 +1,36 @@ +from sqlalchemy.ext.asyncio.session import AsyncSession +from typing import Annotated +from fastapi import Depends +from app.providers.db_provider import get_session +from ..models.user import User +from sqlmodel import select + +from uuid import UUID + +class UserRepository: + def __init__(self, session: Annotated[AsyncSession, Depends(get_session)]) -> None: + self.session = session + + async def get_by_id(self, user_id: UUID): + statement = select(User).where(User.id == user_id) + result = await self.session.execute(statement) + return result.scalar_one_or_none() + + async def save(self, user: User) -> None: + """ + Save a user to the database. If a user with that ID already exists, do an upsert. + """ + existing = await self.get_by_id(user.id) + if not existing: + existing = user + + for key, value in user.model_dump(exclude_unset=True).items(): + setattr(user, key, value) + + try: + self.session.add(user) + await self.session.commit() + await self.session.refresh(user) + except Exception as e: + await self.session.rollback() + raise e