feat(db/userstore): add avatar, email, bgColor to user profile
This commit is contained in:
parent
5f31cfc867
commit
817ced61de
14 changed files with 69 additions and 110 deletions
|
@ -3,6 +3,7 @@ package db
|
|||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"reflect"
|
||||
|
||||
"github.com/ihexxa/quickshare/src/db/sitestore"
|
||||
)
|
||||
|
@ -44,6 +45,18 @@ type Preferences struct {
|
|||
LanPackURL string `json:"lanPackURL"`
|
||||
Lan string `json:"lan"`
|
||||
Theme string `json:"theme"`
|
||||
Avatar string `json:"avatar"`
|
||||
Email string `json:"email"`
|
||||
}
|
||||
|
||||
func ComparePreferences(p1, p2 *Preferences) bool {
|
||||
return p1.CSSURL == p2.CSSURL &&
|
||||
p1.LanPackURL == p2.LanPackURL &&
|
||||
p1.Lan == p2.Lan &&
|
||||
p1.Theme == p2.Theme &&
|
||||
p1.Avatar == p2.Avatar &&
|
||||
p1.Email == p2.Email &&
|
||||
reflect.DeepEqual(p1.Bg, p2.Bg)
|
||||
}
|
||||
|
||||
type User struct {
|
||||
|
|
|
@ -59,109 +59,6 @@ type FileInfoStore struct {
|
|||
boltdb boltdbpvd.BoltProvider
|
||||
}
|
||||
|
||||
func migrate(fi *FileInfoStore) error {
|
||||
ver := "v0"
|
||||
schemaVer, ok := fi.store.GetStringIn(InitNs, SchemaVerKey)
|
||||
if ok {
|
||||
ver = schemaVer
|
||||
}
|
||||
|
||||
switch ver {
|
||||
case "v0":
|
||||
// add ShareID to FileInfos
|
||||
infoStrs, err := fi.store.ListStringsIn(db.InfoNs)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
type FileInfoV0 struct {
|
||||
IsDir bool `json:"isDir"`
|
||||
Shared bool `json:"shared"`
|
||||
Sha1 string `json:"sha1"`
|
||||
}
|
||||
|
||||
infoV0 := &FileInfoV0{}
|
||||
for itemPath, infoStr := range infoStrs {
|
||||
err = json.Unmarshal([]byte(infoStr), infoV0)
|
||||
if err != nil {
|
||||
return fmt.Errorf("list sharing error: %w", err)
|
||||
}
|
||||
|
||||
shareID := ""
|
||||
if infoV0.IsDir && infoV0.Shared {
|
||||
dirShareID, err := fi.getShareID(itemPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
shareID = dirShareID
|
||||
|
||||
err = fi.store.SetStringIn(db.ShareIDNs, shareID, itemPath)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
newInfo := &db.FileInfo{
|
||||
IsDir: infoV0.IsDir,
|
||||
Shared: infoV0.Shared,
|
||||
ShareID: shareID,
|
||||
Sha1: infoV0.Sha1,
|
||||
}
|
||||
if err = fi.SetInfo(itemPath, newInfo); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
err = fi.store.SetStringIn(InitNs, SchemaVerKey, SchemaV1)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
case "v1":
|
||||
// add size to file info
|
||||
infoStrs, err := fi.store.ListStringsIn(db.InfoNs)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
type FileInfoV1 struct {
|
||||
IsDir bool `json:"isDir"`
|
||||
Shared bool `json:"shared"`
|
||||
Sha1 string `json:"sha1"`
|
||||
ShareID string `json:"shareID"` // for short url
|
||||
}
|
||||
|
||||
infoV1 := &FileInfoV1{}
|
||||
for itemPath, infoStr := range infoStrs {
|
||||
err = json.Unmarshal([]byte(infoStr), infoV1)
|
||||
if err != nil {
|
||||
return fmt.Errorf("list sharing error: %w", err)
|
||||
}
|
||||
|
||||
newInfo := &db.FileInfo{
|
||||
IsDir: infoV1.IsDir,
|
||||
Shared: infoV1.Shared,
|
||||
ShareID: infoV1.ShareID,
|
||||
Sha1: infoV1.Sha1,
|
||||
Size: 0, // need to run an async task to refresh this
|
||||
}
|
||||
if err = fi.SetInfo(itemPath, newInfo); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
err = fi.store.SetStringIn(InitNs, SchemaVerKey, db.SchemaV2)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
case db.SchemaV2:
|
||||
// no need to migrate
|
||||
default:
|
||||
return fmt.Errorf("file info: unknown schema version (%s)", ver)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func NewFileInfoStore(store kvstore.IKVStore) (*FileInfoStore, error) {
|
||||
var err error
|
||||
for _, nsName := range []string{
|
||||
|
|
|
@ -41,6 +41,7 @@ type BgConfig struct {
|
|||
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 {
|
||||
|
|
|
@ -22,6 +22,7 @@ func TestSiteStore(t *testing.T) {
|
|||
Repeat: "no-repeat",
|
||||
Position: "fixed",
|
||||
Align: "center",
|
||||
BgColor: "#ccc",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
@ -62,6 +63,7 @@ func TestSiteStore(t *testing.T) {
|
|||
Repeat: "",
|
||||
Position: "",
|
||||
Align: "",
|
||||
BgColor: "",
|
||||
},
|
||||
},
|
||||
})
|
||||
|
|
|
@ -40,11 +40,14 @@ var (
|
|||
Repeat: "no-repeat",
|
||||
Position: "center",
|
||||
Align: "fixed",
|
||||
BgColor: "#ccc",
|
||||
},
|
||||
CSSURL: "",
|
||||
LanPackURL: "",
|
||||
Lan: "en_US",
|
||||
Theme: "light",
|
||||
Avatar: "",
|
||||
Email: "",
|
||||
}
|
||||
)
|
||||
|
||||
|
@ -99,10 +102,12 @@ func NewKVUserStore(store kvstore.IKVStore) (*KVUserStore, error) {
|
|||
}
|
||||
}
|
||||
|
||||
return &KVUserStore{
|
||||
usStore := &KVUserStore{
|
||||
store: store,
|
||||
mtx: &sync.RWMutex{},
|
||||
}, nil
|
||||
}
|
||||
|
||||
return usStore, nil
|
||||
}
|
||||
|
||||
func (us *KVUserStore) Init(rootName, rootPwd string) error {
|
||||
|
|
|
@ -8,6 +8,7 @@ import (
|
|||
"testing"
|
||||
|
||||
"github.com/ihexxa/quickshare/src/db"
|
||||
"github.com/ihexxa/quickshare/src/db/sitestore"
|
||||
"github.com/ihexxa/quickshare/src/kvstore/boltdbpvd"
|
||||
)
|
||||
|
||||
|
@ -37,6 +38,9 @@ func TestUserStores(t *testing.T) {
|
|||
if root.Quota.DownloadSpeedLimit != defaultDownloadSpeedLimit {
|
||||
t.Fatalf("incorrect root DownloadSpeedLimit")
|
||||
}
|
||||
if !db.ComparePreferences(root.Preferences, &DefaultPreferences) {
|
||||
t.Fatalf("incorrect preference %v %v", root.Preferences, DefaultPreferences)
|
||||
}
|
||||
|
||||
visitor, err := store.GetUser(1)
|
||||
if err != nil {
|
||||
|
@ -60,6 +64,9 @@ func TestUserStores(t *testing.T) {
|
|||
if visitor.Quota.DownloadSpeedLimit != visitorDownloadSpeedLimit {
|
||||
t.Fatalf("incorrect visitor DownloadSpeedLimit")
|
||||
}
|
||||
if !db.ComparePreferences(visitor.Preferences, &DefaultPreferences) {
|
||||
t.Fatalf("incorrect preference")
|
||||
}
|
||||
|
||||
id, name1 := uint64(2), "test_user1"
|
||||
pwd1, pwd2 := "666", "888"
|
||||
|
@ -178,6 +185,26 @@ func TestUserStores(t *testing.T) {
|
|||
t.Fatalf("used space not matched %d %d", user.UsedSpace, usedIncr-usedDecr)
|
||||
}
|
||||
|
||||
newPrefer := &db.Preferences{
|
||||
Bg: &sitestore.BgConfig{
|
||||
Url: "/url",
|
||||
Repeat: "repeat",
|
||||
Position: "pos",
|
||||
Align: "fixed",
|
||||
BgColor: "#333",
|
||||
},
|
||||
CSSURL: "/cssurl",
|
||||
LanPackURL: "lanPackURL",
|
||||
Lan: "zhCN",
|
||||
Theme: "dark",
|
||||
Avatar: "/avatar",
|
||||
Email: "foo@gmail.com",
|
||||
}
|
||||
err = store.SetPreferences(id, newPrefer)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
user, err = store.GetUserByName(name1)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
@ -200,6 +227,9 @@ func TestUserStores(t *testing.T) {
|
|||
if user.Quota.DownloadSpeedLimit != downLimit2 {
|
||||
t.Fatalf("down limit not matched %d %d", downLimit2, user.Quota.DownloadSpeedLimit)
|
||||
}
|
||||
if !db.ComparePreferences(user.Preferences, newPrefer) {
|
||||
t.Fatalf("preferences not matched %v %v", user.Preferences, newPrefer)
|
||||
}
|
||||
|
||||
err = store.DelUser(id)
|
||||
if err != nil {
|
||||
|
|
|
@ -128,6 +128,7 @@ func DefaultConfigStruct() *Config {
|
|||
Repeat: "repeat",
|
||||
Position: "fixed",
|
||||
Align: "center",
|
||||
BgColor: "#ccc",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
|
|
@ -119,6 +119,7 @@ func TestLoadCfg(t *testing.T) {
|
|||
Repeat: "1",
|
||||
Position: "1",
|
||||
Align: "1",
|
||||
BgColor: "1",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -184,6 +185,7 @@ func TestLoadCfg(t *testing.T) {
|
|||
Repeat: "4",
|
||||
Position: "4",
|
||||
Align: "4",
|
||||
BgColor: "4",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -249,6 +251,7 @@ func TestLoadCfg(t *testing.T) {
|
|||
Repeat: "4",
|
||||
Position: "4",
|
||||
Align: "4",
|
||||
BgColor: "4",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -314,6 +317,7 @@ func TestLoadCfg(t *testing.T) {
|
|||
Repeat: "no-repeat",
|
||||
Position: "top",
|
||||
Align: "scroll",
|
||||
BgColor: "", // the schema of the config from db is old
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -349,7 +353,7 @@ func TestLoadCfg(t *testing.T) {
|
|||
}
|
||||
|
||||
if !Equal(gotCfg, expectCfg) {
|
||||
t.Fatal("cfgs are not identical")
|
||||
t.Fatalf("%d, cfgs are not identical", i)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -170,6 +170,7 @@ func initDeps(cfg gocfg.ICfg) *depidx.Deps {
|
|||
Repeat: cfg.StringOr("Site.ClientCfg.Bg.Repeat", "repeat"),
|
||||
Position: cfg.StringOr("Site.ClientCfg.Bg.Position", "fixed"),
|
||||
Align: cfg.StringOr("Site.ClientCfg.Bg.Align", "center"),
|
||||
BgColor: cfg.StringOr("Site.ClientCfg.Bg.BgColor", "#ccc"),
|
||||
},
|
||||
},
|
||||
})
|
||||
|
|
|
@ -79,10 +79,11 @@ func TestSettingsHandlers(t *testing.T) {
|
|||
SiteName: "quickshare",
|
||||
SiteDesc: "quickshare",
|
||||
Bg: &sitestore.BgConfig{
|
||||
Url: "",
|
||||
Repeat: "",
|
||||
Position: "",
|
||||
Align: "",
|
||||
Url: "url",
|
||||
Repeat: "repeat",
|
||||
Position: "center",
|
||||
Align: "fixed",
|
||||
BgColor: "#ccc",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
|
|
@ -453,6 +453,7 @@ func TestUsersHandlers(t *testing.T) {
|
|||
Repeat: "no-repeat",
|
||||
Position: "center",
|
||||
Align: "fixed",
|
||||
BgColor: "#ccc",
|
||||
},
|
||||
CSSURL: "/cssurl",
|
||||
LanPackURL: "/lanpack",
|
||||
|
@ -463,6 +464,7 @@ func TestUsersHandlers(t *testing.T) {
|
|||
Repeat: "no-repeat2",
|
||||
Position: "center2",
|
||||
Align: "fixed2",
|
||||
BgColor: "#333",
|
||||
},
|
||||
CSSURL: "/cssurl2",
|
||||
LanPackURL: "/lanpack2",
|
||||
|
|
1
src/server/testdata/config_1.yml
vendored
1
src/server/testdata/config_1.yml
vendored
|
@ -46,6 +46,7 @@ site:
|
|||
repeat: "1"
|
||||
position: "1"
|
||||
align: "1"
|
||||
bgColor: "1"
|
||||
db:
|
||||
dbPath: "1"
|
||||
|
||||
|
|
1
src/server/testdata/config_4.yml
vendored
1
src/server/testdata/config_4.yml
vendored
|
@ -46,5 +46,6 @@ site:
|
|||
repeat: "4"
|
||||
position: "4"
|
||||
align: "4"
|
||||
bgColor: "4"
|
||||
db:
|
||||
dbPath: "4"
|
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