From ec30a9c364742fd1edfdffbe2031ec02cf798a9e Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Sat, 3 Aug 2024 10:44:52 +0200 Subject: [PATCH 01/14] Started work on db connection. data_connection will control where data will be returned from --- src/main.py | 10 +++++----- src/modules/data_connection.py | 22 ++++++++++++++++++++++ src/modules/db_connection.py | 0 3 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 src/modules/data_connection.py create mode 100644 src/modules/db_connection.py diff --git a/src/main.py b/src/main.py index 6d94cea..d470b01 100644 --- a/src/main.py +++ b/src/main.py @@ -2,7 +2,7 @@ from typing import Union from fastapi import FastAPI from src.classes import boardgame_classes, play_classes -from src.modules import bgg_connection +from src.modules import data_connection app = FastAPI() @@ -13,23 +13,23 @@ def read_root(): @app.get("/boardgame/{boardgame_id}", response_model=boardgame_classes.BoardGame) def get_boardgame_by_id(boardgame_id: int): - requested_boardgame: boardgame_classes.BoardGame = bgg_connection.get_boardgame(boardgame_id) + requested_boardgame: boardgame_classes.BoardGame = data_connection.get_boardgame(boardgame_id) return requested_boardgame @app.get("/owned", response_model=list[boardgame_classes.OwnedBoardGame]) def get_owned_collection(): - requested_collection: list[boardgame_classes.OwnedBoardGame] = bgg_connection.get_user_owned_collection() + requested_collection: list[boardgame_classes.OwnedBoardGame] = data_connection.get_user_owned_collection() return requested_collection @app.get("/wishlist", response_model=list[boardgame_classes.WishlistBoardGame]) def get_wishlist_collection(): - requested_collection: list[boardgame_classes.WishlistBoardGame] = bgg_connection.get_user_wishlist_collection() + requested_collection: list[boardgame_classes.WishlistBoardGame] = data_connection.get_user_wishlist_collection() return requested_collection @app.get("/plays", response_model=list[play_classes.Play]) def get_plays(): - requested_plays: list[play_classes.Play] = bgg_connection.get_plays() + requested_plays: list[play_classes.Play] = data_connection.get_plays() return requested_plays \ No newline at end of file diff --git a/src/modules/data_connection.py b/src/modules/data_connection.py new file mode 100644 index 0000000..543d841 --- /dev/null +++ b/src/modules/data_connection.py @@ -0,0 +1,22 @@ +from src.modules import bgg_connection +from src.classes import boardgame_classes, play_classes + + +def get_boardgame(boardgame_id: int) -> boardgame_classes.BoardGame: + #Will check if it already exists in db, then it will get it from there + + return bgg_connection.get_boardgame(boardgame_id) + + + +def get_user_owned_collection() -> list[boardgame_classes.BoardGame]: + + return bgg_connection.get_user_owned_collection() + + +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 diff --git a/src/modules/db_connection.py b/src/modules/db_connection.py new file mode 100644 index 0000000..e69de29 From 5ee3f896475e2abd6fda09bd4a0a05e118f5205d Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Sat, 3 Aug 2024 14:18:54 +0200 Subject: [PATCH 02/14] Created boardgame class for DB --- src/classes/boardgame_classes.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/classes/boardgame_classes.py b/src/classes/boardgame_classes.py index 95fa245..b951c32 100644 --- a/src/classes/boardgame_classes.py +++ b/src/classes/boardgame_classes.py @@ -1,6 +1,7 @@ from pydantic import BaseModel, HttpUrl from datetime import date from enum import Enum +from sqlmodel import Field, SQLModel, Column, JSON class BoardgameType(Enum): BOARDGAME = 'boardgame' @@ -26,6 +27,23 @@ class BoardGame(BaseModel): all_expansion_ids: list[int] type: BoardgameType = BoardgameType.BOARDGAME + +class BoardGameTable(SQLModel, table=True): + id: int = Field(primary_key=True) + name: str + description: str + image_url : str + thumbnail_url : str + 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] = Field(sa_column=Column(JSON)) + type: BoardgameType = BoardgameType.BOARDGAME + + class BoardGameExpansion(BoardGame): type: BoardgameType = BoardgameType.BOARDGAMEEXPANSION From b7d3f2d0d23432df7d94e20a63bd440f9efd1623 Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Sat, 3 Aug 2024 14:19:18 +0200 Subject: [PATCH 03/14] Created definitions for sqlite database file --- src/config/definitions.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/config/definitions.py b/src/config/definitions.py index 04ccd5a..becca27 100644 --- a/src/config/definitions.py +++ b/src/config/definitions.py @@ -3,5 +3,8 @@ import os ROOT_PATH = project_root = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) SECRETS_FILE_PATH = ROOT_PATH + '/secrets/auth.yaml' +DATABASE_FILE_PROJECT_PATH = f"/db/database.db" +SQLITE_URL = f"sqlite://{DATABASE_FILE_PROJECT_PATH}" + BGG_MAX_THING_BOARDGAMES = 20 BGG_PLAY_PAGE_SIZE = 100 \ No newline at end of file From aaf0319151807627155c5bc57d790015915a3b1e Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Sat, 3 Aug 2024 15:42:19 +0200 Subject: [PATCH 04/14] Created boardgame DB classes for table creation --- db/database.db | Bin 0 -> 28672 bytes src/classes/boardgame_classes.py | 61 ++++++++++++++++--------------- src/main.py | 10 ++++- src/modules/bgg_connection.py | 9 +++-- src/modules/data_connection.py | 8 +++- src/modules/db_connection.py | 12 ++++++ tests/test_main.py | 2 - 7 files changed, 62 insertions(+), 40 deletions(-) create mode 100644 db/database.db diff --git a/db/database.db b/db/database.db new file mode 100644 index 0000000000000000000000000000000000000000..2fe4b571c8d141baf276e855e861d4296ceb1952 GIT binary patch literal 28672 zcmeI#Z*S5-90%}r1L}wxpY@U1JurqQ>VhVFG9Os6Od^8o&}5IAgWlj0`p33p!zVr% zD!v$BitouQfo2Wu5|qTH`8FY=z3Z|2{J!nwPEXoAV&vQl92$`q(gR7BrB{SVl2j2N zMSNCAd|q0eh`;i+?|EM<(z7rAJ<(d(`6b~?y2bNljs?hdVpi+N`L$a0XIJBg9RbTbE7`C5L!y?{s4%w9Zu zib*vs@pj6*F`D{GfojhWwN#Nln63A^c}CtDXQak$EiPQMYZ|TNPJFGF8eSu&(KJk> z(=bj+lBdOeRqfm3vZ5Xx$v+2+*m)N&vy(o_FgceislerQLfS-eoPSN52-$#HJ{5Ut zw!6A`Uavi~bntn?Lmoe~mQBTy_a=S~tn~<(ZJh_6llkP{_MpxVONv^r%X4)R)b)(6 zUn!^Jx!#UsZX=nuJvdiicNO*EK>qPGdtqI@$CG@NQn6WUMryW^nicC`t)3gLja6+{ z-%(UeljjdJ*0}VlwVSGax($WjM&bY0LbhRMu5?*Z_xI)RC+X!Tc}wi1l9F6TNVXA@ zoHb>`8peBbvFXPF0SG_<0uX=z1Rwwb2tWV=5P(2|1+f1waB(p;2tWV=5P$##AOHaf zKmY;|fWT4!`+r0M0uX=z1Rwwb2tWV=5P$##AW(b(?Ei~jW6Tf&5P$##AOHafKmY;| zfB*y_fc-x*009U<00Izz00bZa0SG_<0uU&^0QUdIuQ6r_0SG_<0uX=z1Rwwb2tWV= G5cmU%h!SQ1 literal 0 HcmV?d00001 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 From f96494cf0779b93d71e6e644923633db2cd6d466 Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Thu, 8 Aug 2024 16:50:42 +0200 Subject: [PATCH 05/14] Added weight to board game class --- src/classes/boardgame_classes.py | 1 + src/modules/bgg_connection.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/classes/boardgame_classes.py b/src/classes/boardgame_classes.py index 33b8048..d8abdcf 100644 --- a/src/classes/boardgame_classes.py +++ b/src/classes/boardgame_classes.py @@ -15,6 +15,7 @@ class BoardgameType(Enum): class BoardGameBase(SQLModel): name: str description: str + weight: float image_url : str thumbnail_url : str year_published: int diff --git a/src/modules/bgg_connection.py b/src/modules/bgg_connection.py index ebb5933..31df512 100644 --- a/src/modules/bgg_connection.py +++ b/src/modules/bgg_connection.py @@ -72,6 +72,7 @@ def convert_xml_to_boardgame(boardgame_xml: ET.Element) -> boardgame_classes.Boa boardgame_dict = { "id" : int(boardgame_xml.get('id')), "name" : boardgame_xml.find('name').get('value'), + "weight": boardgame_xml.find('statistics').find('ratings').find('averageweight').get('value'), "description" : boardgame_xml.find('description').text, "image_url" : boardgame_xml.find('image').text, "thumbnail_url" : boardgame_xml.find('thumbnail').text, @@ -124,6 +125,7 @@ def convert_collection_xml_to_owned_boardgame(boardgame_extra_info: boardgame_cl boardgame_dict = { "id" : boardgame_extra_info.id, "name" : boardgame_extra_info.name, + "weight" : boardgame_extra_info.weight, "description" : boardgame_extra_info.description, "image_url" : boardgame_extra_info.image_url, "thumbnail_url" : boardgame_extra_info.thumbnail_url, From 962a842b440f07a73fe4b0103406430ad4b6f65d Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Thu, 8 Aug 2024 16:50:52 +0200 Subject: [PATCH 06/14] Added ability to fully remove database --- db/database.db | Bin 28672 -> 28672 bytes src/config/definitions.py | 1 + src/main.py | 1 + src/modules/data_connection.py | 2 ++ src/modules/db_connection.py | 3 +++ 5 files changed, 7 insertions(+) diff --git a/db/database.db b/db/database.db index 2fe4b571c8d141baf276e855e861d4296ceb1952..9b0b041164b060751dde65b11c58f25b3e3342ed 100644 GIT binary patch delta 269 zcmZp8z}WDBaY7cKI0K(D_chMl?3pafnZ!3X&S&Im~CPq$w7Itw% zL&grz$=BK2&=qZCrJjV~KrsV*Z(+2()zObGzlu}jMU delta 186 zcmZp8z}WDBaY7c~S_VEF9u6)x_Oq-iOlvm_3Yao+wUn^2i#s|pb`(!mWSY162Ga#b zPBm6`acgVF&g97(S*8MoI2k9`@K#KIz}CfS#= list[boardgame_classes.BoardGame]: def get_plays() -> list[play_classes.Play]: return bgg_connection.get_plays() +def delete_database(): + db_connection.delete_database() 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 a99a90b..64fe11f 100644 --- a/src/modules/db_connection.py +++ b/src/modules/db_connection.py @@ -1,5 +1,6 @@ from sqlmodel import create_engine, SQLModel from src.config import definitions +import os sqlite_url = definitions.SQLITE_URL @@ -7,6 +8,8 @@ sqlite_url = definitions.SQLITE_URL connect_args = {"check_same_thread": False} engine = create_engine(sqlite_url, echo=True, connect_args=connect_args) +def delete_database(): + os.remove(definitions.DATABASE_FILE_PATH) def create_db_and_tables(): SQLModel.metadata.create_all(engine) \ No newline at end of file From f47c7cfd161a1e54eb2a6edccd244ffd928ac989 Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Thu, 8 Aug 2024 16:52:48 +0200 Subject: [PATCH 07/14] Bgg connection owned info now unpacks board game extra info --- src/modules/bgg_connection.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/src/modules/bgg_connection.py b/src/modules/bgg_connection.py index 31df512..9cd4a52 100644 --- a/src/modules/bgg_connection.py +++ b/src/modules/bgg_connection.py @@ -123,18 +123,7 @@ def convert_collection_xml_to_owned_boardgame(boardgame_extra_info: boardgame_cl } boardgame_dict = { - "id" : boardgame_extra_info.id, - "name" : boardgame_extra_info.name, - "weight" : boardgame_extra_info.weight, - "description" : boardgame_extra_info.description, - "image_url" : boardgame_extra_info.image_url, - "thumbnail_url" : boardgame_extra_info.thumbnail_url, - "year_published" : boardgame_extra_info.year_published, - "min_players" : boardgame_extra_info.min_players, - "max_players" : boardgame_extra_info.max_players, - "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, + **boardgame_extra_info, **owned_boardgame_dict } From 42b13b8413e78be186d1070ea0bfcfebd3b63557 Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Thu, 8 Aug 2024 17:00:22 +0200 Subject: [PATCH 08/14] Fixed unpacking bug --- src/modules/bgg_connection.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/modules/bgg_connection.py b/src/modules/bgg_connection.py index 9cd4a52..277e8b2 100644 --- a/src/modules/bgg_connection.py +++ b/src/modules/bgg_connection.py @@ -123,7 +123,7 @@ def convert_collection_xml_to_owned_boardgame(boardgame_extra_info: boardgame_cl } boardgame_dict = { - **boardgame_extra_info, + **boardgame_extra_info.__dict__, **owned_boardgame_dict } @@ -149,17 +149,7 @@ def convert_collection_xml_to_wishlist_boardgame(boardgame_extra_info: boardgame } boardgame_dict = { - "id" : boardgame_extra_info.id, - "name" : boardgame_extra_info.name, - "description" : boardgame_extra_info.description, - "image_url" : boardgame_extra_info.image_url, - "thumbnail_url" : boardgame_extra_info.thumbnail_url, - "year_published" : boardgame_extra_info.year_published, - "min_players" : boardgame_extra_info.min_players, - "max_players" : boardgame_extra_info.max_players, - "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, + **boardgame_extra_info.__dict__, **wishlist_boardgame_dict } From 1ad9985377f03c0a6a39da6b472c2af629544469 Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Thu, 8 Aug 2024 17:00:34 +0200 Subject: [PATCH 09/14] Added test for correct weight conversion --- tests/test_main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/test_main.py b/tests/test_main.py index a584979..95126e9 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -11,6 +11,7 @@ client = TestClient(app) def default_boardgame_test(to_test_boardgame: boardgame_classes.BoardGame): assert type(to_test_boardgame.id) == int assert type(to_test_boardgame.name) == str + assert type(to_test_boardgame.weight) == float assert type(to_test_boardgame.description) == str assert validators.url(str(to_test_boardgame.image_url)) assert validators.url(str(to_test_boardgame.thumbnail_url)) From dfec34acc7162b0eacf9fd5b3243091e18fa04cc Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Thu, 8 Aug 2024 17:13:29 +0200 Subject: [PATCH 10/14] Created ability to add board games to db --- src/modules/data_connection.py | 8 ++++++-- src/modules/db_connection.py | 28 +++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/modules/data_connection.py b/src/modules/data_connection.py index 9b17826..3a4ae7b 100644 --- a/src/modules/data_connection.py +++ b/src/modules/data_connection.py @@ -10,8 +10,12 @@ def get_boardgame(boardgame_id: int) -> boardgame_classes.BoardGame: def get_user_owned_collection() -> list[boardgame_classes.BoardGame]: - - return bgg_connection.get_user_owned_collection() + owned_boardgames_from_db = db_connection.get_all_owned_boardgames() + + if len(owned_boardgames_from_db) != 0: + return owned_boardgames_from_db + else: + return bgg_connection.get_user_owned_collection() def get_user_wishlist_collection() -> list[boardgame_classes.BoardGame]: diff --git a/src/modules/db_connection.py b/src/modules/db_connection.py index 64fe11f..71d5019 100644 --- a/src/modules/db_connection.py +++ b/src/modules/db_connection.py @@ -1,6 +1,9 @@ -from sqlmodel import create_engine, SQLModel +from sqlmodel import create_engine, SQLModel, Session, select from src.config import definitions import os +from typing import Union + +from src.classes import boardgame_classes sqlite_url = definitions.SQLITE_URL @@ -8,6 +11,29 @@ sqlite_url = definitions.SQLITE_URL connect_args = {"check_same_thread": False} engine = create_engine(sqlite_url, echo=True, connect_args=connect_args) +def add_boardgame(boardgame: Union[ + boardgame_classes.BoardGame, boardgame_classes.BoardGameExpansion, + boardgame_classes.OwnedBoardGame, boardgame_classes.OwnedBoardGameExpansion, + boardgame_classes.WishlistBoardGame, boardgame_classes.WishlistBoardGameExpansion]): + + session = Session(engine) + + session.add(boardgame) + + session.commit() + +def get_all_owned_boardgames(): + with Session(engine) as session: + statement = select(boardgame_classes.OwnedBoardGame) + results = session.exec(statement) + + boardgame_list = [] + + for boardgame in results: + boardgame_list.append(boardgame) + + return boardgame_list + def delete_database(): os.remove(definitions.DATABASE_FILE_PATH) From a7f9b635566ed8f8e96c8b96aae289f2d75f4ede Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Thu, 8 Aug 2024 17:56:22 +0200 Subject: [PATCH 11/14] When getting base board game, connection will check if board game is already in db and return it, if not it will add it. --- db/database.db | Bin 28672 -> 40960 bytes src/modules/data_connection.py | 11 ++++++++++- src/modules/db_connection.py | 27 +++++++++++++++++++-------- 3 files changed, 29 insertions(+), 9 deletions(-) diff --git a/db/database.db b/db/database.db index 9b0b041164b060751dde65b11c58f25b3e3342ed..79387f28d79493ceb4d8c351186d7f79c83dbdde 100644 GIT binary patch literal 40960 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 K-ku)r|Nk#7m_Km< delta 29 lcmZoTz|`=7ae_1}8v_Fa`$PqMMz)O!3-}i)1S~QT004Z`2n+xK diff --git a/src/modules/data_connection.py b/src/modules/data_connection.py index 3a4ae7b..45a1b26 100644 --- a/src/modules/data_connection.py +++ b/src/modules/data_connection.py @@ -4,9 +4,18 @@ from src.classes import boardgame_classes, play_classes def get_boardgame(boardgame_id: int) -> boardgame_classes.BoardGame: #Will check if it already exists in db, then it will get it from there + + boardgame_in_db: list[boardgame_classes.BoardGame] = db_connection.get_base_boardgames(boardgame_id=boardgame_id) - return bgg_connection.get_boardgame(boardgame_id) + to_return_boardgame = None + if len(boardgame_in_db) == 0: + to_return_boardgame = bgg_connection.get_boardgame(boardgame_id) + db_connection.add_boardgame(to_return_boardgame) + else: + to_return_boardgame = boardgame_in_db[0] + + return to_return_boardgame def get_user_owned_collection() -> list[boardgame_classes.BoardGame]: diff --git a/src/modules/db_connection.py b/src/modules/db_connection.py index 71d5019..2fca9bf 100644 --- a/src/modules/db_connection.py +++ b/src/modules/db_connection.py @@ -16,21 +16,32 @@ def add_boardgame(boardgame: Union[ boardgame_classes.OwnedBoardGame, boardgame_classes.OwnedBoardGameExpansion, boardgame_classes.WishlistBoardGame, boardgame_classes.WishlistBoardGameExpansion]): - session = Session(engine) + with Session(engine) as session: + session.add(boardgame) - session.add(boardgame) + session.commit() + session.refresh(boardgame) - session.commit() +def get_base_boardgames(boardgame_id = None) -> list[boardgame_classes.BoardGame]: + with Session(engine) as session: + session.expire_on_commit = False + if boardgame_id == None: + statement = select(boardgame_classes.BoardGame) + else: + statement = select(boardgame_classes.BoardGame).where(boardgame_classes.BoardGame.id == boardgame_id) + results = session.exec(statement) + + boardgame_list = results.all() -def get_all_owned_boardgames(): + return boardgame_list + + +def get_all_owned_boardgames() -> list[boardgame_classes.OwnedBoardGame]: with Session(engine) as session: statement = select(boardgame_classes.OwnedBoardGame) results = session.exec(statement) - boardgame_list = [] - - for boardgame in results: - boardgame_list.append(boardgame) + boardgame_list = results.all() return boardgame_list From c73d7b31ced312e36fec21753ebff180ee15db06 Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Thu, 8 Aug 2024 18:13:01 +0200 Subject: [PATCH 12/14] Response models can now properly return expansions as well --- src/main.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main.py b/src/main.py index 5cbd483..9edf181 100644 --- a/src/main.py +++ b/src/main.py @@ -1,3 +1,5 @@ +from typing import Union + from fastapi import FastAPI from contextlib import asynccontextmanager @@ -23,13 +25,13 @@ def get_boardgame_by_id(boardgame_id: int): requested_boardgame: boardgame_classes.BoardGame = data_connection.get_boardgame(boardgame_id) return requested_boardgame -@app.get("/owned", response_model=list[boardgame_classes.OwnedBoardGame]) +@app.get("/owned", response_model=Union[list[boardgame_classes.OwnedBoardGame], list[boardgame_classes.OwnedBoardGameExpansion]]) def get_owned_collection(): requested_collection: list[boardgame_classes.OwnedBoardGame] = data_connection.get_user_owned_collection() return requested_collection -@app.get("/wishlist", response_model=list[boardgame_classes.WishlistBoardGame]) +@app.get("/wishlist", response_model=Union[list[boardgame_classes.WishlistBoardGame], list[boardgame_classes.WishlistBoardGameExpansion]]) def get_wishlist_collection(): requested_collection: list[boardgame_classes.WishlistBoardGame] = data_connection.get_user_wishlist_collection() return requested_collection From 3e9347d71c7cf3b881cdf418d293a55267775972 Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Thu, 8 Aug 2024 18:13:18 +0200 Subject: [PATCH 13/14] Owned collection is properly stored in db --- db/database.db | Bin 40960 -> 28672 bytes src/modules/data_connection.py | 16 +++++++++++----- src/modules/db_connection.py | 12 ++++++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/db/database.db b/db/database.db index 79387f28d79493ceb4d8c351186d7f79c83dbdde..9b0b041164b060751dde65b11c58f25b3e3342ed 100644 GIT binary patch delta 29 lcmZoTz|`=7ae_1}8v_Fa`$PqMMz)O!3-}i)1S~QT004Z`2n+xK literal 40960 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 K-ku)r|Nk#7m_Km< diff --git a/src/modules/data_connection.py b/src/modules/data_connection.py index 45a1b26..d70f27f 100644 --- a/src/modules/data_connection.py +++ b/src/modules/data_connection.py @@ -9,26 +9,32 @@ def get_boardgame(boardgame_id: int) -> boardgame_classes.BoardGame: to_return_boardgame = None - if len(boardgame_in_db) == 0: + if len(boardgame_in_db) != 0: + to_return_boardgame = boardgame_in_db[0] + else: to_return_boardgame = bgg_connection.get_boardgame(boardgame_id) db_connection.add_boardgame(to_return_boardgame) - else: - to_return_boardgame = boardgame_in_db[0] return to_return_boardgame -def get_user_owned_collection() -> list[boardgame_classes.BoardGame]: +def get_user_owned_collection() -> list[boardgame_classes.OwnedBoardGame]: owned_boardgames_from_db = db_connection.get_all_owned_boardgames() if len(owned_boardgames_from_db) != 0: return owned_boardgames_from_db else: - return bgg_connection.get_user_owned_collection() + owned_boardgames = bgg_connection.get_user_owned_collection() + for boardgame in owned_boardgames: + db_connection.add_boardgame(boardgame) + + return owned_boardgames def get_user_wishlist_collection() -> list[boardgame_classes.BoardGame]: + owned_boardgames_from_db = db_connection.get_all_wishlisted_boardgames + return bgg_connection.get_user_wishlist_collection() def get_plays() -> list[play_classes.Play]: diff --git a/src/modules/db_connection.py b/src/modules/db_connection.py index 2fca9bf..62715a0 100644 --- a/src/modules/db_connection.py +++ b/src/modules/db_connection.py @@ -45,6 +45,18 @@ def get_all_owned_boardgames() -> list[boardgame_classes.OwnedBoardGame]: return boardgame_list +def get_all_owned_boardgames_expansions() -> list[boardgame_classes.OwnedBoardGameExpansion]: + with Session(engine) as session: + statement = select(boardgame_classes.OwnedBoardGameExpansion) + results = session.exec(statement) + + boardgame_list = results.all() + + return boardgame_list + +def get_all_wishlisted_boardgames() -> list[boardgame_classes.WishlistBoardGame]: + pass + def delete_database(): os.remove(definitions.DATABASE_FILE_PATH) From a34b482b958446910a1350d1b08d43e9fc0c2e1a Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Thu, 8 Aug 2024 18:41:18 +0200 Subject: [PATCH 14/14] Added more typing --- src/main.py | 10 ++++------ src/modules/bgg_connection.py | 3 ++- src/modules/data_connection.py | 16 +++++++++++----- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/main.py b/src/main.py index 9edf181..89ce92c 100644 --- a/src/main.py +++ b/src/main.py @@ -25,16 +25,14 @@ def get_boardgame_by_id(boardgame_id: int): requested_boardgame: boardgame_classes.BoardGame = data_connection.get_boardgame(boardgame_id) return requested_boardgame -@app.get("/owned", response_model=Union[list[boardgame_classes.OwnedBoardGame], list[boardgame_classes.OwnedBoardGameExpansion]]) +@app.get("/owned", response_model=list[Union[boardgame_classes.OwnedBoardGame, boardgame_classes.OwnedBoardGameExpansion]]) def get_owned_collection(): - requested_collection: list[boardgame_classes.OwnedBoardGame] = data_connection.get_user_owned_collection() - return requested_collection + return data_connection.get_user_owned_collection() -@app.get("/wishlist", response_model=Union[list[boardgame_classes.WishlistBoardGame], list[boardgame_classes.WishlistBoardGameExpansion]]) +@app.get("/wishlist", response_model=list[Union[boardgame_classes.WishlistBoardGame, boardgame_classes.WishlistBoardGameExpansion]]) def get_wishlist_collection(): - requested_collection: list[boardgame_classes.WishlistBoardGame] = data_connection.get_user_wishlist_collection() - return requested_collection + return data_connection.get_user_wishlist_collection() diff --git a/src/modules/bgg_connection.py b/src/modules/bgg_connection.py index 277e8b2..9154ddf 100644 --- a/src/modules/bgg_connection.py +++ b/src/modules/bgg_connection.py @@ -5,6 +5,7 @@ import requests from datetime import datetime import time import math +from typing import Union from src.classes import boardgame_classes, play_classes from src.modules import auth_manager @@ -96,7 +97,7 @@ def convert_xml_to_boardgame(boardgame_xml: ET.Element) -> boardgame_classes.Boa return boardgame -def convert_collection_xml_to_owned_boardgame(boardgame_extra_info: boardgame_classes.BoardGame, collection_boardgame_xml: ET.Element) -> boardgame_classes.OwnedBoardGame: +def convert_collection_xml_to_owned_boardgame(boardgame_extra_info: boardgame_classes.BoardGame, collection_boardgame_xml: ET.Element) -> Union[boardgame_classes.OwnedBoardGame, boardgame_classes.OwnedBoardGameExpansion]: boardgame_type = collection_boardgame_xml.get('subtype') diff --git a/src/modules/data_connection.py b/src/modules/data_connection.py index d70f27f..8649922 100644 --- a/src/modules/data_connection.py +++ b/src/modules/data_connection.py @@ -1,3 +1,5 @@ +from typing import Union + from src.modules import bgg_connection, db_connection from src.classes import boardgame_classes, play_classes @@ -18,20 +20,24 @@ def get_boardgame(boardgame_id: int) -> boardgame_classes.BoardGame: return to_return_boardgame -def get_user_owned_collection() -> list[boardgame_classes.OwnedBoardGame]: +def get_user_owned_collection() -> list[Union[boardgame_classes.OwnedBoardGame, boardgame_classes.OwnedBoardGameExpansion]]: owned_boardgames_from_db = db_connection.get_all_owned_boardgames() + owned_boardgame_expanions_from_db = db_connection.get_all_owned_boardgames_expansions() - if len(owned_boardgames_from_db) != 0: - return owned_boardgames_from_db - else: + boardgames_to_return = [] + + if len(owned_boardgames_from_db) == 0 and len(owned_boardgame_expanions_from_db) == 0: owned_boardgames = bgg_connection.get_user_owned_collection() for boardgame in owned_boardgames: db_connection.add_boardgame(boardgame) return owned_boardgames + else: + return owned_boardgames_from_db + -def get_user_wishlist_collection() -> list[boardgame_classes.BoardGame]: +def get_user_wishlist_collection() -> Union[list[boardgame_classes.WishlistBoardGame], list[boardgame_classes.WishlistBoardGameExpansion]]: owned_boardgames_from_db = db_connection.get_all_wishlisted_boardgames