63 lines
2.0 KiB
Python
63 lines
2.0 KiB
Python
import logging
|
|
from typing import Optional
|
|
|
|
|
|
from src.ezgg_lan_manager.services.DatabaseService import DatabaseService
|
|
from src.ezgg_lan_manager.services.TicketingService import TicketingService
|
|
from src.ezgg_lan_manager.types.ConfigurationTypes import LanInfo, SeatingConfiguration
|
|
from src.ezgg_lan_manager.types.Seat import Seat
|
|
|
|
logger = logging.getLogger(__name__.split(".")[-1])
|
|
|
|
class NoTicketError(Exception):
|
|
pass
|
|
|
|
class SeatNotFoundError(Exception):
|
|
pass
|
|
|
|
class WrongCategoryError(Exception):
|
|
pass
|
|
|
|
class SeatAlreadyTakenError(Exception):
|
|
pass
|
|
|
|
class SeatingService:
|
|
def __init__(self, lan_info: LanInfo, db_service: DatabaseService, ticketing_service: TicketingService) -> None:
|
|
self._lan_info = lan_info
|
|
self._db_service = db_service
|
|
self._ticketing_service = ticketing_service
|
|
|
|
async def get_seating(self) -> list[Seat]:
|
|
return await self._db_service.get_seating_info()
|
|
|
|
async def get_seat(self, seat_id: str, cached_data: Optional[list[Seat]] = None) -> Optional[Seat]:
|
|
all_seats = await self.get_seating() if not cached_data else cached_data
|
|
for seat in all_seats:
|
|
if seat.seat_id == seat_id:
|
|
return seat
|
|
|
|
async def get_user_seat(self, user_id: int) -> Optional[Seat]:
|
|
all_seats = await self.get_seating()
|
|
for seat in all_seats:
|
|
if seat.user and seat.user.user_id == user_id:
|
|
return seat
|
|
|
|
async def seat_user(self, user_id: int, seat_id: str) -> None:
|
|
user_ticket = await self._ticketing_service.get_user_ticket(user_id)
|
|
if not user_ticket:
|
|
raise NoTicketError
|
|
|
|
seat = await self.get_seat(seat_id)
|
|
if not seat:
|
|
raise SeatNotFoundError
|
|
|
|
if seat.category != user_ticket.category:
|
|
raise WrongCategoryError
|
|
|
|
if seat.user is not None:
|
|
raise SeatAlreadyTakenError
|
|
|
|
await self._db_service.seat_user(seat_id, user_id)
|
|
|
|
# ToDo: Make function that creates database table `seats` from config
|