From 2b342480a85d6aff7b92b53b87d1d78445c8e2d5 Mon Sep 17 00:00:00 2001 From: Mitchell McCaffrey Date: Fri, 30 Apr 2021 14:05:12 +1000 Subject: [PATCH] Migrate import/export to asset model --- src/modals/ImportExportModal.js | 56 +++++++++++++++++++++++++++++---- src/workers/DatabaseWorker.js | 35 +++++++++++++++++---- 2 files changed, 79 insertions(+), 12 deletions(-) diff --git a/src/modals/ImportExportModal.js b/src/modals/ImportExportModal.js index b6e083c..f0b265c 100644 --- a/src/modals/ImportExportModal.js +++ b/src/modals/ImportExportModal.js @@ -3,6 +3,7 @@ import { Box, Label, Text, Button, Flex } from "theme-ui"; import { saveAs } from "file-saver"; import * as Comlink from "comlink"; import shortid from "shortid"; +import { v4 as uuid } from "uuid"; import { useToasts } from "react-toast-notifications"; import Modal from "../components/Modal"; @@ -132,15 +133,29 @@ function ImportExportModal({ isOpen, onRequestClose }) { try { // Keep track of a mapping of old token ids to new ones to apply them to the map states let newTokenIds = {}; + // Mapping of old asset ids to new asset ids + let newAssetIds = {}; if (checkedTokens.length > 0) { const tokenIds = checkedTokens.map((token) => token.id); const tokensToAdd = await importDB.table("tokens").bulkGet(tokenIds); let newTokens = []; for (let token of tokensToAdd) { - const newId = shortid.generate(); + // Generate new ids + const newId = uuid(); newTokenIds[token.id] = newId; - // Generate new id and change owner - newTokens.push({ ...token, id: newId, owner: userId }); + const newFileId = uuid(); + const newThumbnailId = uuid(); + newAssetIds[token.file] = newFileId; + newAssetIds[token.thumbnail] = newThumbnailId; + + // Change ids and owner + newTokens.push({ + ...token, + id: newId, + owner: userId, + file: newFileId, + thumbnail: newThumbnailId, + }); } await db.table("tokens").bulkAdd(newTokens); } @@ -158,15 +173,44 @@ function ImportExportModal({ isOpen, onRequestClose }) { state.tokens[tokenState.id].tokenId = newTokenIds[tokenState.tokenId]; } + if (tokenState.type === "file" && tokenState.file in newAssetIds) { + state.tokens[tokenState.id].file = newAssetIds[tokenState.file]; + } } - const newId = shortid.generate(); - // Generate new id and change owner - newMaps.push({ ...map, id: newId, owner: userId }); + // Generate new ids + const newId = uuid(); + const newFileId = uuid(); + const newThumbnailId = uuid(); + newAssetIds[map.file] = newFileId; + newAssetIds[map.thumbnail] = newThumbnailId; + const newResolutionIds = {}; + for (let res of Object.keys(map.resolutions)) { + newResolutionIds[res] = uuid(); + newAssetIds[map.resolutions[res]] = newResolutionIds[res]; + } + // Change ids and owner + newMaps.push({ + ...map, + id: newId, + owner: userId, + file: newFileId, + thumbnail: newThumbnailId, + resolutions: newResolutionIds, + }); newStates.push({ ...state, mapId: newId }); } await db.table("maps").bulkAdd(newMaps); await db.table("states").bulkAdd(newStates); } + // Add assets with new ids + const assetsToAdd = await importDB + .table("assets") + .bulkGet(Object.keys(newAssetIds)); + let assets = []; + for (let asset of assetsToAdd) { + assets.push({ ...asset, id: newAssetIds[asset.id] }); + } + await db.table("assets").bulkAdd(assets); addSuccessToast("Imported", checkedMaps, checkedTokens); } catch (e) { console.error(e); diff --git a/src/workers/DatabaseWorker.js b/src/workers/DatabaseWorker.js index 6c611f8..b196fee 100644 --- a/src/workers/DatabaseWorker.js +++ b/src/workers/DatabaseWorker.js @@ -58,21 +58,44 @@ let service = { /** * Export current database * @param {function} progressCallback - * @param {string[]} maps An array of map ids to export - * @param {string[]} tokens An array of token ids to export + * @param {string[]} mapIds An array of map ids to export + * @param {string[]} tokenIds An array of token ids to export */ - async exportData(progressCallback, maps, tokens) { + async exportData(progressCallback, mapIds, tokenIds) { let db = getDatabase({}); + // Add assets for selected maps and tokens + const maps = await db.table("maps").where("id").anyOf(mapIds).toArray(); + const tokens = await db + .table("tokens") + .where("id") + .anyOf(tokenIds) + .toArray(); + const assetIds = []; + for (let map of maps) { + assetIds.push(map.file); + assetIds.push(map.thumbnail); + for (let res of Object.values(map.resolutions)) { + assetIds.push(res); + } + } + for (let token of tokens) { + assetIds.push(token.file); + assetIds.push(token.thumbnail); + } + const filter = (table, value) => { if (table === "maps") { - return maps.includes(value.id); + return mapIds.includes(value.id); } if (table === "states") { - return maps.includes(value.mapId); + return mapIds.includes(value.mapId); } if (table === "tokens") { - return tokens.includes(value.id); + return tokenIds.includes(value.id); + } + if (table === "assets") { + return assetIds.includes(value.id); } return false; };