fix(sitestore): clean up sitestore for refactoring
This commit is contained in:
parent
9ff28ecce4
commit
b4dc30f824
14 changed files with 117 additions and 128 deletions
|
@ -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,7 +40,7 @@ type Quota struct {
|
|||
}
|
||||
|
||||
type Preferences struct {
|
||||
Bg *sitestore.BgConfig `json:"bg"`
|
||||
Bg *BgConfig `json:"bg"`
|
||||
CSSURL string `json:"cssURL"`
|
||||
LanPackURL string `json:"lanPackURL"`
|
||||
Lan string `json:"lan"`
|
||||
|
@ -49,6 +49,20 @@ type Preferences struct {
|
|||
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 {
|
||||
return p1.CSSURL == p2.CSSURL &&
|
||||
p1.LanPackURL == p2.LanPackURL &&
|
||||
|
|
|
@ -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{
|
||||
|
|
|
@ -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 {
|
||||
if err = st.store.AddNamespace(NsSite); 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()))
|
||||
err = st.setCfg(cfg)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (st *SiteStore) SetClientCfg(cfg *ClientConfig) error {
|
||||
func (st *SiteStore) getCfg() (*SiteConfig, error) {
|
||||
cfgStr, ok := st.store.GetStringIn(NsSite, KeySiteCfg)
|
||||
if !ok {
|
||||
return nil, ErrNotFound
|
||||
}
|
||||
|
||||
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(NsSite, KeySiteCfg, string(cfgBytes))
|
||||
}
|
||||
|
||||
func (st *SiteStore) SetClientCfg(cfg *db.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)
|
||||
siteCfg, err := st.getCfg()
|
||||
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))
|
||||
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()
|
||||
}
|
||||
|
|
|
@ -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: "",
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -186,7 +186,7 @@ func TestUserStores(t *testing.T) {
|
|||
}
|
||||
|
||||
newPrefer := &db.Preferences{
|
||||
Bg: &sitestore.BgConfig{
|
||||
Bg: &db.BgConfig{
|
||||
Url: "/url",
|
||||
Repeat: "repeat",
|
||||
Position: "pos",
|
||||
|
|
|
@ -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"
|
||||
)
|
||||
|
@ -31,7 +31,7 @@ func (h *SettingsSvc) Health(c *gin.Context) {
|
|||
type ClientCfgMsg struct {
|
||||
SiteName string `json:"siteName"`
|
||||
SiteDesc string `json:"siteDesc"`
|
||||
Bg *sitestore.BgConfig `json:"bg"`
|
||||
Bg *db.BgConfig `json:"bg"`
|
||||
CaptchaEnabled bool `json:"captchaEnabled"`
|
||||
}
|
||||
|
||||
|
@ -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")
|
||||
}
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
|
@ -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"),
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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",
|
||||
|
|
BIN
src/server/testdata/test_quickshare.db
vendored
BIN
src/server/testdata/test_quickshare.db
vendored
Binary file not shown.
Loading…
Add table
Add a link
Reference in a new issue