From 7bb210ba83312b56af2dee812f02c6a1bc549d3e Mon Sep 17 00:00:00 2001 From: Yarne Coppens Date: Sat, 24 Aug 2024 18:13:32 +0200 Subject: [PATCH] Can now retrieve players from endpoint --- src/classes/play_classes.py | 12 ++++++++---- src/classes/player_classes.py | 15 +++++++++------ src/main.py | 15 +++++++++++++-- src/modules/data_connection.py | 18 +++++++++++++++++- src/modules/db_connection.py | 12 ++++++++++++ 5 files changed, 59 insertions(+), 13 deletions(-) diff --git a/src/classes/play_classes.py b/src/classes/play_classes.py index 451b851..9a4113d 100644 --- a/src/classes/play_classes.py +++ b/src/classes/play_classes.py @@ -19,11 +19,15 @@ class PlayPlayer(PlayPlayerBase, table=True): player: "Player" = Relationship(back_populates="playplayers") class PlayPlayerPublic(PlayPlayerBase): - id: int name: str player: "PlayerPublicNoPlayPlayers" + play: "PlayPublic" -class PlayPlayerPublicWithPlay(PlayPlayerPublic): +class PlayPlayerPublicNoPlay(PlayPlayerBase): + name: str + player: "PlayerPublicNoPlayPlayers" + +class PlayPlayerPublicNoPlayer(PlayPlayerBase): name: str play: "PlayPublic" @@ -47,12 +51,12 @@ class Play(PlayBase, table=True): } class PlayPublic(PlayBase): - players: list[PlayPlayerPublic] + players: list[PlayPlayerPublicNoPlay] boardgame: "BoardGamePublicNoPlays" class PlayPublicNoGame(PlayBase): - players: list[PlayPlayerPublic] = [] + players: list[PlayPlayerPublicNoPlay] = [] from src.classes.boardgame_classes import BoardGame, BoardGamePublicNoPlays diff --git a/src/classes/player_classes.py b/src/classes/player_classes.py index 5a54308..e57f7e5 100644 --- a/src/classes/player_classes.py +++ b/src/classes/player_classes.py @@ -1,14 +1,17 @@ from sqlmodel import SQLModel, Field, Relationship -from src.classes.play_classes import PlayPlayer +from src.classes.play_classes import PlayPlayer, PlayPlayerPublicNoPlayer -class Player(SQLModel, table=True): +class PlayerBase(SQLModel): + name: str + +class Player(PlayerBase, table=True): name: str | None = Field(default=None, primary_key=True) playplayers: list[PlayPlayer] = Relationship(back_populates="player") -class PlayerPublic(SQLModel): - name: str +class PlayerPublic(PlayerBase): + playplayers: list[PlayPlayerPublicNoPlayer] -class PlayerPublicNoPlayPlayers(SQLModel): - name: str \ No newline at end of file +class PlayerPublicNoPlayPlayers(PlayerBase): + pass \ No newline at end of file diff --git a/src/main.py b/src/main.py index 742adbb..74de04c 100644 --- a/src/main.py +++ b/src/main.py @@ -8,7 +8,7 @@ from fastapi import FastAPI, Depends from fastapi.middleware.cors import CORSMiddleware from contextlib import asynccontextmanager -from src.classes import boardgame_classes, play_classes, statistic_classes, people_classes +from src.classes import boardgame_classes, play_classes, statistic_classes, people_classes, player_classes from src.modules import data_connection, statistic_creator from src.filters import boardgame_filters, play_filters @@ -152,8 +152,19 @@ def get_plays(query: PlayFilterParams = Depends(), boardgame_id: int = -1, sessi return requested_plays +@app.get('/players', response_model=list[player_classes.PlayerPublicNoPlayPlayers]) +def get_players(session: Session = Depends(get_session)): + requested_players = data_connection.get_all_players(session) -@app.get('/players', response_model=list[play_classes.PlayPlayerPublic]) + return requested_players + +@app.get('/player', response_model=player_classes.PlayerPublic) +def get_player(player_name: str, session: Session = Depends(get_session)): + requested_players = data_connection.get_player(player_name.title(), session) + + return requested_players + +@app.get('/players_from_play', response_model=list[play_classes.PlayPlayerPublic]) def get_players_from_play(play_id: int, session: Session = Depends(get_session)): requested_players = data_connection.get_players_from_play(session, play_id) diff --git a/src/modules/data_connection.py b/src/modules/data_connection.py index 5f93651..7edd70f 100644 --- a/src/modules/data_connection.py +++ b/src/modules/data_connection.py @@ -5,7 +5,7 @@ from threading import Lock critical_function_lock = Lock() from src.modules import bgg_connection, db_connection -from src.classes import boardgame_classes, play_classes, people_classes +from src.classes import boardgame_classes, play_classes, people_classes, player_classes def get_db_engine(): return db_connection.get_engine() @@ -119,6 +119,22 @@ def get_players_from_play(session: Session, play_id: int) -> list[play_classes.P return players_from_db +def get_all_players(session: Session) -> list[player_classes.Player]: + players_from_db = db_connection.get_all_players(session) + + if len(players_from_db) == 0: + all_plays = bgg_connection.get_plays() + + db_connection.add_multiple_plays(session, all_plays) + + players_from_db = db_connection.get_all_players(session) + + return players_from_db + +def get_player(player_name: str, session: Session) -> player_classes.Player: + player_from_db = db_connection.get_player(player_name, session) + return player_from_db + def get_designers(session: Session) -> list[people_classes.Designer]: designers_from_db = db_connection.get_all_designers(session) return designers_from_db diff --git a/src/modules/db_connection.py b/src/modules/db_connection.py index 413ba60..56a1f8d 100644 --- a/src/modules/db_connection.py +++ b/src/modules/db_connection.py @@ -123,6 +123,18 @@ def get_all_designers(session: Session) -> list[people_classes.Designer]: designers = results.all() return designers +def get_player(player_name: str, session: Session) -> player_classes.Player: + statement = statement = select(player_classes.Player).where(player_classes.Player.name == player_name) + results = session.exec(statement) + player = results.one_or_none() + return player + +def get_all_players(session: Session) -> list[player_classes.Player]: + statement = statement = select(player_classes.Player) + results = session.exec(statement) + players = results.all() + return players + def get_boardgame(session: Session, boardgame_id: int) -> boardgame_classes.BoardGame: statement = select(boardgame_classes.BoardGame).where(boardgame_classes.BoardGame.id == boardgame_id)