feat: unlock in-game galleries per owned version
This commit is contained in:
1 parent
e14184435c
commit
19924e1c5a
21 files changed
+977
-395
No files matched your search
@@ -8,6 +8,7 @@ from starlette.concurrency import run_in_threadpool
|
||||
|
||||
from app.blobs import blob_path, put_bytes
|
||||
from app.deps import DB, CurrentUser, has_perm, require
|
||||
from app.gallery import available as gallery_available
|
||||
from app.models import Game, GameVersion, User
|
||||
from app.schemas import GameDetailOut, GameIn, GameOut, GameUpdateIn, VersionOut
|
||||
from app.translation import version_languages
|
||||
@@ -114,7 +115,8 @@ async def game_detail(game_id: int, user: Player, db: DB) -> dict:
|
||||
)
|
||||
).all()
|
||||
return {**GameOut.model_validate(game).model_dump(),
|
||||
"versions": [{**VersionOut.model_validate(v).model_dump(), **version_languages(v.manifest)}
|
||||
"versions": [{**VersionOut.model_validate(v).model_dump(), **version_languages(v.manifest),
|
||||
"gallery_available": gallery_available(v.manifest)}
|
||||
for v in versions]}
|
||||
|
||||
|
||||
|
||||
@@ -8,10 +8,12 @@ from starlette.requests import ClientDisconnect
|
||||
|
||||
from app import translation
|
||||
from app.deps import DB, CurrentUser, has_perm, require
|
||||
from app.gallery import available as gallery_available
|
||||
from app.models import Game, GameVersion, Revision, Save, User, VersionHistory
|
||||
from app.routers.games import get_game
|
||||
from app.schemas import (
|
||||
ForkIn,
|
||||
GallerySettingsIn,
|
||||
HistoryOut,
|
||||
PublishIn,
|
||||
SaveDetailOut,
|
||||
@@ -108,8 +110,10 @@ async def upload_version(
|
||||
|
||||
|
||||
@router.get("/versions/{version_id}", response_model=VersionDetailOut)
|
||||
async def version_detail(version_id: int, user: Player, db: DB) -> GameVersion:
|
||||
return await get_version(db, user, version_id)
|
||||
async def version_detail(version_id: int, user: Player, db: DB) -> dict[str, Any]:
|
||||
v = await get_version(db, user, version_id)
|
||||
return {**VersionDetailOut.model_validate(v).model_dump(),
|
||||
"gallery_available": await run_in_threadpool(gallery_available, v.manifest)}
|
||||
|
||||
|
||||
@router.get("/versions/{version_id}/manifest")
|
||||
@@ -117,7 +121,7 @@ async def version_manifest(version_id: int, user: Player, db: DB) -> dict[str, A
|
||||
v = await get_version(db, user, version_id)
|
||||
if v.status != "ready" or not v.manifest:
|
||||
raise HTTPException(status.HTTP_409_CONFLICT, "Версия ещё не готова")
|
||||
return {**v.manifest, "revision": v.revision_id, "versionId": v.id}
|
||||
return {**v.manifest, "revision": v.revision_id, "versionId": v.id, "galleryUnlocked": v.gallery_unlocked}
|
||||
|
||||
|
||||
@router.post("/versions/{version_id}/fork", response_model=VersionOut, status_code=201)
|
||||
@@ -139,6 +143,7 @@ async def fork_version(version_id: int, body: ForkIn,
|
||||
status="ready",
|
||||
visibility="draft",
|
||||
kind=body.kind,
|
||||
gallery_unlocked=parent.gallery_unlocked,
|
||||
manifest=parent.manifest,
|
||||
base_revision_id=parent.revision_id,
|
||||
report=parent.report,
|
||||
@@ -243,6 +248,20 @@ async def update_version(version_id: int, body: VersionIn, user: CurrentUser, db
|
||||
return v
|
||||
|
||||
|
||||
@router.patch("/versions/{version_id}/gallery", response_model=VersionOut)
|
||||
async def update_gallery(version_id: int, body: GallerySettingsIn, user: Player, db: DB) -> GameVersion:
|
||||
v = await get_version(db, user, version_id)
|
||||
if v.owner_id != user.id:
|
||||
raise HTTPException(403, "Открыть галерею можно только в своей версии")
|
||||
if v.status != "ready":
|
||||
raise HTTPException(409, "Версия ещё не готова")
|
||||
if body.gallery_unlocked and not await run_in_threadpool(gallery_available, v.manifest):
|
||||
raise HTTPException(422, "Галерея этой игры пока не поддерживается")
|
||||
v.gallery_unlocked = body.gallery_unlocked
|
||||
await db.commit()
|
||||
return v
|
||||
|
||||
|
||||
@router.post("/versions/{version_id}/retry", response_model=VersionOut)
|
||||
async def retry_version(version_id: int, user: CurrentUser, db: DB) -> GameVersion:
|
||||
v = await get_version(db, user, version_id)
|
||||
|
||||
Reference in new issue
Block a user