From bdb6b01765557a36a66a04cb1525259b08c08846 Mon Sep 17 00:00:00 2001 From: jubnl Date: Thu, 16 Apr 2026 20:54:35 +0200 Subject: [PATCH] fix(synology): paginate all three album sources past 100 albums and tighten targetUserId type - Extract _fetchAllSynologyAlbums helper that loops until the source is exhausted; listSynologyAlbums now uses it for personal, shared-out, and shared-with-me instead of a hard-capped single request of 100 - Make getSynologyAssetInfo targetUserId required (number, not number|undefined) to match every call site and eliminate an implicit any at the _requestSynologyApi boundary --- .../src/components/Memories/MemoriesPanel.tsx | 7 ++-- client/src/pages/JourneyDetailPage.tsx | 14 ++++--- server/src/db/migrations.ts | 5 +++ server/src/routes/memories/synology.ts | 9 +++-- server/src/routes/memories/unified.ts | 3 +- .../src/services/memories/synologyService.ts | 40 +++++++++++-------- server/src/types.ts | 1 + .../integration/memories-synology.test.ts | 20 +++++++--- 8 files changed, 63 insertions(+), 36 deletions(-) diff --git a/client/src/components/Memories/MemoriesPanel.tsx b/client/src/components/Memories/MemoriesPanel.tsx index 72c79f18..f2427ee6 100644 --- a/client/src/components/Memories/MemoriesPanel.tsx +++ b/client/src/components/Memories/MemoriesPanel.tsx @@ -85,7 +85,7 @@ export default function MemoriesPanel({ tripId, startDate, endDate }: MemoriesPa // Album linking const [showAlbumPicker, setShowAlbumPicker] = useState(false) - const [albums, setAlbums] = useState<{ id: string; albumName: string; assetCount: number }[]>([]) + const [albums, setAlbums] = useState<{ id: string; albumName: string; assetCount: number; passphrase?: string }[]>([]) const [albumsLoading, setAlbumsLoading] = useState(false) const [albumLinks, setAlbumLinks] = useState<{ id: number; provider: string; album_id: string; album_name: string; user_id: number; username: string; sync_enabled: number; last_synced_at: string | null }[]>([]) const [syncing, setSyncing] = useState(null) @@ -141,7 +141,7 @@ export default function MemoriesPanel({ tripId, startDate, endDate }: MemoriesPa await loadAlbums(selectedProvider) } - const linkAlbum = async (albumId: string, albumName: string) => { + const linkAlbum = async (albumId: string, albumName: string, passphrase?: string) => { if (!selectedProvider) { toast.error(t('memories.error.linkAlbum')) return @@ -152,6 +152,7 @@ export default function MemoriesPanel({ tripId, startDate, endDate }: MemoriesPa album_id: albumId, album_name: albumName, provider: selectedProvider, + ...(passphrase ? { passphrase } : {}), }) setShowAlbumPicker(false) await loadAlbumLinks() @@ -489,7 +490,7 @@ export default function MemoriesPanel({ tripId, startDate, endDate }: MemoriesPa {albums.map(album => { const isLinked = linkedIds.has(album.id) return ( -