From 8c2f5acccf067a9e54a25ad2869a7c420326b21e Mon Sep 17 00:00:00 2001 From: Jacob Windsor Date: Wed, 19 Feb 2025 15:22:02 +0100 Subject: [PATCH] Add DTOs for owner --- backend/app/dtos/owner_detail_response.py | 7 ++++++ backend/app/dtos/owner_list_response.py | 9 +++++++ backend/app/models/house.py | 2 +- backend/app/repositories/owner_repository.py | 5 ++++ backend/app/routers/houses.py | 15 +++++++++--- backend/app/routers/owners.py | 25 ++++++++++++++++++-- 6 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 backend/app/dtos/owner_detail_response.py create mode 100644 backend/app/dtos/owner_list_response.py diff --git a/backend/app/dtos/owner_detail_response.py b/backend/app/dtos/owner_detail_response.py new file mode 100644 index 0000000..f166374 --- /dev/null +++ b/backend/app/dtos/owner_detail_response.py @@ -0,0 +1,7 @@ +from pydantic import BaseModel + +class OwnerDetailResponse(BaseModel): + id: str + user_id: str + email: str + diff --git a/backend/app/dtos/owner_list_response.py b/backend/app/dtos/owner_list_response.py new file mode 100644 index 0000000..0740443 --- /dev/null +++ b/backend/app/dtos/owner_list_response.py @@ -0,0 +1,9 @@ +from pydantic import BaseModel + +class OwnerResponse(BaseModel): + id: str + user_id: str + + +class OwnerListResponse(BaseModel): + owners: list[OwnerResponse] \ No newline at end of file diff --git a/backend/app/models/house.py b/backend/app/models/house.py index 8f72217..bf8f57b 100644 --- a/backend/app/models/house.py +++ b/backend/app/models/house.py @@ -8,4 +8,4 @@ class House(SQLModel, table=True): country: str = Field() price: float = Field() description: str = Field() - owner_id: UUID = Field(foreign_key="user.id") # TODO consider using owner.id + owner_id: UUID = Field(foreign_key="owner.id") diff --git a/backend/app/repositories/owner_repository.py b/backend/app/repositories/owner_repository.py index 2ec2627..c32c083 100644 --- a/backend/app/repositories/owner_repository.py +++ b/backend/app/repositories/owner_repository.py @@ -11,6 +11,11 @@ class OwnerRepository: def __init__(self, session: Annotated[AsyncSession, Depends(get_session)]) -> None: self.session = session + async def get_all(self, offset: int = 0, limit: int = 100): + statement = select(Owner).offset(offset).limit(limit) + result = await self.session.execute(statement) + return result.scalars().all() + async def get_by_id(self, owner_id: UUID): statement = select(Owner).where(Owner.id == owner_id) result = await self.session.execute(statement) diff --git a/backend/app/routers/houses.py b/backend/app/routers/houses.py index c02c5db..87ee24d 100644 --- a/backend/app/routers/houses.py +++ b/backend/app/routers/houses.py @@ -2,7 +2,9 @@ from fastapi import APIRouter, Depends from typing import Annotated from ..providers.auth_provider import AuthContext from ..repositories.house_repository import HouseRepository +from ..repositories.owner_repository import OwnerRepository from ..models.house import House +from ..models.owner import Owner from ..dtos.house_create_request import HouseCreateRequest from ..dtos.house_create_response import HouseCreateResponse from ..dtos.houses_list_response import HousesListResponse, HouseResponse @@ -10,11 +12,18 @@ from ..dtos.houses_list_response import HousesListResponse, HouseResponse router = APIRouter() @router.post("") -async def create_house(body: HouseCreateRequest, auth: Annotated[AuthContext, Depends()], house_repository: Annotated[HouseRepository, Depends()]) -> HouseCreateResponse: - owner = auth.user +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_id(auth.user.id) + + if not owner: + new_owner = Owner( + user_id=auth.user.id + ) + + await owner_repository.save(new_owner) house = House( - owner_id=owner.id, + owner_id=auth.user.id, address=body.address, city=body.city, country=body.country, diff --git a/backend/app/routers/owners.py b/backend/app/routers/owners.py index 2e17849..e2f1e84 100644 --- a/backend/app/routers/owners.py +++ b/backend/app/routers/owners.py @@ -1,10 +1,31 @@ from fastapi import APIRouter, Depends from typing import Annotated from ..repositories.owner_repository import OwnerRepository +from ..repositories.user_repository import UserRepository + +from ..dtos.owner_list_response import OwnerListResponse, OwnerResponse +from ..dtos.owner_detail_response import OwnerDetailResponse router = APIRouter() +@router.get("") +async def get_owners(owner_repository: Annotated[OwnerRepository, Depends()]) -> OwnerListResponse: + owners = await owner_repository.get_all() + + owners_response = [OwnerResponse(id=str(owner.id), user_id=str(owner.user_id)) for owner in owners] + + return OwnerListResponse( + owners=owners_response + ) + @router.get("/{id}") -async def get_owner(id: str, owner_repository: Annotated[OwnerRepository, Depends()]): - return await owner_repository.get_by_id(id) \ No newline at end of file +async def get_owner(id: str, owner_repository: Annotated[OwnerRepository, Depends()], user_repository: Annotated[UserRepository, Depends()]) -> OwnerDetailResponse: + owner = await owner_repository.get_by_id(id) + user = await user_repository.get_by_id(owner.user_id) + + return OwnerDetailResponse( + id=str(owner.id), + user_id=str(owner.user_id), + email=user.email + ) \ No newline at end of file