diff --git a/db/database.db b/db/database.db new file mode 100644 index 0000000..2fe4b57 Binary files /dev/null and b/db/database.db differ diff --git a/src/classes/boardgame_classes.py b/src/classes/boardgame_classes.py index b951c32..33b8048 100644 --- a/src/classes/boardgame_classes.py +++ b/src/classes/boardgame_classes.py @@ -1,7 +1,7 @@ -from pydantic import BaseModel, HttpUrl from datetime import date from enum import Enum -from sqlmodel import Field, SQLModel, Column, JSON +from sqlmodel import Field, SQLModel + class BoardgameType(Enum): BOARDGAME = 'boardgame' @@ -12,24 +12,7 @@ class BoardgameType(Enum): WISHLISTBOARDGAMEEXPANSION = 'wishlistboardgameexpansion' -class BoardGame(BaseModel): - id: int - name: str - description: str - image_url : HttpUrl - thumbnail_url : HttpUrl - year_published: int - min_players: int - max_players: int - min_playing_time: int - max_playing_time: int - min_age: int - all_expansion_ids: list[int] - type: BoardgameType = BoardgameType.BOARDGAME - - -class BoardGameTable(SQLModel, table=True): - id: int = Field(primary_key=True) +class BoardGameBase(SQLModel): name: str description: str image_url : str @@ -40,25 +23,43 @@ class BoardGameTable(SQLModel, table=True): min_playing_time: int max_playing_time: int min_age: int - all_expansion_ids: list[int] = Field(sa_column=Column(JSON)) - type: BoardgameType = BoardgameType.BOARDGAME + model_config = { + 'validate_assignment':True + } -class BoardGameExpansion(BoardGame): - type: BoardgameType = BoardgameType.BOARDGAMEEXPANSION - -class OwnedBoardGame(BoardGame): +class OwnedBoardGameBase(BoardGameBase): price_paid: float acquisition_date: date acquired_from: str + +class WishlistBoardGameBase(BoardGameBase): + wishlist_priority: int + + +class BoardGame(BoardGameBase, table=True): + id: int = Field(primary_key=True) + type: BoardgameType = BoardgameType.BOARDGAME + +class BoardGameExpansion(BoardGameBase, table=True): + id: int = Field(primary_key=True) + expansion_for: int = Field(default=None, foreign_key="boardgame.id") + type: BoardgameType = BoardgameType.BOARDGAMEEXPANSION + +class OwnedBoardGame(OwnedBoardGameBase, table=True): + id: int = Field(primary_key=True) type: BoardgameType = BoardgameType.OWNEDBOARDGAME -class OwnedBoardGameExpansion(OwnedBoardGame): +class OwnedBoardGameExpansion(OwnedBoardGameBase, table=True): + id: int = Field(primary_key=True) + expansion_for: int = Field(default=None, foreign_key="boardgame.id") type: BoardgameType = BoardgameType.OWNEDBOARDGAMEEXPANSION -class WishlistBoardGame(BoardGame): - wishlist_priority: int +class WishlistBoardGame(WishlistBoardGameBase, table=True): + id: int = Field(primary_key=True) type: BoardgameType = BoardgameType.WISHLISTBOARDGAME -class WishlistBoardGameExpansion(WishlistBoardGame): +class WishlistBoardGameExpansion(WishlistBoardGameBase, table=True): + id: int = Field(primary_key=True) + expansion_for: int = Field(default=None, foreign_key="boardgame.id") type: BoardgameType = BoardgameType.WISHLISTBOARDGAMEEXPANSION \ No newline at end of file diff --git a/src/main.py b/src/main.py index d470b01..18aed15 100644 --- a/src/main.py +++ b/src/main.py @@ -1,11 +1,17 @@ -from typing import Union from fastapi import FastAPI +from contextlib import asynccontextmanager from src.classes import boardgame_classes, play_classes from src.modules import data_connection -app = FastAPI() +@asynccontextmanager +async def lifespan(app: FastAPI): + # Startup + data_connection.create_db_and_tables() + yield + # Shutdown +app = FastAPI(lifespan=lifespan) @app.get("/") def read_root(): diff --git a/src/modules/bgg_connection.py b/src/modules/bgg_connection.py index 238bf59..ebb5933 100644 --- a/src/modules/bgg_connection.py +++ b/src/modules/bgg_connection.py @@ -80,14 +80,15 @@ def convert_xml_to_boardgame(boardgame_xml: ET.Element) -> boardgame_classes.Boa "max_players" : int(boardgame_xml.find('maxplayers').get('value')), "min_playing_time" : int(boardgame_xml.find('minplaytime').get('value')), "max_playing_time" : int(boardgame_xml.find('maxplaytime').get('value')), - "min_age" : int(boardgame_xml.find('minage').get('value')), - "all_expansion_ids" : expansion_ids + "min_age" : int(boardgame_xml.find('minage').get('value')) } match boardgame_type: case "boardgame": boardgame = boardgame_classes.BoardGame(**boardgame_dict) case "boardgameexpansion": + expansion_for = expansion_ids[0] + boardgame_dict['expansion_for'] = expansion_for boardgame = boardgame_classes.BoardGameExpansion(**boardgame_dict) @@ -132,7 +133,6 @@ def convert_collection_xml_to_owned_boardgame(boardgame_extra_info: boardgame_cl "min_playing_time" : boardgame_extra_info.min_playing_time, "max_playing_time" : boardgame_extra_info.max_playing_time, "min_age" : boardgame_extra_info.min_age, - "all_expansion_ids" : boardgame_extra_info.all_expansion_ids, **owned_boardgame_dict } @@ -140,6 +140,7 @@ def convert_collection_xml_to_owned_boardgame(boardgame_extra_info: boardgame_cl case "boardgame": boardgame = boardgame_classes.OwnedBoardGame(**boardgame_dict) case "boardgameexpansion": + boardgame_dict['expansion_for'] = boardgame_extra_info.expansion_for boardgame = boardgame_classes.OwnedBoardGameExpansion(**boardgame_dict) @@ -168,7 +169,6 @@ def convert_collection_xml_to_wishlist_boardgame(boardgame_extra_info: boardgame "min_playing_time" : boardgame_extra_info.min_playing_time, "max_playing_time" : boardgame_extra_info.max_playing_time, "min_age" : boardgame_extra_info.min_age, - "all_expansion_ids" : boardgame_extra_info.all_expansion_ids, **wishlist_boardgame_dict } @@ -176,6 +176,7 @@ def convert_collection_xml_to_wishlist_boardgame(boardgame_extra_info: boardgame case "boardgame": boardgame = boardgame_classes.WishlistBoardGame(**boardgame_dict) case "boardgameexpansion": + boardgame_dict['expansion_for'] = boardgame_extra_info.expansion_for boardgame = boardgame_classes.WishlistBoardGameExpansion(**boardgame_dict) diff --git a/src/modules/data_connection.py b/src/modules/data_connection.py index 543d841..4b2a700 100644 --- a/src/modules/data_connection.py +++ b/src/modules/data_connection.py @@ -1,4 +1,4 @@ -from src.modules import bgg_connection +from src.modules import bgg_connection, db_connection from src.classes import boardgame_classes, play_classes @@ -19,4 +19,8 @@ def get_user_wishlist_collection() -> list[boardgame_classes.BoardGame]: return bgg_connection.get_user_wishlist_collection() def get_plays() -> list[play_classes.Play]: - return bgg_connection.get_plays() \ No newline at end of file + return bgg_connection.get_plays() + + +def create_db_and_tables(): + db_connection.create_db_and_tables() \ No newline at end of file diff --git a/src/modules/db_connection.py b/src/modules/db_connection.py index e69de29..a99a90b 100644 --- a/src/modules/db_connection.py +++ b/src/modules/db_connection.py @@ -0,0 +1,12 @@ +from sqlmodel import create_engine, SQLModel +from src.config import definitions + +sqlite_url = definitions.SQLITE_URL + + +connect_args = {"check_same_thread": False} +engine = create_engine(sqlite_url, echo=True, connect_args=connect_args) + + +def create_db_and_tables(): + SQLModel.metadata.create_all(engine) \ No newline at end of file diff --git a/tests/test_main.py b/tests/test_main.py index 93fd9fd..a584979 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -20,8 +20,6 @@ def default_boardgame_test(to_test_boardgame: boardgame_classes.BoardGame): assert type(to_test_boardgame.min_playing_time) == int assert type(to_test_boardgame.max_playing_time) == int assert type(to_test_boardgame.min_age) == int - assert type(to_test_boardgame.all_expansion_ids) == list - assert type(to_test_boardgame.all_expansion_ids[0]) == int assert type(to_test_boardgame.type) == boardgame_classes.BoardgameType