From a3ecc8c79e74c689524e5b0e2f7e9666f3a97fe5 Mon Sep 17 00:00:00 2001
From: Jono Wenger <jono@elixxir.io>
Date: Thu, 20 Oct 2022 14:43:18 -0700
Subject: [PATCH] Add list to local storage that tracks indexedDb database
 names

---
 indexedDb/init.go           |  8 ++++++
 utils/indexedDbList.go      | 53 +++++++++++++++++++++++++++++++++++++
 utils/indexedDbList_test.go | 38 ++++++++++++++++++++++++++
 3 files changed, 99 insertions(+)
 create mode 100644 utils/indexedDbList.go
 create mode 100644 utils/indexedDbList_test.go

diff --git a/indexedDb/init.go b/indexedDb/init.go
index 3b8357ec..bed5ea75 100644
--- a/indexedDb/init.go
+++ b/indexedDb/init.go
@@ -10,6 +10,7 @@
 package indexedDb
 
 import (
+	"gitlab.com/elixxir/xxdk-wasm/utils"
 	"syscall/js"
 
 	"github.com/hack-pad/go-indexeddb/idb"
@@ -143,5 +144,12 @@ func v1Upgrade(db *idb.Database) error {
 		return err
 	}
 
+	// Get the database name and save it to storage
+	if databaseName, err := db.Name(); err != nil {
+		return err
+	} else if err = utils.StoreIndexedDb(databaseName); err != nil {
+		return err
+	}
+
 	return nil
 }
diff --git a/utils/indexedDbList.go b/utils/indexedDbList.go
new file mode 100644
index 00000000..a83321ef
--- /dev/null
+++ b/utils/indexedDbList.go
@@ -0,0 +1,53 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright © 2022 xx foundation                                             //
+//                                                                            //
+// Use of this source code is governed by a license that can be found in the  //
+// LICENSE file.                                                              //
+////////////////////////////////////////////////////////////////////////////////
+
+//go:build js && wasm
+
+package utils
+
+import (
+	"encoding/json"
+	"github.com/pkg/errors"
+	"os"
+)
+
+const indexedDbListKey = "xxDkWasmIndexedDbList"
+
+// GetIndexedDbList returns the list of stored indexedDb databases.
+func GetIndexedDbList() ([]string, error) {
+	var list []string
+	listBytes, err := GetLocalStorage().GetItem(indexedDbListKey)
+	if err != nil && !errors.Is(err, os.ErrNotExist) {
+		return nil, err
+	} else if err == nil {
+		err = json.Unmarshal(listBytes, &list)
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	return list, nil
+}
+
+// StoreIndexedDb saved the indexedDb database name to storage.
+func StoreIndexedDb(databaseName string) error {
+	list, err := GetIndexedDbList()
+	if err != nil {
+		return err
+	}
+
+	list = append(list, databaseName)
+
+	listBytes, err := json.Marshal(list)
+	if err != nil {
+		return err
+	}
+
+	GetLocalStorage().SetItem(indexedDbListKey, listBytes)
+
+	return nil
+}
diff --git a/utils/indexedDbList_test.go b/utils/indexedDbList_test.go
new file mode 100644
index 00000000..b9d4ce9d
--- /dev/null
+++ b/utils/indexedDbList_test.go
@@ -0,0 +1,38 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright © 2022 xx foundation                                             //
+//                                                                            //
+// Use of this source code is governed by a license that can be found in the  //
+// LICENSE file.                                                              //
+////////////////////////////////////////////////////////////////////////////////
+
+//go:build js && wasm
+
+package utils
+
+import (
+	"reflect"
+	"testing"
+)
+
+// Tests that three indexedDb database names stored with StoreIndexedDb are
+// retrieved with GetIndexedDbList.
+func TestStoreIndexedDb_GetIndexedDbList(t *testing.T) {
+	expected := []string{"db1", "db2", "db3"}
+
+	for _, name := range expected {
+		err := StoreIndexedDb(name)
+		if err != nil {
+			t.Errorf("Failed to store database name %q: %+v", name, err)
+		}
+	}
+
+	list, err := GetIndexedDbList()
+	if err != nil {
+		t.Errorf("Failed to get database list: %+v", err)
+	}
+
+	if !reflect.DeepEqual(expected, list) {
+		t.Errorf("Did not get expected list.\nexpected: %s\nreceived: %s",
+			expected, list)
+	}
+}
-- 
GitLab