From 9f0c77dc3121272df6181c068bec7921986fbb86 Mon Sep 17 00:00:00 2001 From: Cliff Hill Date: Tue, 26 Aug 2025 16:02:37 -0400 Subject: [PATCH] Fixed type hints. Signed-off-by: Cliff Hill --- backend/src/backend/dependencies/db.py | 3 ++- backend/src/backend/models.py | 6 ++++++ backend/src/backend/routers/bookings.py | 11 ++++++----- backend/src/backend/routers/invitees.py | 12 +++++++++--- backend/src/backend/routers/rooms.py | 11 ++++++----- backend/src/backend/routers/users.py | 6 ++++-- backend/src/backend/services/bookings.py | 17 ++++++----------- backend/src/backend/services/invitees.py | 11 +++-------- backend/src/backend/services/rooms.py | 17 ++++++----------- backend/src/backend/services/users.py | 7 +------ 10 files changed, 49 insertions(+), 52 deletions(-) diff --git a/backend/src/backend/dependencies/db.py b/backend/src/backend/dependencies/db.py index 1ff26f3a..5185a717 100644 --- a/backend/src/backend/dependencies/db.py +++ b/backend/src/backend/dependencies/db.py @@ -1,5 +1,6 @@ """Dependency definitions for FastAPI routes.""" +from collections.abc import AsyncGenerator from typing import Annotated from fastapi import Depends @@ -13,7 +14,7 @@ from backend import db async_maker = async_sessionmaker(db.engine) -async def get_session(): +async def get_session() -> AsyncGenerator[AsyncSession, None]: """Inject a new database session. Yields: diff --git a/backend/src/backend/models.py b/backend/src/backend/models.py index fae3348a..a6403c3d 100644 --- a/backend/src/backend/models.py +++ b/backend/src/backend/models.py @@ -130,3 +130,9 @@ async def create_db_and_tables() -> None: # pragma: no cover """ async with engine.begin() as conn: await conn.run_sync(Base.metadata.create_all) + + +type UserList = list[User] +type RoomList = list[Room] +type BookingList = list[Booking] +type InviteeList = list[Invitee] diff --git a/backend/src/backend/routers/bookings.py b/backend/src/backend/routers/bookings.py index 72b631ea..c3215304 100644 --- a/backend/src/backend/routers/bookings.py +++ b/backend/src/backend/routers/bookings.py @@ -11,6 +11,7 @@ from sqlalchemy.exc import SQLAlchemyError from backend.dependencies.db import DBSession from backend.models import Booking +from backend.models import BookingList from backend.schemas.bookings import BookingCreate from backend.schemas.bookings import BookingResponse from backend.schemas.bookings import BookingUpdate @@ -27,7 +28,7 @@ router = APIRouter(prefix="/bookings", tags=["bookings"]) @router.get("/room/{room_id}", response_model=List[BookingResponse]) -async def read_bookings_for_room(room_id: int, session: DBSession): +async def read_bookings_for_room(room_id: int, session: DBSession) -> BookingList: """Retrieve all bookings for a specific room. Args: @@ -66,7 +67,7 @@ async def read_bookings_for_room(room_id: int, session: DBSession): @router.get("/{booking_id}", response_model=BookingResponse) -async def read_booking(booking_id: int, session: DBSession): +async def read_booking(booking_id: int, session: DBSession) -> Booking: """Retrieve a booking by ID. Args: @@ -110,7 +111,7 @@ async def read_booking(booking_id: int, session: DBSession): @router.post("/", response_model=BookingResponse, status_code=status.HTTP_201_CREATED) -async def create_booking(booking: BookingCreate, session: DBSession): +async def create_booking(booking: BookingCreate, session: DBSession) -> Booking: """Create a new booking. Args: @@ -146,7 +147,7 @@ async def create_booking(booking: BookingCreate, session: DBSession): @router.put("/{booking_id}", response_model=BookingResponse) async def update_existing_booking( booking_id: int, booking_update: BookingUpdate, session: DBSession -): +) -> Booking: """Update an existing booking. Args: @@ -192,7 +193,7 @@ async def update_existing_booking( @router.delete("/{booking_id}", status_code=status.HTTP_204_NO_CONTENT) -async def delete_existing_booking(booking_id: int, session: DBSession): +async def delete_existing_booking(booking_id: int, session: DBSession) -> None: """Delete a booking. Args: diff --git a/backend/src/backend/routers/invitees.py b/backend/src/backend/routers/invitees.py index 87839a60..9c157270 100644 --- a/backend/src/backend/routers/invitees.py +++ b/backend/src/backend/routers/invitees.py @@ -10,6 +10,8 @@ from pydantic import EmailStr from sqlalchemy.exc import SQLAlchemyError from backend.dependencies.db import DBSession +from backend.models import User +from backend.models import UserList from backend.schemas.invitees import InviteeCreate from backend.schemas.invitees import InviteeResponse from backend.schemas.users import UserResponse @@ -24,7 +26,7 @@ router = APIRouter(prefix="/invitees", tags=["invitees"]) @router.get("/booking/{booking_id}", response_model=List[UserResponse]) -async def read_invitees_for_booking(booking_id: int, session: DBSession): +async def read_invitees_for_booking(booking_id: int, session: DBSession) -> UserList: """Retrieve all invitees for a specific booking. Args: @@ -67,7 +69,9 @@ async def read_invitees_for_booking(booking_id: int, session: DBSession): response_model=InviteeResponse, status_code=status.HTTP_201_CREATED, ) -async def add_invitee(booking_id: int, invitee: InviteeCreate, session: DBSession): +async def add_invitee( + booking_id: int, invitee: InviteeCreate, session: DBSession +) -> User: """Add an invitee to a booking. Args: @@ -112,7 +116,9 @@ async def add_invitee(booking_id: int, invitee: InviteeCreate, session: DBSessio @router.delete( "/booking/{booking_id}/user/{user_email}", status_code=status.HTTP_204_NO_CONTENT ) -async def remove_invitee(booking_id: int, user_email: EmailStr, session: DBSession): +async def remove_invitee( + booking_id: int, user_email: EmailStr, session: DBSession +) -> None: """Remove an invitee from a booking. Args: diff --git a/backend/src/backend/routers/rooms.py b/backend/src/backend/routers/rooms.py index d3f73203..f3d23247 100644 --- a/backend/src/backend/routers/rooms.py +++ b/backend/src/backend/routers/rooms.py @@ -11,6 +11,7 @@ from sqlalchemy.exc import SQLAlchemyError from backend.dependencies.db import DBSession from backend.models import Room +from backend.models import RoomList from backend.schemas.rooms import RoomCreate from backend.schemas.rooms import RoomResponse from backend.schemas.rooms import RoomUpdate @@ -27,7 +28,7 @@ router = APIRouter(prefix="/rooms", tags=["rooms"]) @router.get("/", response_model=List[RoomResponse]) -async def read_rooms(session: DBSession): +async def read_rooms(session: DBSession) -> RoomList: """Retrieve all rooms. Args: @@ -59,7 +60,7 @@ async def read_rooms(session: DBSession): @router.get("/{room_id}", response_model=RoomResponse) -async def read_room(room_id: int, session: DBSession): +async def read_room(room_id: int, session: DBSession) -> Room: """Retrieve a room by ID. Args: @@ -101,7 +102,7 @@ async def read_room(room_id: int, session: DBSession): @router.post("/", response_model=RoomResponse, status_code=status.HTTP_201_CREATED) -async def create_room(room: RoomCreate, session: DBSession): +async def create_room(room: RoomCreate, session: DBSession) -> Room: """Create a new room. Args: @@ -136,7 +137,7 @@ async def create_room(room: RoomCreate, session: DBSession): @router.put("/{room_id}", response_model=RoomResponse) async def update_existing_room( room_id: int, room_update: RoomUpdate, session: DBSession -): +) -> Room: """Update an existing room. Args: @@ -179,7 +180,7 @@ async def update_existing_room( @router.delete("/{room_id}", status_code=status.HTTP_204_NO_CONTENT) -async def delete_existing_room(room_id: int, session: DBSession): +async def delete_existing_room(room_id: int, session: DBSession) -> None: """Delete a room. Args: diff --git a/backend/src/backend/routers/users.py b/backend/src/backend/routers/users.py index ceb6f2f4..fee75b2a 100644 --- a/backend/src/backend/routers/users.py +++ b/backend/src/backend/routers/users.py @@ -9,6 +9,8 @@ from sqlalchemy.exc import NoResultFound from sqlalchemy.exc import SQLAlchemyError from backend.dependencies.db import DBSession +from backend.models import User +from backend.models import UserList from backend.schemas.users import UserResponse from backend.services.users import get_user from backend.services.users import get_users @@ -20,7 +22,7 @@ router = APIRouter(prefix="/users", tags=["users"]) @router.get("/", response_model=list[UserResponse]) -async def read_users(session: DBSession): +async def read_users(session: DBSession) -> UserList: """Retrieve all users. Args: @@ -48,7 +50,7 @@ async def read_users(session: DBSession): @router.get("/{email}", response_model=UserResponse) -async def read_user(email: EmailStr, session: DBSession): +async def read_user(email: EmailStr, session: DBSession) -> User: """Retrieve a user by email. Args: diff --git a/backend/src/backend/services/bookings.py b/backend/src/backend/services/bookings.py index a98489b5..f59b35d7 100644 --- a/backend/src/backend/services/bookings.py +++ b/backend/src/backend/services/bookings.py @@ -16,16 +16,11 @@ from sqlalchemy.exc import NoResultFound from sqlalchemy.ext.asyncio import AsyncSession from backend.models import Booking -from backend.models import Room -from backend.models import User +from backend.models import BookingList logger = logging.getLogger(__name__) -type UserList = list[User] -type RoomList = list[Room] -type BookingList = list[Booking] - class BookingParams(TypedDict): """Parameters for updating a booking. @@ -35,7 +30,7 @@ class BookingParams(TypedDict): """ -async def get_bookings_for_room(session: AsyncSession, room_id: int): +async def get_bookings_for_room(session: AsyncSession, room_id: int) -> BookingList: """Retrieve all bookings for a specific room. Args: @@ -64,7 +59,7 @@ async def get_bookings_for_room(session: AsyncSession, room_id: int): logger.debug("Exiting get_bookings_for_room") -async def get_booking(session: AsyncSession, booking_id: int): +async def get_booking(session: AsyncSession, booking_id: int) -> Booking: """Retrieve a booking by its ID. Args: @@ -92,7 +87,7 @@ async def get_booking(session: AsyncSession, booking_id: int): logger.debug("Exiting get_booking") -async def new_booking(session: AsyncSession, booking: Booking): +async def new_booking(session: AsyncSession, booking: Booking) -> Booking: """Create a new booking in the database. Args: @@ -123,7 +118,7 @@ async def update_booking( session: AsyncSession, booking_id: int, **kwargs: Unpack[BookingParams], -): +) -> Booking: """Update an existing booking. Args: @@ -158,7 +153,7 @@ async def update_booking( logger.debug("Exiting update_booking") -async def delete_booking(session: AsyncSession, booking_id: int): +async def delete_booking(session: AsyncSession, booking_id: int) -> None: """Delete a booking from the database. Args: diff --git a/backend/src/backend/services/invitees.py b/backend/src/backend/services/invitees.py index 1c5ca484..44bc3984 100644 --- a/backend/src/backend/services/invitees.py +++ b/backend/src/backend/services/invitees.py @@ -11,18 +11,13 @@ from sqlalchemy import delete from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession -from backend.models import Booking from backend.models import Invitee -from backend.models import Room from backend.models import User +from backend.models import UserList logger = logging.getLogger(__name__) -type UserList = list[User] -type RoomList = list[Room] -type BookingList = list[Booking] - async def get_invitees_for_booking(session: AsyncSession, booking_id: int) -> UserList: """Retrieve all invitees for a specific booking. @@ -57,7 +52,7 @@ async def get_invitees_for_booking(session: AsyncSession, booking_id: int) -> Us async def add_invitee_to_booking( session: AsyncSession, booking_id: int, user_email: str -) -> Invitee: +) -> User: """Add an invitee to a booking. Args: @@ -81,7 +76,7 @@ async def add_invitee_to_booking( logger.info( f"Successfully added invitee with email {user_email} to booking_id: {booking_id}" ) - return invitee + return invitee.user except Exception as e: logger.error( f"Failed to add invitee with email {user_email} to" diff --git a/backend/src/backend/services/rooms.py b/backend/src/backend/services/rooms.py index e36fee73..c203b18c 100644 --- a/backend/src/backend/services/rooms.py +++ b/backend/src/backend/services/rooms.py @@ -15,17 +15,12 @@ from sqlalchemy import update from sqlalchemy.exc import NoResultFound from sqlalchemy.ext.asyncio import AsyncSession -from backend.models import Booking from backend.models import Room -from backend.models import User +from backend.models import RoomList logger = logging.getLogger(__name__) -type UserList = list[User] -type RoomList = list[Room] -type BookingList = list[Booking] - class RoomParams(TypedDict): """Parameters for updating a room. @@ -35,7 +30,7 @@ class RoomParams(TypedDict): """ -async def get_rooms(session: AsyncSession): +async def get_rooms(session: AsyncSession) -> RoomList: """Retrieve all rooms from the database. Args: @@ -61,7 +56,7 @@ async def get_rooms(session: AsyncSession): logger.debug("Exiting get_rooms") -async def get_room(session: AsyncSession, room_id: int): +async def get_room(session: AsyncSession, room_id: int) -> Room: """Retrieve a room by its ID. Args: @@ -89,7 +84,7 @@ async def get_room(session: AsyncSession, room_id: int): logger.debug("Exiting get_room") -async def new_room(session: AsyncSession, room: Room): +async def new_room(session: AsyncSession, room: Room) -> Room: """Create a new room in the database. Args: @@ -118,7 +113,7 @@ async def new_room(session: AsyncSession, room: Room): async def update_room( session: AsyncSession, room_id: int, **kwargs: Unpack[RoomParams] -): +) -> Room: """Update an existing room. Args: @@ -151,7 +146,7 @@ async def update_room( logger.debug("Exiting update_room") -async def delete_room(session: AsyncSession, room_id: int): +async def delete_room(session: AsyncSession, room_id: int) -> None: """Delete a room from the database. Args: diff --git a/backend/src/backend/services/users.py b/backend/src/backend/services/users.py index f2369094..7aeb7832 100644 --- a/backend/src/backend/services/users.py +++ b/backend/src/backend/services/users.py @@ -11,17 +11,12 @@ from sqlalchemy import select from sqlalchemy.exc import NoResultFound from sqlalchemy.ext.asyncio import AsyncSession -from backend.models import Booking -from backend.models import Room from backend.models import User +from backend.models import UserList logger = logging.getLogger(__name__) -type UserList = list[User] -type RoomList = list[Room] -type BookingList = list[Booking] - async def get_users(session: AsyncSession) -> UserList: """Retrieve all users from the database.