fix(sitestore): clean up sitestore for refactoring

This commit is contained in:
hexxa 2022-03-22 18:04:13 +08:00 committed by Hexxa
parent 9ff28ecce4
commit b4dc30f824
14 changed files with 117 additions and 128 deletions

View file

@ -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 {

View file

@ -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{

View file

@ -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()
}

View file

@ -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: "",

View file

@ -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 {

View file

@ -186,7 +186,7 @@ func TestUserStores(t *testing.T) {
}
newPrefer := &db.Preferences{
Bg: &sitestore.BgConfig{
Bg: &db.BgConfig{
Url: "/url",
Repeat: "repeat",
Position: "pos",

View file

@ -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")
}

View file

@ -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",

View file

@ -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

View file

@ -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",
},
},
},

View file

@ -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"),

View file

@ -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",

View file

@ -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",

Binary file not shown.