Skip to content

Commit

Permalink
added files route
Browse files Browse the repository at this point in the history
  • Loading branch information
ychebyshev committed Feb 21, 2024
1 parent 0f2e7af commit 6ef0024
Show file tree
Hide file tree
Showing 4 changed files with 35 additions and 7 deletions.
18 changes: 17 additions & 1 deletion shvatka/api/routes/game.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
from typing import BinaryIO

from fastapi import APIRouter
from fastapi.params import Depends, Path

from shvatka.api.dependencies import dao_provider, player_provider, active_game_provider
from shvatka.api.models import responses
from shvatka.core.interfaces.clients.file_storage import FileGateway
from shvatka.core.models import dto
from shvatka.core.services.game import get_authors_games, get_completed_games, get_full_game
from shvatka.core.services.game import get_authors_games, get_completed_games, get_full_game, get_game
from shvatka.core.services.scenario.files import get_file_content
from shvatka.infrastructure.db.dao.holder import HolderDao


Expand Down Expand Up @@ -37,10 +41,22 @@ async def get_game_card(
return responses.FullGame.from_core(game)


async def get_game_file(
dao: HolderDao = Depends(dao_provider), # type: ignore[assignment]
player: dto.Player = Depends(player_provider), # type: ignore[assignment]
id_: int = Path(alias="id"), # type: ignore[assignment]
guid: str = Path(alias="guid"), # type: ignore[assignment]
file_gateway: FileGateway = Depends(),
) -> BinaryIO:
game = await get_game(id_, dao=dao.game)
return await get_file_content(guid, file_gateway, player, game, dao.file_info)


def setup() -> APIRouter:
router = APIRouter(prefix="/games")
router.add_api_route("", get_all_games, methods=["GET"])
router.add_api_route("/my", get_my_games_list, methods=["GET"])
router.add_api_route("/active", get_active_game, methods=["GET"])
router.add_api_route("/{id}", get_game_card, methods=["GET"])
router.add_api_route("/{id}/files/{guid}", get_game_card, methods=["GET"])
return router
6 changes: 2 additions & 4 deletions shvatka/core/interfaces/dal/complex.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from typing import Protocol

from shvatka.core.interfaces.dal.base import Committer
from shvatka.core.interfaces.dal.file_info import FileInfoGetter
from shvatka.core.interfaces.dal.game import (
MaxGameNumberGetter,
GameNumberUpdater,
Expand Down Expand Up @@ -44,9 +45,6 @@ class GameCompleter(
pass


class GamePackager(GameKeyGetter, LevelTimesGetter, GameWaiversGetter, Protocol):
class GamePackager(GameKeyGetter, LevelTimesGetter, GameWaiversGetter, FileInfoGetter, Protocol):
async def get_full(self, id_: int) -> dto.FullGame:
raise NotImplementedError

async def get_by_guid(self, guid: str) -> scn.VerifiableFileMeta:
raise NotImplementedError
6 changes: 6 additions & 0 deletions shvatka/core/interfaces/dal/file_info.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,14 @@
from typing import Protocol

from shvatka.core.models import dto
from shvatka.core.models.dto import scn


class FileInfoMerger(Protocol):
async def replace_file_info(self, primary: dto.Player, secondary: dto.Player) -> None:
raise NotImplementedError


class FileInfoGetter(Protocol):
async def get_by_guid(self, guid: str) -> scn.VerifiableFileMeta:
raise NotImplementedError
12 changes: 10 additions & 2 deletions shvatka/core/services/scenario/files.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import BinaryIO, Sequence

from shvatka.core.interfaces.clients.file_storage import FileGateway
from shvatka.core.interfaces.dal.complex import GamePackager
from shvatka.core.interfaces.dal.file_info import FileInfoGetter
from shvatka.core.interfaces.dal.game import GameUpserter
from shvatka.core.models import dto
from shvatka.core.models.dto import scn
Expand All @@ -24,7 +24,7 @@ async def upsert_files(


async def get_file_metas(
game: dto.FullGame, author: dto.Player, dao: GamePackager
game: dto.FullGame, author: dto.Player, dao: FileInfoGetter
) -> Sequence[scn.FileMeta]:
file_metas: list[scn.FileMeta] = []
for guid in game.get_guids():
Expand All @@ -44,6 +44,14 @@ async def get_file_contents(
return contents


async def get_file_content(
guid: str, file_gateway: FileGateway, author: dto.Player, game: dto.Game, dao: FileInfoGetter
) -> BinaryIO:
meta = await dao.get_by_guid(guid)
check_file_meta_can_read(author, meta, game)
return await file_gateway.get(meta)


def check_file_meta_can_read(
author: dto.Player, file_meta: scn.VerifiableFileMeta, game: dto.Game
):
Expand Down

0 comments on commit 6ef0024

Please sign in to comment.