136 lines
2.9 KiB
Go
136 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/br0xen/boltease"
|
|
)
|
|
|
|
// model stores the current jam in memory, and has the ability to access archived dbs
|
|
type model struct {
|
|
bolt *boltease.DB
|
|
dbOpened int
|
|
dbFileName string
|
|
|
|
site *siteData // Configuration data for the site
|
|
jam *Gamejam // The currently active gamejam
|
|
clients []Client // Web clients that have connected to the server
|
|
|
|
clientsUpdated bool
|
|
}
|
|
|
|
// Update Flags: Which parts of the model need to be updated
|
|
const (
|
|
UpdateSiteData = iota
|
|
UpdateJamData
|
|
)
|
|
|
|
func NewModel() (*model, error) {
|
|
var err error
|
|
m := new(model)
|
|
|
|
m.dbFileName = DbName
|
|
if err = m.openDB(); err != nil {
|
|
return nil, errors.New("Unable to open DB: " + err.Error())
|
|
}
|
|
defer m.closeDB()
|
|
|
|
// Initialize the DB
|
|
if err = m.initDB(); err != nil {
|
|
return nil, errors.New("Unable to initialize DB: " + err.Error())
|
|
}
|
|
|
|
// Load the site data
|
|
m.site = NewSiteData(m)
|
|
if err = m.site.LoadFromDB(); err != nil {
|
|
// Error loading from the DB, set to defaults
|
|
def := NewSiteData(m)
|
|
m.site = def
|
|
}
|
|
|
|
// Load the jam data
|
|
if m.jam, err = m.LoadCurrentJam(); err != nil {
|
|
return nil, errors.New("Unable to load current jam: " + err.Error())
|
|
}
|
|
|
|
// Load web clients
|
|
m.clients = m.LoadAllClients()
|
|
|
|
return m, nil
|
|
}
|
|
|
|
func (m *model) openDB() error {
|
|
m.dbOpened += 1
|
|
if m.dbOpened == 1 {
|
|
var err error
|
|
m.bolt, err = boltease.Create(m.dbFileName, 0600, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (m *model) closeDB() error {
|
|
m.dbOpened -= 1
|
|
if m.dbOpened == 0 {
|
|
return m.bolt.CloseDB()
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (m *model) initDB() error {
|
|
var err error
|
|
if err = m.openDB(); err != nil {
|
|
return err
|
|
}
|
|
defer m.closeDB()
|
|
|
|
// Create the path to the bucket to store admin users
|
|
if err = m.bolt.MkBucketPath([]string{"users"}); err != nil {
|
|
return err
|
|
}
|
|
// Create the path to the bucket to store the web clients
|
|
if err = m.bolt.MkBucketPath([]string{"clients"}); err != nil {
|
|
return err
|
|
}
|
|
// Create the path to the bucket to store the current jam & teams
|
|
if err = m.bolt.MkBucketPath([]string{"jam", "teams"}); err != nil {
|
|
return err
|
|
}
|
|
// Create the path to the bucket to store the list of archived jams
|
|
if err = m.bolt.MkBucketPath([]string{"archive"}); err != nil {
|
|
return err
|
|
}
|
|
// Create the path to the bucket to store site config data
|
|
return m.bolt.MkBucketPath([]string{"site"})
|
|
}
|
|
|
|
// saveChanges saves any parts of the model that have been flagged as changed to the database
|
|
func (m *model) saveChanges() error {
|
|
var err error
|
|
if err = m.openDB(); err != nil {
|
|
return err
|
|
}
|
|
defer m.closeDB()
|
|
|
|
if m.site.NeedsSave() {
|
|
if err = m.site.SaveToDB(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
if m.jam.IsChanged {
|
|
if err = m.jam.SaveToDB(); err != nil {
|
|
return err
|
|
}
|
|
m.jam.IsChanged = false
|
|
}
|
|
if m.clientsUpdated {
|
|
if err = m.SaveAllClients(); err != nil {
|
|
return err
|
|
}
|
|
m.clientsUpdated = false
|
|
}
|
|
return nil
|
|
}
|