Add DTOs for owner

This commit is contained in:
Jacob Windsor 2025-02-19 15:22:02 +01:00
parent 6f5a2f422e
commit 8c2f5acccf
6 changed files with 57 additions and 6 deletions

View File

@ -0,0 +1,7 @@
from pydantic import BaseModel
class OwnerDetailResponse(BaseModel):
id: str
user_id: str
email: str

View File

@ -0,0 +1,9 @@
from pydantic import BaseModel
class OwnerResponse(BaseModel):
id: str
user_id: str
class OwnerListResponse(BaseModel):
owners: list[OwnerResponse]

View File

@ -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")

View File

@ -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)

View File

@ -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,

View File

@ -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)
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
)