/ pkg / system / state.go
state.go
  1  package system
  2  
  3  import (
  4  	"fmt"
  5  
  6  	dogeboxd "github.com/dogeorg/dogeboxd/pkg"
  7  )
  8  
  9  var (
 10  	_       dogeboxd.StateManager = &StateManager{} // interface guard
 11  	current string                = "0"             // Key for singletons in the database
 12  )
 13  
 14  func NewStateManager(store *dogeboxd.StoreManager) dogeboxd.StateManager {
 15  	// Set initial state
 16  	s := &StateManager{
 17  		storeManager: store,
 18  		netStore:     dogeboxd.GetTypeStore[dogeboxd.NetworkState](store),
 19  		dbxStore:     dogeboxd.GetTypeStore[dogeboxd.DogeboxState](store),
 20  		srcStore:     dogeboxd.GetTypeStore[dogeboxd.SourceState](store),
 21  		network: dogeboxd.NetworkState{
 22  			CurrentNetwork: nil,
 23  			PendingNetwork: nil,
 24  		},
 25  		dogebox: dogeboxd.DogeboxState{
 26  			InitialState: dogeboxd.DogeboxStateInitialSetup{
 27  				HasGeneratedKey:    false,
 28  				HasSetNetwork:      false,
 29  				HasFullyConfigured: false,
 30  			},
 31  		},
 32  		source: dogeboxd.SourceState{
 33  			SourceConfigs: []dogeboxd.ManifestSourceConfiguration{},
 34  		},
 35  	}
 36  
 37  	// try loading state from the DB
 38  	net, err := s.netStore.Get(current)
 39  	if err != nil {
 40  		fmt.Println(">> couldn't load network state, using default")
 41  	} else {
 42  		s.network = net
 43  	}
 44  
 45  	dbx, err := s.dbxStore.Get(current)
 46  	if err != nil {
 47  		fmt.Println(">> couldn't load dbx state, using default")
 48  	} else {
 49  		s.dogebox = dbx
 50  	}
 51  
 52  	src, err := s.srcStore.Get(current)
 53  	if err != nil {
 54  		fmt.Println(">> couldn't load src state, using default")
 55  	} else {
 56  		s.source = src
 57  	}
 58  
 59  	return s
 60  }
 61  
 62  type StateManager struct {
 63  	storeManager *dogeboxd.StoreManager
 64  	netStore     *dogeboxd.TypeStore[dogeboxd.NetworkState]
 65  	dbxStore     *dogeboxd.TypeStore[dogeboxd.DogeboxState]
 66  	srcStore     *dogeboxd.TypeStore[dogeboxd.SourceState]
 67  	network      dogeboxd.NetworkState
 68  	dogebox      dogeboxd.DogeboxState
 69  	source       dogeboxd.SourceState
 70  }
 71  
 72  func (s *StateManager) Get() dogeboxd.State {
 73  	return dogeboxd.State{
 74  		Network: s.network,
 75  		Dogebox: s.dogebox,
 76  		Sources: s.source,
 77  	}
 78  }
 79  
 80  func (s *StateManager) CloseDB() error {
 81  	return s.storeManager.CloseDB()
 82  }
 83  
 84  func (s *StateManager) OpenDB() error {
 85  	return s.storeManager.OpenDB()
 86  }
 87  
 88  func (s *StateManager) SetNetwork(ns dogeboxd.NetworkState) error {
 89  	s.network = ns
 90  	return s.netStore.Set(current, s.network)
 91  }
 92  
 93  func (s *StateManager) SetDogebox(dbs dogeboxd.DogeboxState) error {
 94  	s.dogebox = dbs
 95  	return s.dbxStore.Set(current, s.dogebox)
 96  }
 97  
 98  func (s *StateManager) SetSources(state dogeboxd.SourceState) error {
 99  	s.source = state
100  	return s.srcStore.Set(current, s.source)
101  }