From 92b23656aa003b7bbc171d9cb8c429635afadc07 Mon Sep 17 00:00:00 2001 From: Georges-Antoine Assi Date: Thu, 25 Jul 2024 13:49:43 -0400 Subject: [PATCH 1/2] start making collecitons public --- DEVELOPER_SETUP.md | 2 +- backend/handler/database/collections_handler.py | 4 +++- .../common/Collection/Dialog/EditCollection.vue | 11 +++++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/DEVELOPER_SETUP.md b/DEVELOPER_SETUP.md index 2302bea46..494b647ab 100644 --- a/DEVELOPER_SETUP.md +++ b/DEVELOPER_SETUP.md @@ -12,7 +12,7 @@ touch romm_mock/library/roms/switch/metroid.xci mkdir -p romm_mock/resources mkdir -p romm_mock/assets mkdir -p romm_mock/config -touch romm_mock/config.yml +touch romm_mock/config/config.yml ``` ### Setting up the backend diff --git a/backend/handler/database/collections_handler.py b/backend/handler/database/collections_handler.py index 2b82a55eb..e54e2a797 100644 --- a/backend/handler/database/collections_handler.py +++ b/backend/handler/database/collections_handler.py @@ -34,7 +34,9 @@ class DBCollectionsHandler(DBBaseHandler): return ( session.scalars( select(Collection) - .filter_by(user_id=user_id) + .where( + (Collection.user_id == user_id) | (Collection.is_public.is_(True)) + ) .order_by(Collection.name.asc()) ) # type: ignore[attr-defined] .unique() diff --git a/frontend/src/components/common/Collection/Dialog/EditCollection.vue b/frontend/src/components/common/Collection/Dialog/EditCollection.vue index d35abdbeb..d92b21027 100644 --- a/frontend/src/components/common/Collection/Dialog/EditCollection.vue +++ b/frontend/src/components/common/Collection/Dialog/EditCollection.vue @@ -130,6 +130,17 @@ function closeDialog() { /> + + + + + From ad3a588631f96b716161f8a0a7f35174f68c7b93 Mon Sep 17 00:00:00 2001 From: Georges-Antoine Assi Date: Thu, 25 Jul 2024 19:53:44 -0400 Subject: [PATCH 2/2] filter collections for each user --- backend/endpoints/collections.py | 6 ++++-- backend/endpoints/responses/collection.py | 11 +++++++++++ backend/endpoints/responses/rom.py | 16 ++++++++-------- backend/handler/database/collections_handler.py | 12 ++---------- backend/handler/database/roms_handler.py | 8 ++------ backend/models/rom.py | 4 ++-- frontend/src/services/api/collection.ts | 2 +- 7 files changed, 30 insertions(+), 29 deletions(-) diff --git a/backend/endpoints/collections.py b/backend/endpoints/collections.py index 78f6ab5b2..daecd32b5 100644 --- a/backend/endpoints/collections.py +++ b/backend/endpoints/collections.py @@ -100,7 +100,8 @@ def get_collections(request: Request) -> list[CollectionSchema]: list[CollectionSchema]: List of collections """ - return db_collection_handler.get_collections(user_id=request.user.id) + collections = db_collection_handler.get_collections() + return CollectionSchema.for_user(request.user.id, collections) @protected_route(router.get, "/collections/{id}", ["collections.read"]) @@ -128,6 +129,7 @@ async def update_collection( request: Request, id: int, remove_cover: bool = False, + is_public: bool | None = None, artwork: UploadFile | None = None, ) -> CollectionSchema: """Update collection endpoint @@ -159,8 +161,8 @@ async def update_collection( cleaned_data = { "name": data.get("name", collection.name), "description": data.get("description", collection.description), + "is_public": is_public if is_public is not None else collection.is_public, "roms": list(set(roms)), - "is_public": data.get("is_public", collection.is_public), "user_id": request.user.id, } diff --git a/backend/endpoints/responses/collection.py b/backend/endpoints/responses/collection.py index a78defb4e..0ad5be05a 100644 --- a/backend/endpoints/responses/collection.py +++ b/backend/endpoints/responses/collection.py @@ -1,5 +1,6 @@ from datetime import datetime +from models.collection import Collection from pydantic import BaseModel @@ -22,3 +23,13 @@ class CollectionSchema(BaseModel): class Config: from_attributes = True + + @classmethod + def for_user( + cls, user_id: int, collections: list["Collection"] + ) -> list["CollectionSchema"]: + return [ + cls.model_validate(c) + for c in collections + if c.user_id == user_id or c.is_public + ] diff --git a/backend/endpoints/responses/rom.py b/backend/endpoints/responses/rom.py index 81a35463b..ec8587729 100644 --- a/backend/endpoints/responses/rom.py +++ b/backend/endpoints/responses/rom.py @@ -44,7 +44,7 @@ class RomUserSchema(BaseModel): from_attributes = True @classmethod - def for_user(cls, db_rom: Rom, user_id: int) -> RomUserSchema | None: + def for_user(cls, user_id: int, db_rom: Rom) -> RomUserSchema | None: for n in db_rom.rom_users: if n.user_id == user_id: return cls.model_validate(n) @@ -52,7 +52,7 @@ class RomUserSchema(BaseModel): return None @classmethod - def notes_for_user(cls, db_rom: Rom, user_id: int) -> list[UserNotesSchema]: + def notes_for_user(cls, user_id: int, db_rom: Rom) -> list[UserNotesSchema]: return [ { "user_id": n.user_id, @@ -123,7 +123,7 @@ class RomSchema(BaseModel): rom = cls.model_validate(db_rom) user_id = request.user.id - rom.rom_user = RomUserSchema.for_user(db_rom, user_id) + rom.rom_user = RomUserSchema.for_user(user_id, db_rom) return rom @@ -155,8 +155,8 @@ class DetailedRomSchema(RomSchema): rom = cls.model_validate(db_rom) user_id = request.user.id - rom.rom_user = RomUserSchema.for_user(db_rom, user_id) - rom.user_notes = RomUserSchema.notes_for_user(db_rom, user_id) + rom.rom_user = RomUserSchema.for_user(user_id, db_rom) + rom.user_notes = RomUserSchema.notes_for_user(user_id, db_rom) rom.sibling_roms = [ RomSchema.model_validate(r) for r in db_rom.get_sibling_roms() ] @@ -171,9 +171,9 @@ class DetailedRomSchema(RomSchema): for s in db_rom.screenshots if s.user_id == user_id ] - rom.user_collections = [ - CollectionSchema.model_validate(c) for c in db_rom.get_collections(user_id) - ] + rom.user_collections = CollectionSchema.for_user( + user_id, db_rom.get_collections() + ) return rom diff --git a/backend/handler/database/collections_handler.py b/backend/handler/database/collections_handler.py index e54e2a797..8502673bb 100644 --- a/backend/handler/database/collections_handler.py +++ b/backend/handler/database/collections_handler.py @@ -28,17 +28,9 @@ class DBCollectionsHandler(DBBaseHandler): ) @begin_session - def get_collections( - self, user_id: int, session: Session = None - ) -> Select[tuple[Collection]]: + def get_collections(self, session: Session = None) -> Select[tuple[Collection]]: return ( - session.scalars( - select(Collection) - .where( - (Collection.user_id == user_id) | (Collection.is_public.is_(True)) - ) - .order_by(Collection.name.asc()) - ) # type: ignore[attr-defined] + session.scalars(select(Collection).order_by(Collection.name.asc())) # type: ignore[attr-defined] .unique() .all() ) diff --git a/backend/handler/database/roms_handler.py b/backend/handler/database/roms_handler.py index bb69cead2..f9acc12a0 100644 --- a/backend/handler/database/roms_handler.py +++ b/backend/handler/database/roms_handler.py @@ -181,16 +181,12 @@ class DBRomsHandler(DBBaseHandler): @begin_session def get_rom_collections( - self, rom: Rom, user_id: int, session: Session = None + self, rom: Rom, session: Session = None ) -> list[Collection]: - return ( session.scalars( select(Collection) - .filter( - func.json_contains(Collection.roms, f"{rom.id}"), - Collection.user_id == user_id, - ) + .filter(func.json_contains(Collection.roms, f"{rom.id}")) .order_by(Collection.name.asc()) ) .unique() diff --git a/backend/models/rom.py b/backend/models/rom.py index 0c1b4138f..06c8a3548 100644 --- a/backend/models/rom.py +++ b/backend/models/rom.py @@ -104,10 +104,10 @@ class Rom(BaseModel): return db_rom_handler.get_sibling_roms(self) - def get_collections(self, user_id) -> list[Collection]: + def get_collections(self) -> list[Collection]: from handler.database import db_rom_handler - return db_rom_handler.get_rom_collections(self, user_id) + return db_rom_handler.get_rom_collections(self) # Metadata fields @property diff --git a/frontend/src/services/api/collection.ts b/frontend/src/services/api/collection.ts index 1ee57285f..b30a96b31 100644 --- a/frontend/src/services/api/collection.ts +++ b/frontend/src/services/api/collection.ts @@ -47,7 +47,7 @@ async function updateCollection({ formData.append("roms", JSON.stringify(collection.roms)); if (collection.artwork) formData.append("artwork", collection.artwork); return api.put(`/collections/${collection.id}`, formData, { - params: { remove_cover: removeCover }, + params: { is_public: collection.is_public, remove_cover: removeCover }, }); }