From d6a64cadb8eb9c90505a3f5629696c60736ea4a8 Mon Sep 17 00:00:00 2001 From: Alexander Brown <448862+DrJKL@users.noreply.github.com> Date: Fri, 16 Jan 2026 14:12:27 -0800 Subject: [PATCH] feat(assetsStore): add updateAssetMetadata with optimistic cache update --- .../assets/components/AssetBrowserModal.vue | 2 +- .../components/modelInfo/ModelInfoPanel.vue | 24 +++++++- src/stores/assetsStore.ts | 57 +++++++++++++++++-- 3 files changed, 77 insertions(+), 6 deletions(-) diff --git a/src/platform/assets/components/AssetBrowserModal.vue b/src/platform/assets/components/AssetBrowserModal.vue index 7f417f46e7..01e03782ba 100644 --- a/src/platform/assets/components/AssetBrowserModal.vue +++ b/src/platform/assets/components/AssetBrowserModal.vue @@ -68,7 +68,7 @@ diff --git a/src/platform/assets/components/modelInfo/ModelInfoPanel.vue b/src/platform/assets/components/modelInfo/ModelInfoPanel.vue index a073f1a6ee..2800394c5f 100644 --- a/src/platform/assets/components/modelInfo/ModelInfoPanel.vue +++ b/src/platform/assets/components/modelInfo/ModelInfoPanel.vue @@ -130,6 +130,7 @@ diff --git a/src/stores/assetsStore.ts b/src/stores/assetsStore.ts index a387aea7d3..369b842667 100644 --- a/src/stores/assetsStore.ts +++ b/src/stores/assetsStore.ts @@ -339,12 +339,58 @@ export const useAssetsStore = defineStore('assets', () => { return updateModelsForKey(key, () => assetService.getAssetsByTag(tag)) } + /** + * Optimistically update an asset in the cache + * @param assetId The asset ID to update + * @param updates Partial asset data to merge + * @param cacheKey Optional cache key to target (nodeType or 'tag:xxx') + */ + function updateAssetInCache( + assetId: string, + updates: Partial, + cacheKey?: string + ) { + const keysToCheck = cacheKey + ? [cacheKey] + : Array.from(modelAssetsByNodeType.keys()) + + for (const key of keysToCheck) { + const assets = modelAssetsByNodeType.get(key) + if (!assets) continue + + const index = assets.findIndex((a) => a.id === assetId) + if (index !== -1) { + const updatedAsset = { ...assets[index], ...updates } + const newAssets = [...assets] + newAssets[index] = updatedAsset + modelAssetsByNodeType.set(key, newAssets) + if (cacheKey) return + } + } + } + + /** + * Update asset metadata with optimistic cache update + * @param assetId The asset ID to update + * @param userMetadata The user_metadata to save + * @param cacheKey Optional cache key to target for optimistic update + */ + async function updateAssetMetadata( + assetId: string, + userMetadata: Record, + cacheKey?: string + ) { + updateAssetInCache(assetId, { user_metadata: userMetadata }, cacheKey) + await assetService.updateAsset(assetId, { user_metadata: userMetadata }) + } + return { modelAssetsByNodeType, modelLoadingByNodeType, modelErrorByNodeType, updateModelsForNodeType, - updateModelsForTag + updateModelsForTag, + updateAssetMetadata } } @@ -353,7 +399,8 @@ export const useAssetsStore = defineStore('assets', () => { modelLoadingByNodeType: shallowReactive(new Map()), modelErrorByNodeType: shallowReactive(new Map()), updateModelsForNodeType: async () => [], - updateModelsForTag: async () => [] + updateModelsForTag: async () => [], + updateAssetMetadata: async () => {} } } @@ -362,7 +409,8 @@ export const useAssetsStore = defineStore('assets', () => { modelLoadingByNodeType, modelErrorByNodeType, updateModelsForNodeType, - updateModelsForTag + updateModelsForTag, + updateAssetMetadata } = getModelState() // Watch for completed downloads and refresh model caches @@ -427,6 +475,7 @@ export const useAssetsStore = defineStore('assets', () => { modelLoadingByNodeType, modelErrorByNodeType, updateModelsForNodeType, - updateModelsForTag + updateModelsForTag, + updateAssetMetadata } })