From c6e9ce5bbdf0f1bc7d5f57f79b5ff8eebd2cb7eb Mon Sep 17 00:00:00 2001 From: Georges-Antoine Assi Date: Sun, 8 Feb 2026 09:52:55 -0500 Subject: [PATCH 1/3] filter out non-owned collections when adding --- backend/endpoints/responses/collection.py | 4 ++-- backend/endpoints/responses/rom.py | 2 -- backend/models/collection.py | 4 ++-- backend/models/rom.py | 8 ------- frontend/src/__generated__/index.ts | 11 ++++++++++ ...download_api_saves__id__downloaded_post.ts | 8 +++++++ ...dy_track_save_api_saves__id__track_post.ts | 8 +++++++ ...ntrack_save_api_saves__id__untrack_post.ts | 8 +++++++ .../__generated__/models/CollectionSchema.ts | 3 ++- .../models/DeviceCreatePayload.ts | 17 ++++++++++++++ .../models/DeviceCreateResponse.ts | 10 +++++++++ .../src/__generated__/models/DeviceSchema.ts | 22 +++++++++++++++++++ .../__generated__/models/DeviceSyncSchema.ts | 12 ++++++++++ .../models/DeviceUpdatePayload.ts | 15 +++++++++++++ .../__generated__/models/RomFileCategory.ts | 2 +- .../src/__generated__/models/RomUserSchema.ts | 1 - .../src/__generated__/models/SaveSchema.ts | 4 ++++ .../__generated__/models/SaveSummarySchema.ts | 10 +++++++++ .../__generated__/models/SlotSummarySchema.ts | 11 ++++++++++ .../models/SmartCollectionSchema.ts | 3 ++- frontend/src/__generated__/models/SyncMode.ts | 5 +++++ .../Collection/CollectionInfoDrawer.vue | 6 ++--- .../Collection/SmartCollectionInfoDrawer.vue | 6 ++--- .../common/Collection/Dialog/AddRoms.vue | 2 +- frontend/src/stores/collections.ts | 5 +++++ 25 files changed, 162 insertions(+), 25 deletions(-) create mode 100644 frontend/src/__generated__/models/Body_confirm_download_api_saves__id__downloaded_post.ts create mode 100644 frontend/src/__generated__/models/Body_track_save_api_saves__id__track_post.ts create mode 100644 frontend/src/__generated__/models/Body_untrack_save_api_saves__id__untrack_post.ts create mode 100644 frontend/src/__generated__/models/DeviceCreatePayload.ts create mode 100644 frontend/src/__generated__/models/DeviceCreateResponse.ts create mode 100644 frontend/src/__generated__/models/DeviceSchema.ts create mode 100644 frontend/src/__generated__/models/DeviceSyncSchema.ts create mode 100644 frontend/src/__generated__/models/DeviceUpdatePayload.ts create mode 100644 frontend/src/__generated__/models/SaveSummarySchema.ts create mode 100644 frontend/src/__generated__/models/SlotSummarySchema.ts create mode 100644 frontend/src/__generated__/models/SyncMode.ts diff --git a/backend/endpoints/responses/collection.py b/backend/endpoints/responses/collection.py index 4b5c2fc01..1f1596664 100644 --- a/backend/endpoints/responses/collection.py +++ b/backend/endpoints/responses/collection.py @@ -28,7 +28,7 @@ class CollectionSchema(BaseCollectionSchema): id: int url_cover: str | None user_id: int - user__username: str + owner_username: str class Config: from_attributes = True @@ -60,7 +60,7 @@ class SmartCollectionSchema(BaseCollectionSchema): filter_criteria: dict[str, Any] filter_summary: str user_id: int - user__username: str + owner_username: str is_smart: bool = True class Config: diff --git a/backend/endpoints/responses/rom.py b/backend/endpoints/responses/rom.py index 143551787..c3e236a3c 100644 --- a/backend/endpoints/responses/rom.py +++ b/backend/endpoints/responses/rom.py @@ -117,7 +117,6 @@ def rom_user_schema_factory() -> RomUserSchema: difficulty=0, completion=0, status=None, - user__username="", ) @@ -136,7 +135,6 @@ class RomUserSchema(BaseModel): difficulty: int completion: int status: RomUserStatus | None - user__username: str class Config: from_attributes = True diff --git a/backend/models/collection.py b/backend/models/collection.py index 1bf4df450..02015fc19 100644 --- a/backend/models/collection.py +++ b/backend/models/collection.py @@ -43,7 +43,7 @@ class Collection(BaseModel): user: Mapped["User"] = relationship(lazy="joined", back_populates="collections") @property - def user__username(self) -> str: + def owner_username(self) -> str: return self.user.username @property @@ -228,7 +228,7 @@ class SmartCollection(BaseModel): ) @property - def user__username(self) -> str: + def owner_username(self) -> str: return self.user.username @property diff --git a/backend/models/rom.py b/backend/models/rom.py index acb9ac647..fb0dcdd9e 100644 --- a/backend/models/rom.py +++ b/backend/models/rom.py @@ -472,10 +472,6 @@ class RomNote(BaseModel): rom: Mapped[Rom] = relationship(lazy="joined", back_populates="notes") user: Mapped[User] = relationship(lazy="joined", back_populates="notes") - @property - def user__username(self) -> str: - return self.user.username - class RomUser(BaseModel): __tablename__ = "rom_user" @@ -503,7 +499,3 @@ class RomUser(BaseModel): rom: Mapped[Rom] = relationship(lazy="joined", back_populates="rom_users") user: Mapped[User] = relationship(lazy="joined", back_populates="rom_users") - - @property - def user__username(self) -> str: - return self.user.username diff --git a/frontend/src/__generated__/index.ts b/frontend/src/__generated__/index.ts index baabd29be..ceb7bf2ef 100644 --- a/frontend/src/__generated__/index.ts +++ b/frontend/src/__generated__/index.ts @@ -8,6 +8,7 @@ export type { Body_add_collection_api_collections_post } from './models/Body_add export type { Body_add_firmware_api_firmware_post } from './models/Body_add_firmware_api_firmware_post'; export type { Body_add_platform_api_platforms_post } from './models/Body_add_platform_api_platforms_post'; export type { Body_add_user_api_users_post } from './models/Body_add_user_api_users_post'; +export type { Body_confirm_download_api_saves__id__downloaded_post } from './models/Body_confirm_download_api_saves__id__downloaded_post'; export type { Body_create_user_from_invite_api_users_register_post } from './models/Body_create_user_from_invite_api_users_register_post'; export type { Body_delete_firmware_api_firmware_delete_post } from './models/Body_delete_firmware_api_firmware_delete_post'; export type { Body_delete_roms_api_roms_delete_post } from './models/Body_delete_roms_api_roms_delete_post'; @@ -17,6 +18,8 @@ export type { Body_refresh_retro_achievements_api_users__id__ra_refresh_post } f export type { Body_request_password_reset_api_forgot_password_post } from './models/Body_request_password_reset_api_forgot_password_post'; export type { Body_reset_password_api_reset_password_post } from './models/Body_reset_password_api_reset_password_post'; export type { Body_token_api_token_post } from './models/Body_token_api_token_post'; +export type { Body_track_save_api_saves__id__track_post } from './models/Body_track_save_api_saves__id__track_post'; +export type { Body_untrack_save_api_saves__id__untrack_post } from './models/Body_untrack_save_api_saves__id__untrack_post'; export type { Body_update_collection_api_collections__id__put } from './models/Body_update_collection_api_collections__id__put'; export type { Body_update_platform_api_platforms__id__put } from './models/Body_update_platform_api_platforms__id__put'; export type { Body_update_rom_api_roms__id__put } from './models/Body_update_rom_api_roms__id__put'; @@ -32,6 +35,11 @@ export type { ConversionTaskMeta } from './models/ConversionTaskMeta'; export type { ConversionTaskStatusResponse } from './models/ConversionTaskStatusResponse'; export type { CustomLimitOffsetPage_SimpleRomSchema_ } from './models/CustomLimitOffsetPage_SimpleRomSchema_'; export type { DetailedRomSchema } from './models/DetailedRomSchema'; +export type { DeviceCreatePayload } from './models/DeviceCreatePayload'; +export type { DeviceCreateResponse } from './models/DeviceCreateResponse'; +export type { DeviceSchema } from './models/DeviceSchema'; +export type { DeviceSyncSchema } from './models/DeviceSyncSchema'; +export type { DeviceUpdatePayload } from './models/DeviceUpdatePayload'; export type { EarnedAchievement } from './models/EarnedAchievement'; export type { EjsControls } from './models/EjsControls'; export type { EjsControlsButton } from './models/EjsControlsButton'; @@ -77,6 +85,7 @@ export type { RomUserSchema } from './models/RomUserSchema'; export type { RomUserStatus } from './models/RomUserStatus'; export type { RoomsResponse } from './models/RoomsResponse'; export type { SaveSchema } from './models/SaveSchema'; +export type { SaveSummarySchema } from './models/SaveSummarySchema'; export type { ScanStats } from './models/ScanStats'; export type { ScanTaskMeta } from './models/ScanTaskMeta'; export type { ScanTaskStatusResponse } from './models/ScanTaskStatusResponse'; @@ -86,9 +95,11 @@ export type { SearchRomSchema } from './models/SearchRomSchema'; export type { SGDBResource } from './models/SGDBResource'; export type { SiblingRomSchema } from './models/SiblingRomSchema'; export type { SimpleRomSchema } from './models/SimpleRomSchema'; +export type { SlotSummarySchema } from './models/SlotSummarySchema'; export type { SmartCollectionSchema } from './models/SmartCollectionSchema'; export type { StateSchema } from './models/StateSchema'; export type { StatsReturn } from './models/StatsReturn'; +export type { SyncMode } from './models/SyncMode'; export type { SystemDict } from './models/SystemDict'; export type { TaskExecutionResponse } from './models/TaskExecutionResponse'; export type { TaskInfo } from './models/TaskInfo'; diff --git a/frontend/src/__generated__/models/Body_confirm_download_api_saves__id__downloaded_post.ts b/frontend/src/__generated__/models/Body_confirm_download_api_saves__id__downloaded_post.ts new file mode 100644 index 000000000..7e0d6f501 --- /dev/null +++ b/frontend/src/__generated__/models/Body_confirm_download_api_saves__id__downloaded_post.ts @@ -0,0 +1,8 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type Body_confirm_download_api_saves__id__downloaded_post = { + device_id: string; +}; + diff --git a/frontend/src/__generated__/models/Body_track_save_api_saves__id__track_post.ts b/frontend/src/__generated__/models/Body_track_save_api_saves__id__track_post.ts new file mode 100644 index 000000000..265e7936f --- /dev/null +++ b/frontend/src/__generated__/models/Body_track_save_api_saves__id__track_post.ts @@ -0,0 +1,8 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type Body_track_save_api_saves__id__track_post = { + device_id: string; +}; + diff --git a/frontend/src/__generated__/models/Body_untrack_save_api_saves__id__untrack_post.ts b/frontend/src/__generated__/models/Body_untrack_save_api_saves__id__untrack_post.ts new file mode 100644 index 000000000..61f3d6016 --- /dev/null +++ b/frontend/src/__generated__/models/Body_untrack_save_api_saves__id__untrack_post.ts @@ -0,0 +1,8 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type Body_untrack_save_api_saves__id__untrack_post = { + device_id: string; +}; + diff --git a/frontend/src/__generated__/models/CollectionSchema.ts b/frontend/src/__generated__/models/CollectionSchema.ts index e589ec7c3..f6567ff5f 100644 --- a/frontend/src/__generated__/models/CollectionSchema.ts +++ b/frontend/src/__generated__/models/CollectionSchema.ts @@ -20,6 +20,7 @@ export type CollectionSchema = { id: number; url_cover: (string | null); user_id: number; - user__username: string; + owner_username: string; + owned_by_current_user: boolean; }; diff --git a/frontend/src/__generated__/models/DeviceCreatePayload.ts b/frontend/src/__generated__/models/DeviceCreatePayload.ts new file mode 100644 index 000000000..f6b9a7324 --- /dev/null +++ b/frontend/src/__generated__/models/DeviceCreatePayload.ts @@ -0,0 +1,17 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type DeviceCreatePayload = { + name?: (string | null); + platform?: (string | null); + client?: (string | null); + client_version?: (string | null); + ip_address?: (string | null); + mac_address?: (string | null); + hostname?: (string | null); + allow_existing?: boolean; + allow_duplicate?: boolean; + reset_syncs?: boolean; +}; + diff --git a/frontend/src/__generated__/models/DeviceCreateResponse.ts b/frontend/src/__generated__/models/DeviceCreateResponse.ts new file mode 100644 index 000000000..599d70e8d --- /dev/null +++ b/frontend/src/__generated__/models/DeviceCreateResponse.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type DeviceCreateResponse = { + device_id: string; + name: (string | null); + created_at: string; +}; + diff --git a/frontend/src/__generated__/models/DeviceSchema.ts b/frontend/src/__generated__/models/DeviceSchema.ts new file mode 100644 index 000000000..c85043970 --- /dev/null +++ b/frontend/src/__generated__/models/DeviceSchema.ts @@ -0,0 +1,22 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { SyncMode } from './SyncMode'; +export type DeviceSchema = { + id: string; + user_id: number; + name: (string | null); + platform: (string | null); + client: (string | null); + client_version: (string | null); + ip_address: (string | null); + mac_address: (string | null); + hostname: (string | null); + sync_mode: SyncMode; + sync_enabled: boolean; + last_seen: (string | null); + created_at: string; + updated_at: string; +}; + diff --git a/frontend/src/__generated__/models/DeviceSyncSchema.ts b/frontend/src/__generated__/models/DeviceSyncSchema.ts new file mode 100644 index 000000000..fcf527273 --- /dev/null +++ b/frontend/src/__generated__/models/DeviceSyncSchema.ts @@ -0,0 +1,12 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type DeviceSyncSchema = { + device_id: string; + device_name: (string | null); + last_synced_at: string; + is_untracked: boolean; + is_current: boolean; +}; + diff --git a/frontend/src/__generated__/models/DeviceUpdatePayload.ts b/frontend/src/__generated__/models/DeviceUpdatePayload.ts new file mode 100644 index 000000000..4b1ae22a0 --- /dev/null +++ b/frontend/src/__generated__/models/DeviceUpdatePayload.ts @@ -0,0 +1,15 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type DeviceUpdatePayload = { + name?: (string | null); + platform?: (string | null); + client?: (string | null); + client_version?: (string | null); + ip_address?: (string | null); + mac_address?: (string | null); + hostname?: (string | null); + sync_enabled?: (boolean | null); +}; + diff --git a/frontend/src/__generated__/models/RomFileCategory.ts b/frontend/src/__generated__/models/RomFileCategory.ts index d132f180d..b84d418c1 100644 --- a/frontend/src/__generated__/models/RomFileCategory.ts +++ b/frontend/src/__generated__/models/RomFileCategory.ts @@ -2,4 +2,4 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ -export type RomFileCategory = 'game' | 'dlc' | 'hack' | 'manual' | 'patch' | 'update' | 'mod' | 'demo' | 'translation' | 'prototype'; +export type RomFileCategory = 'game' | 'dlc' | 'hack' | 'manual' | 'patch' | 'update' | 'mod' | 'demo' | 'translation' | 'prototype' | 'cheat'; diff --git a/frontend/src/__generated__/models/RomUserSchema.ts b/frontend/src/__generated__/models/RomUserSchema.ts index 7e58f7369..edaa1b55e 100644 --- a/frontend/src/__generated__/models/RomUserSchema.ts +++ b/frontend/src/__generated__/models/RomUserSchema.ts @@ -18,6 +18,5 @@ export type RomUserSchema = { difficulty: number; completion: number; status: (RomUserStatus | null); - user__username: string; }; diff --git a/frontend/src/__generated__/models/SaveSchema.ts b/frontend/src/__generated__/models/SaveSchema.ts index 2959ab6b1..a440b1e8a 100644 --- a/frontend/src/__generated__/models/SaveSchema.ts +++ b/frontend/src/__generated__/models/SaveSchema.ts @@ -2,6 +2,7 @@ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ +import type { DeviceSyncSchema } from './DeviceSyncSchema'; import type { ScreenshotSchema } from './ScreenshotSchema'; export type SaveSchema = { id: number; @@ -19,6 +20,9 @@ export type SaveSchema = { created_at: string; updated_at: string; emulator: (string | null); + slot?: (string | null); + content_hash?: (string | null); screenshot: (ScreenshotSchema | null); + device_syncs?: Array; }; diff --git a/frontend/src/__generated__/models/SaveSummarySchema.ts b/frontend/src/__generated__/models/SaveSummarySchema.ts new file mode 100644 index 000000000..7e12b0850 --- /dev/null +++ b/frontend/src/__generated__/models/SaveSummarySchema.ts @@ -0,0 +1,10 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { SlotSummarySchema } from './SlotSummarySchema'; +export type SaveSummarySchema = { + total_count: number; + slots: Array; +}; + diff --git a/frontend/src/__generated__/models/SlotSummarySchema.ts b/frontend/src/__generated__/models/SlotSummarySchema.ts new file mode 100644 index 000000000..381031e9e --- /dev/null +++ b/frontend/src/__generated__/models/SlotSummarySchema.ts @@ -0,0 +1,11 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { SaveSchema } from './SaveSchema'; +export type SlotSummarySchema = { + slot: (string | null); + count: number; + latest: SaveSchema; +}; + diff --git a/frontend/src/__generated__/models/SmartCollectionSchema.ts b/frontend/src/__generated__/models/SmartCollectionSchema.ts index ba1845f3a..268b7b9cd 100644 --- a/frontend/src/__generated__/models/SmartCollectionSchema.ts +++ b/frontend/src/__generated__/models/SmartCollectionSchema.ts @@ -21,6 +21,7 @@ export type SmartCollectionSchema = { filter_criteria: Record; filter_summary: string; user_id: number; - user__username: string; + owner_username: string; + owned_by_current_user: boolean; }; diff --git a/frontend/src/__generated__/models/SyncMode.ts b/frontend/src/__generated__/models/SyncMode.ts new file mode 100644 index 000000000..d2193fae2 --- /dev/null +++ b/frontend/src/__generated__/models/SyncMode.ts @@ -0,0 +1,5 @@ +/* generated using openapi-typescript-codegen -- do not edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +export type SyncMode = 'api' | 'file_transfer' | 'push_pull'; diff --git a/frontend/src/components/Gallery/AppBar/Collection/CollectionInfoDrawer.vue b/frontend/src/components/Gallery/AppBar/Collection/CollectionInfoDrawer.vue index 702d8368c..630572830 100644 --- a/frontend/src/components/Gallery/AppBar/Collection/CollectionInfoDrawer.vue +++ b/frontend/src/components/Gallery/AppBar/Collection/CollectionInfoDrawer.vue @@ -36,7 +36,7 @@ const collectionInfoFields = [ label: "Roms", }, { - key: "user__username", + key: "owner_username", label: t("collection.owner"), }, ]; @@ -146,7 +146,7 @@ async function updateCollection() {