diff --git a/apps/photos/src/services/collectionService.ts b/apps/photos/src/services/collectionService.ts index fff50682f..fe2a3d3f1 100644 --- a/apps/photos/src/services/collectionService.ts +++ b/apps/photos/src/services/collectionService.ts @@ -30,6 +30,7 @@ import { CollectionMagicMetadataProps, CollectionPublicMagicMetadata, RemoveFromCollectionRequest, + CollectionShareeMagicMetadata, } from 'types/collection'; import { COLLECTION_LIST_SORT_BY, @@ -139,12 +140,26 @@ const getCollectionWithSecrets = async ( }; } + let collectionShareeMagicMetadata: CollectionShareeMagicMetadata; + + if (collection.sharedMagicMetadata?.data) { + collectionShareeMagicMetadata = { + ...collection.sharedMagicMetadata, + data: await cryptoWorker.decryptMetadata( + collection.sharedMagicMetadata.data, + collection.sharedMagicMetadata.header, + collectionKey + ), + }; + } + return { ...collection, name: collectionName, key: collectionKey, magicMetadata: collectionMagicMetadata, pubMagicMetadata: collectionPublicMagicMetadata, + sharedMagicMetadata: collectionShareeMagicMetadata, }; }; @@ -359,6 +374,7 @@ const createCollection = async ( isDeleted: false, magicMetadata: encryptedMagicMetadata, pubMagicMetadata: null, + sharedMagicMetadata: null, }; const createdCollection = await postCollection(newCollection, token); const decryptedCreatedCollection = await getCollectionWithSecrets( @@ -738,6 +754,50 @@ export const updateCollectionMagicMetadata = async ( return updatedCollection; }; +export const updateSharedCollectionMagicMetadata = async ( + collection: Collection, + updatedMagicMetadata: CollectionMagicMetadata +) => { + const token = getToken(); + if (!token) { + return; + } + + const cryptoWorker = await ComlinkCryptoWorker.getInstance(); + + const { file: encryptedMagicMetadata } = await cryptoWorker.encryptMetadata( + updatedMagicMetadata.data, + collection.key + ); + + const reqBody: UpdateMagicMetadataRequest = { + id: collection.id, + magicMetadata: { + version: updatedMagicMetadata.version, + count: updatedMagicMetadata.count, + data: encryptedMagicMetadata.encryptedData, + header: encryptedMagicMetadata.decryptionHeader, + }, + }; + + await HTTPService.put( + `${ENDPOINT}/collections/sharee-magic-metadata`, + reqBody, + null, + { + 'X-Auth-Token': token, + } + ); + const updatedCollection: Collection = { + ...collection, + magicMetadata: { + ...updatedMagicMetadata, + version: updatedMagicMetadata.version + 1, + }, + }; + return updatedCollection; +}; + export const updatePublicCollectionMagicMetadata = async ( collection: Collection, updatedPublicMagicMetadata: CollectionPublicMagicMetadata diff --git a/apps/photos/src/utils/collection/index.ts b/apps/photos/src/utils/collection/index.ts index 70b8cad14..27402f586 100644 --- a/apps/photos/src/utils/collection/index.ts +++ b/apps/photos/src/utils/collection/index.ts @@ -8,6 +8,7 @@ import { unhideToCollection, updateCollectionMagicMetadata, updatePublicCollectionMagicMetadata, + updateSharedCollectionMagicMetadata, } from 'services/collectionService'; import { downloadFiles } from 'utils/file'; import { getLocalFiles, getLocalHiddenFiles } from 'services/fileService'; @@ -164,12 +165,30 @@ export const changeCollectionVisibility = async ( visibility, }; - const updatedMagicMetadata = await updateMagicMetadata( - updatedMagicMetadataProps, - collection.magicMetadata, - collection.key - ); - await updateCollectionMagicMetadata(collection, updatedMagicMetadata); + const user: User = getData(LS_KEYS.USER); + + if (collection.owner.id === user.id) { + const updatedMagicMetadata = await updateMagicMetadata( + updatedMagicMetadataProps, + collection.magicMetadata, + collection.key + ); + + await updateCollectionMagicMetadata( + collection, + updatedMagicMetadata + ); + } else { + const updatedMagicMetadata = await updateMagicMetadata( + updatedMagicMetadataProps, + collection.sharedMagicMetadata, + collection.key + ); + await updateSharedCollectionMagicMetadata( + collection, + updatedMagicMetadata + ); + } } catch (e) { logError(e, 'change collection visibility failed'); throw e;