124 lines
2.3 KiB
Go
124 lines
2.3 KiB
Go
package sitestore
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"sync"
|
|
"time"
|
|
|
|
"github.com/ihexxa/quickshare/src/kvstore"
|
|
)
|
|
|
|
const (
|
|
InitNs = "SiteInit"
|
|
SiteNs = "Site"
|
|
InitTimeKey = "initTime"
|
|
SiteCfgKey = "siteCfg"
|
|
)
|
|
|
|
var (
|
|
ErrNotFound = errors.New("site config not found")
|
|
)
|
|
|
|
func IsNotFound(err error) bool {
|
|
return err == ErrNotFound
|
|
}
|
|
|
|
type ISiteStore interface {
|
|
SetClientCfg(cfg *ClientConfig) error
|
|
GetCfg() (*SiteConfig, error)
|
|
}
|
|
|
|
type ClientConfig struct {
|
|
SiteName string `json:"siteName"`
|
|
SiteDesc string `json:"siteDesc"`
|
|
Bg *BgConfig `json:"bg"`
|
|
}
|
|
|
|
type BgConfig struct {
|
|
Url string `json:"url"`
|
|
Repeat string `json:"repeat"`
|
|
Position string `json:"position"`
|
|
Align string `json:"align"`
|
|
}
|
|
|
|
type SiteConfig struct {
|
|
ClientCfg *ClientConfig `json:"clientCfg"`
|
|
}
|
|
|
|
type SiteStore struct {
|
|
mtx *sync.RWMutex
|
|
store kvstore.IKVStore
|
|
}
|
|
|
|
func NewSiteStore(store kvstore.IKVStore) (*SiteStore, error) {
|
|
return &SiteStore{
|
|
store: store,
|
|
mtx: &sync.RWMutex{},
|
|
}, nil
|
|
}
|
|
|
|
func (st *SiteStore) Init(cfg *SiteConfig) error {
|
|
_, ok := st.store.GetStringIn(InitNs, InitTimeKey)
|
|
if !ok {
|
|
var err error
|
|
for _, nsName := range []string{
|
|
InitNs,
|
|
SiteNs,
|
|
} {
|
|
if err = st.store.AddNamespace(nsName); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// TODO: replace following with setConfig
|
|
err = st.SetClientCfg(cfg.ClientCfg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = st.store.SetStringIn(InitNs, InitTimeKey, fmt.Sprintf("%d", time.Now().Unix()))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (st *SiteStore) SetClientCfg(cfg *ClientConfig) error {
|
|
st.mtx.Lock()
|
|
defer st.mtx.Unlock()
|
|
|
|
siteCfg := &SiteConfig{}
|
|
cfgStr, ok := st.store.GetStringIn(SiteNs, SiteCfgKey)
|
|
if ok {
|
|
err := json.Unmarshal([]byte(cfgStr), siteCfg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
siteCfg.ClientCfg = cfg
|
|
|
|
cfgBytes, err := json.Marshal(siteCfg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return st.store.SetStringIn(SiteNs, SiteCfgKey, string(cfgBytes))
|
|
}
|
|
|
|
func (st *SiteStore) GetCfg() (*SiteConfig, error) {
|
|
st.mtx.RLock()
|
|
defer st.mtx.RUnlock()
|
|
|
|
cfgStr, ok := st.store.GetStringIn(SiteNs, SiteCfgKey)
|
|
if !ok {
|
|
return nil, ErrNotFound
|
|
}
|
|
siteCfg := &SiteConfig{}
|
|
err := json.Unmarshal([]byte(cfgStr), siteCfg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return siteCfg, nil
|
|
}
|