From 1e7552fef90d41601168ad515afaa6d7bed7ca85 Mon Sep 17 00:00:00 2001
From: Benjamin Wenger <ben@elixxir.ioo>
Date: Tue, 22 Sep 2020 16:18:28 -0700
Subject: [PATCH] added support for base NDF

---
 storage/ndf.go         | 30 ++++++++++++++++++++++++++++++
 storage/session.go     |  3 +++
 storage/utility/NDF.go | 40 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 73 insertions(+)
 create mode 100644 storage/ndf.go
 create mode 100644 storage/utility/NDF.go

diff --git a/storage/ndf.go b/storage/ndf.go
new file mode 100644
index 000000000..f92336de5
--- /dev/null
+++ b/storage/ndf.go
@@ -0,0 +1,30 @@
+package storage
+
+import (
+	jww "github.com/spf13/jwalterweatherman"
+	"gitlab.com/elixxir/client/storage/utility"
+	"gitlab.com/xx_network/primitives/ndf"
+)
+
+const baseNdfKey = "baseNdf"
+
+func (s *Session) SetBaseNDF(def *ndf.NetworkDefinition) {
+	err := utility.SaveNDF(s.kv, baseNdfKey, def)
+	if err != nil {
+		jww.FATAL.Printf("Failed to dave the base NDF: %s", err)
+	}
+	s.baseNdf = def
+}
+
+func (s *Session) GetBaseNDF() *ndf.NetworkDefinition {
+	if s.baseNdf != nil {
+		return s.baseNdf
+	}
+	def, err := utility.LoadNDF(s.kv, baseNdfKey)
+	if err != nil {
+		jww.FATAL.Printf("Could not load the base NDF: %s", err)
+	}
+
+	s.baseNdf = def
+	return def
+}
diff --git a/storage/session.go b/storage/session.go
index 3a9c8f51d..9e6427e87 100644
--- a/storage/session.go
+++ b/storage/session.go
@@ -24,6 +24,7 @@ import (
 	"gitlab.com/elixxir/ekv"
 	"gitlab.com/xx_network/crypto/signature/rsa"
 	"gitlab.com/xx_network/primitives/id"
+	"gitlab.com/xx_network/primitives/ndf"
 	"sync"
 	"testing"
 )
@@ -36,7 +37,9 @@ type Session struct {
 	kv  *versioned.KV
 	mux sync.RWMutex
 
+	//memoized data
 	regStatus RegistrationStatus
+	baseNdf   *ndf.NetworkDefinition
 
 	//sub-stores
 	e2e              *e2e.Store
diff --git a/storage/utility/NDF.go b/storage/utility/NDF.go
new file mode 100644
index 000000000..be827bee8
--- /dev/null
+++ b/storage/utility/NDF.go
@@ -0,0 +1,40 @@
+package utility
+
+import (
+	"gitlab.com/elixxir/client/storage/versioned"
+	"gitlab.com/xx_network/primitives/ndf"
+	"time"
+)
+
+const currentNDFVersion = 0
+
+func LoadNDF(kv *versioned.KV, key string) (*ndf.NetworkDefinition, error) {
+	vo, err := kv.Get(key)
+	if err != nil {
+		return nil, err
+	}
+
+	ndf, _, err := ndf.DecodeNDF(string(vo.Data))
+	if err != nil {
+		return nil, err
+	}
+
+	return ndf, err
+}
+
+func SaveNDF(kv *versioned.KV, key string, ndf *ndf.NetworkDefinition) error {
+	marshaled, err := ndf.Marshal()
+	if err != nil {
+		return err
+	}
+
+	now := time.Now()
+
+	obj := versioned.Object{
+		Version:   currentNDFVersion,
+		Timestamp: now,
+		Data:      marshaled,
+	}
+
+	return kv.Set(key, &obj)
+}
-- 
GitLab