diff --git a/src/db/common.go b/src/db/common.go index c784d60..32917ea 100644 --- a/src/db/common.go +++ b/src/db/common.go @@ -4,8 +4,6 @@ import ( "errors" "fmt" "reflect" - - "github.com/ihexxa/quickshare/src/db/sitestore" ) const ( @@ -16,6 +14,8 @@ const ( ShareIDNs = "sharingKey" uploadsPrefix = "uploads" + + KeyInitTime = "keyInitTime" ) var ( @@ -40,13 +40,27 @@ type Quota struct { } type Preferences struct { - Bg *sitestore.BgConfig `json:"bg"` - CSSURL string `json:"cssURL"` - LanPackURL string `json:"lanPackURL"` - Lan string `json:"lan"` - Theme string `json:"theme"` - Avatar string `json:"avatar"` - Email string `json:"email"` + Bg *BgConfig `json:"bg"` + CSSURL string `json:"cssURL"` + LanPackURL string `json:"lanPackURL"` + Lan string `json:"lan"` + Theme string `json:"theme"` + Avatar string `json:"avatar"` + Email string `json:"email"` +} + +type ClientConfig struct { + SiteName string `json:"siteName" yaml:"siteName"` + SiteDesc string `json:"siteDesc" yaml:"siteDesc"` + Bg *BgConfig `json:"bg" yaml:"bg"` +} + +type BgConfig struct { + Url string `json:"url" yaml:"url"` + Repeat string `json:"repeat" yaml:"repeat"` + Position string `json:"position" yaml:"position"` + Align string `json:"align" yaml:"align"` + BgColor string `json:"bgColor" yaml:"bgColor"` } func ComparePreferences(p1, p2 *Preferences) bool { diff --git a/src/db/fileinfostore/file_info_store.go b/src/db/fileinfostore/file_info_store.go index 5f61fdf..59e81b8 100644 --- a/src/db/fileinfostore/file_info_store.go +++ b/src/db/fileinfostore/file_info_store.go @@ -30,10 +30,6 @@ var ( maxHashingTime = 10 ) -func IsNotFound(err error) bool { - return err == ErrNotFound -} - type IFileInfoStore interface { AddSharing(dirPath string) error DelSharing(dirPath string) error @@ -89,7 +85,7 @@ func (fi *FileInfoStore) AddSharing(dirPath string) error { info, err := fi.GetInfo(dirPath) if err != nil { - if !IsNotFound(err) { + if !errors.Is(err, ErrNotFound) { return err } info = &db.FileInfo{ @@ -199,7 +195,7 @@ func (fi *FileInfoStore) GetInfos(itemPaths []string) (map[string]*db.FileInfo, for _, itemPath := range itemPaths { info, err := fi.GetInfo(itemPath) if err != nil { - if !IsNotFound(err) { + if !errors.Is(err, ErrNotFound) { return nil, err } continue @@ -233,7 +229,7 @@ func (fi *FileInfoStore) SetSha1(itemPath, sign string) error { info, err := fi.GetInfo(itemPath) if err != nil { - if !IsNotFound(err) { + if !errors.Is(err, ErrNotFound) { return err } info = &db.FileInfo{ diff --git a/src/db/sitestore/site_store.go b/src/db/sitestore/site_store.go index 5800519..00ef2e6 100644 --- a/src/db/sitestore/site_store.go +++ b/src/db/sitestore/site_store.go @@ -3,49 +3,28 @@ package sitestore import ( "encoding/json" "errors" - "fmt" "sync" - "time" + "github.com/ihexxa/quickshare/src/db" "github.com/ihexxa/quickshare/src/kvstore" ) const ( - InitNs = "SiteInit" - SiteNs = "Site" - InitTimeKey = "initTime" - SiteCfgKey = "siteCfg" + NsSite = "NsSite" + KeySiteCfg = "KeySiteCfg" ) var ( ErrNotFound = errors.New("site config not found") ) -func IsNotFound(err error) bool { - return err == ErrNotFound -} - type ISiteStore interface { - SetClientCfg(cfg *ClientConfig) error + SetClientCfg(cfg *db.ClientConfig) error GetCfg() (*SiteConfig, error) } -type ClientConfig struct { - SiteName string `json:"siteName" yaml:"siteName"` - SiteDesc string `json:"siteDesc" yaml:"siteDesc"` - Bg *BgConfig `json:"bg" yaml:"bg"` -} - -type BgConfig struct { - Url string `json:"url" yaml:"url"` - Repeat string `json:"repeat" yaml:"repeat"` - Position string `json:"position" yaml:"position"` - Align string `json:"align" yaml:"align"` - BgColor string `json:"bgColor" yaml:"bgColor"` -} - type SiteConfig struct { - ClientCfg *ClientConfig `json:"clientCfg" yaml:"clientCfg"` + ClientCfg *db.ClientConfig `json:"clientCfg" yaml:"clientCfg"` } type SiteStore struct { @@ -61,65 +40,59 @@ func NewSiteStore(store kvstore.IKVStore) (*SiteStore, error) { } func (st *SiteStore) Init(cfg *SiteConfig) error { - _, ok := st.store.GetStringIn(InitNs, InitTimeKey) + _, ok := st.store.GetStringIn(NsSite, KeySiteCfg) 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 { + if err = st.store.AddNamespace(NsSite); err != nil { return err } - err = st.store.SetStringIn(InitNs, InitTimeKey, fmt.Sprintf("%d", time.Now().Unix())) + + err = st.setCfg(cfg) 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 - } +func (st *SiteStore) getCfg() (*SiteConfig, error) { + cfgStr, ok := st.store.GetStringIn(NsSite, KeySiteCfg) + if !ok { + return nil, ErrNotFound } - siteCfg.ClientCfg = cfg - cfgBytes, err := json.Marshal(siteCfg) + cfg := &SiteConfig{} + err := json.Unmarshal([]byte(cfgStr), cfg) + if err != nil { + return nil, err + } + return cfg, nil +} + +func (st *SiteStore) setCfg(cfg *SiteConfig) error { + cfgBytes, err := json.Marshal(cfg) if err != nil { return err } - return st.store.SetStringIn(SiteNs, SiteCfgKey, string(cfgBytes)) + return st.store.SetStringIn(NsSite, KeySiteCfg, string(cfgBytes)) +} + +func (st *SiteStore) SetClientCfg(cfg *db.ClientConfig) error { + st.mtx.Lock() + defer st.mtx.Unlock() + + siteCfg, err := st.getCfg() + if err != nil { + return err + } + siteCfg.ClientCfg = cfg + + return st.setCfg(siteCfg) } 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 + return st.getCfg() } diff --git a/src/db/sitestore/site_store_test.go b/src/db/sitestore/site_store_test.go index 162a4e6..4515fce 100644 --- a/src/db/sitestore/site_store_test.go +++ b/src/db/sitestore/site_store_test.go @@ -7,6 +7,7 @@ import ( "reflect" "testing" + "github.com/ihexxa/quickshare/src/db" "github.com/ihexxa/quickshare/src/kvstore/boltdbpvd" ) @@ -14,10 +15,10 @@ func TestSiteStore(t *testing.T) { testSiteMethods := func(t *testing.T, store ISiteStore) { siteCfg := &SiteConfig{ - ClientCfg: &ClientConfig{ + ClientCfg: &db.ClientConfig{ SiteName: "quickshare", SiteDesc: "simpel file sharing", - Bg: &BgConfig{ + Bg: &db.BgConfig{ Url: "/imgs/bg.jpg", Repeat: "no-repeat", Position: "fixed", @@ -55,10 +56,10 @@ func TestSiteStore(t *testing.T) { t.Fatal("fail to new kvstore", err) } err = store.Init(&SiteConfig{ - ClientCfg: &ClientConfig{ + ClientCfg: &db.ClientConfig{ SiteName: "", SiteDesc: "", - Bg: &BgConfig{ + Bg: &db.BgConfig{ Url: "", Repeat: "", Position: "", diff --git a/src/db/userstore/user_store.go b/src/db/userstore/user_store.go index 6462483..726e9d9 100644 --- a/src/db/userstore/user_store.go +++ b/src/db/userstore/user_store.go @@ -8,7 +8,6 @@ import ( "time" "github.com/ihexxa/quickshare/src/db" - "github.com/ihexxa/quickshare/src/db/sitestore" "github.com/ihexxa/quickshare/src/kvstore" ) @@ -35,7 +34,7 @@ var ( ErrNotFound = errors.New("not found") DefaultPreferences = db.Preferences{ - Bg: &sitestore.BgConfig{ + Bg: &db.BgConfig{ Url: "", Repeat: "no-repeat", Position: "center", @@ -51,14 +50,10 @@ var ( } ) -func IsReachedLimitErr(err error) bool { - return err == ErrReachedLimit -} - type UserCfg struct { - Name string `json:"name"` - Role string `json:"role"` - Pwd string `json:"pwd"` + Name string `json:"name" yaml:"name"` + Role string `json:"role" yaml:"role"` + Pwd string `json:"pwd" yaml:"pwd"` } type IUserStore interface { diff --git a/src/db/userstore/user_store_test.go b/src/db/userstore/user_store_test.go index 1b7365f..e69a034 100644 --- a/src/db/userstore/user_store_test.go +++ b/src/db/userstore/user_store_test.go @@ -186,7 +186,7 @@ func TestUserStores(t *testing.T) { } newPrefer := &db.Preferences{ - Bg: &sitestore.BgConfig{ + Bg: &db.BgConfig{ Url: "/url", Repeat: "repeat", Position: "pos", diff --git a/src/handlers/settings/handlers.go b/src/handlers/settings/handlers.go index d0c7294..1885025 100644 --- a/src/handlers/settings/handlers.go +++ b/src/handlers/settings/handlers.go @@ -6,7 +6,7 @@ import ( "github.com/gin-gonic/gin" "github.com/ihexxa/gocfg" - "github.com/ihexxa/quickshare/src/db/sitestore" + "github.com/ihexxa/quickshare/src/db" "github.com/ihexxa/quickshare/src/depidx" q "github.com/ihexxa/quickshare/src/handlers" ) @@ -29,10 +29,10 @@ func (h *SettingsSvc) Health(c *gin.Context) { } type ClientCfgMsg struct { - SiteName string `json:"siteName"` - SiteDesc string `json:"siteDesc"` - Bg *sitestore.BgConfig `json:"bg"` - CaptchaEnabled bool `json:"captchaEnabled"` + SiteName string `json:"siteName"` + SiteDesc string `json:"siteDesc"` + Bg *db.BgConfig `json:"bg"` + CaptchaEnabled bool `json:"captchaEnabled"` } func (h *SettingsSvc) GetClientCfg(c *gin.Context) { @@ -59,7 +59,7 @@ func (h *SettingsSvc) SetClientCfg(c *gin.Context) { return } - clientCfg := &sitestore.ClientConfig{ + clientCfg := &db.ClientConfig{ SiteName: req.SiteName, SiteDesc: req.SiteDesc, Bg: req.Bg, @@ -78,7 +78,7 @@ func (h *SettingsSvc) SetClientCfg(c *gin.Context) { c.JSON(q.Resp(200)) } -func validateClientCfg(cfg *sitestore.ClientConfig) error { +func validateClientCfg(cfg *db.ClientConfig) error { if cfg.SiteName == "" { return errors.New("site name is empty") } diff --git a/src/server/config.go b/src/server/config.go index e7d9117..13a9363 100644 --- a/src/server/config.go +++ b/src/server/config.go @@ -3,6 +3,7 @@ package server import ( "encoding/json" + "github.com/ihexxa/quickshare/src/db" "github.com/ihexxa/quickshare/src/db/sitestore" "github.com/ihexxa/quickshare/src/db/userstore" ) @@ -120,10 +121,10 @@ func DefaultConfigStruct() *Config { WorkerCount: 2, }, Site: &sitestore.SiteConfig{ - ClientCfg: &sitestore.ClientConfig{ + ClientCfg: &db.ClientConfig{ SiteName: "Quickshare", SiteDesc: "quick and simple file sharing", - Bg: &sitestore.BgConfig{ + Bg: &db.BgConfig{ Url: "/static/img/textured_paper.png", Repeat: "repeat", Position: "fixed", diff --git a/src/server/config_load.go b/src/server/config_load.go index 7b3640d..95aefd1 100644 --- a/src/server/config_load.go +++ b/src/server/config_load.go @@ -2,6 +2,7 @@ package server import ( "encoding/json" + "errors" "fmt" "os" "strings" @@ -41,6 +42,9 @@ func LoadCfg(args *Args) (*gocfg.Cfg, error) { _, err := os.Stat(dbPath) if err == nil { cfg, err = mergeDbConfig(cfg, dbPath) + if err != nil { + return nil, err + } } else if err != nil { if !os.IsNotExist(err) { return nil, err @@ -64,8 +68,12 @@ func mergeDbConfig(cfg *gocfg.Cfg, dbPath string) (*gocfg.Cfg, error) { clientCfg, err := siteStore.GetCfg() if err != nil { + if errors.Is(err, sitestore.ErrNotFound) { + return cfg, nil + } return nil, err } + clientCfgBytes, err := json.Marshal(clientCfg) if err != nil { return nil, err diff --git a/src/server/config_load_test.go b/src/server/config_load_test.go index 0aad2b8..4ea0a1a 100644 --- a/src/server/config_load_test.go +++ b/src/server/config_load_test.go @@ -7,6 +7,7 @@ import ( "github.com/ihexxa/gocfg" + "github.com/ihexxa/quickshare/src/db" "github.com/ihexxa/quickshare/src/db/sitestore" "github.com/ihexxa/quickshare/src/db/userstore" ) @@ -111,10 +112,10 @@ func TestLoadCfg(t *testing.T) { WorkerCount: 1, }, Site: &sitestore.SiteConfig{ - ClientCfg: &sitestore.ClientConfig{ + ClientCfg: &db.ClientConfig{ SiteName: "1", SiteDesc: "1", - Bg: &sitestore.BgConfig{ + Bg: &db.BgConfig{ Url: "1", Repeat: "1", Position: "1", @@ -177,10 +178,10 @@ func TestLoadCfg(t *testing.T) { WorkerCount: 4, }, Site: &sitestore.SiteConfig{ - ClientCfg: &sitestore.ClientConfig{ + ClientCfg: &db.ClientConfig{ SiteName: "4", SiteDesc: "4", - Bg: &sitestore.BgConfig{ + Bg: &db.BgConfig{ Url: "4", Repeat: "4", Position: "4", @@ -243,10 +244,10 @@ func TestLoadCfg(t *testing.T) { WorkerCount: 4, }, Site: &sitestore.SiteConfig{ - ClientCfg: &sitestore.ClientConfig{ + ClientCfg: &db.ClientConfig{ SiteName: "4", SiteDesc: "4", - Bg: &sitestore.BgConfig{ + Bg: &db.BgConfig{ Url: "4", Repeat: "4", Position: "4", @@ -309,15 +310,15 @@ func TestLoadCfg(t *testing.T) { WorkerCount: 4, }, Site: &sitestore.SiteConfig{ - ClientCfg: &sitestore.ClientConfig{ - SiteName: "Quickshare", - SiteDesc: "Quickshare", - Bg: &sitestore.BgConfig{ - Url: "test.png", - Repeat: "no-repeat", - Position: "top", - Align: "scroll", - BgColor: "", // the schema of the config from db is old + ClientCfg: &db.ClientConfig{ + SiteName: "4", + SiteDesc: "4", + Bg: &db.BgConfig{ + Url: "4", + Repeat: "4", + Position: "4", + Align: "4", + BgColor: "4", }, }, }, diff --git a/src/server/server.go b/src/server/server.go index ae6d4c8..b1ab10d 100644 --- a/src/server/server.go +++ b/src/server/server.go @@ -23,6 +23,7 @@ import ( "golang.org/x/crypto/bcrypt" "github.com/ihexxa/quickshare/src/cryptoutil/jwt" + "github.com/ihexxa/quickshare/src/db" "github.com/ihexxa/quickshare/src/db/boltstore" "github.com/ihexxa/quickshare/src/db/fileinfostore" "github.com/ihexxa/quickshare/src/db/sitestore" @@ -162,10 +163,10 @@ func initDeps(cfg gocfg.ICfg) *depidx.Deps { } err = siteStore.Init(&sitestore.SiteConfig{ - ClientCfg: &sitestore.ClientConfig{ + ClientCfg: &db.ClientConfig{ SiteName: cfg.StringOr("Site.ClientCfg.SiteName", "Quickshare"), SiteDesc: cfg.StringOr("Site.ClientCfg.SiteDesc", "quick and simple file sharing"), - Bg: &sitestore.BgConfig{ + Bg: &db.BgConfig{ Url: cfg.StringOr("Site.ClientCfg.Bg.Url", "/static/img/textured_paper.png"), Repeat: cfg.StringOr("Site.ClientCfg.Bg.Repeat", "repeat"), Position: cfg.StringOr("Site.ClientCfg.Bg.Position", "fixed"), diff --git a/src/server/server_settings_test.go b/src/server/server_settings_test.go index 2e96b82..ac0ee24 100644 --- a/src/server/server_settings_test.go +++ b/src/server/server_settings_test.go @@ -10,7 +10,7 @@ import ( "time" "github.com/ihexxa/quickshare/src/client" - "github.com/ihexxa/quickshare/src/db/sitestore" + "github.com/ihexxa/quickshare/src/db" q "github.com/ihexxa/quickshare/src/handlers" "github.com/ihexxa/quickshare/src/handlers/settings" ) @@ -74,11 +74,11 @@ func TestSettingsHandlers(t *testing.T) { t.Run("get/set client config", func(t *testing.T) { settingsCl := client.NewSettingsClient(addr) - cfgs := []*sitestore.ClientConfig{ - &sitestore.ClientConfig{ + cfgs := []*db.ClientConfig{ + &db.ClientConfig{ SiteName: "quickshare", SiteDesc: "quickshare", - Bg: &sitestore.BgConfig{ + Bg: &db.BgConfig{ Url: "url", Repeat: "repeat", Position: "center", diff --git a/src/server/server_users_test.go b/src/server/server_users_test.go index 1f44759..7935261 100644 --- a/src/server/server_users_test.go +++ b/src/server/server_users_test.go @@ -9,7 +9,6 @@ import ( "github.com/ihexxa/quickshare/src/client" "github.com/ihexxa/quickshare/src/db" - "github.com/ihexxa/quickshare/src/db/sitestore" "github.com/ihexxa/quickshare/src/db/userstore" q "github.com/ihexxa/quickshare/src/handlers" su "github.com/ihexxa/quickshare/src/handlers/singleuserhdr" @@ -448,7 +447,7 @@ func TestUsersHandlers(t *testing.T) { prefers := []*db.Preferences{ &db.Preferences{ - Bg: &sitestore.BgConfig{ + Bg: &db.BgConfig{ Url: "/bgurl", Repeat: "no-repeat", Position: "center", @@ -461,7 +460,7 @@ func TestUsersHandlers(t *testing.T) { Email: "email1", }, &db.Preferences{ - Bg: &sitestore.BgConfig{ + Bg: &db.BgConfig{ Url: "/bgurl2", Repeat: "no-repeat2", Position: "center2", diff --git a/src/server/testdata/test_quickshare.db b/src/server/testdata/test_quickshare.db index a7377bf..7907bde 100644 Binary files a/src/server/testdata/test_quickshare.db and b/src/server/testdata/test_quickshare.db differ