[db] add checkings for boltstore
This commit is contained in:
parent
41827f20c0
commit
d7f8fac07e
4 changed files with 50 additions and 8 deletions
|
@ -43,12 +43,20 @@ func (bs *BoltStore) getUserInfo(tx *bolt.Tx, userID uint64) (*db.User, error) {
|
||||||
return nil, fmt.Errorf("user id key(%d) info(%d) does match", userID, userInfo.ID)
|
return nil, fmt.Errorf("user id key(%d) info(%d) does match", userID, userInfo.ID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err = db.CheckUser(userInfo, true); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
return userInfo, nil
|
return userInfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bs *BoltStore) setUserInfo(tx *bolt.Tx, userID uint64, userInfo *db.User) error {
|
func (bs *BoltStore) setUserInfo(tx *bolt.Tx, userID uint64, userInfo *db.User) error {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
if err = db.CheckUser(userInfo, false); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
usersBucket := tx.Bucket([]byte(db.UsersNs))
|
usersBucket := tx.Bucket([]byte(db.UsersNs))
|
||||||
if usersBucket == nil {
|
if usersBucket == nil {
|
||||||
return db.ErrBucketNotFound
|
return db.ErrBucketNotFound
|
||||||
|
@ -131,12 +139,20 @@ func (bs *BoltStore) getFileInfo(tx *bolt.Tx, userID uint64, itemPath string) (*
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err = db.CheckFileInfo(fileInfo, true); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return fileInfo, nil
|
return fileInfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (bs *BoltStore) setFileInfo(tx *bolt.Tx, userID uint64, itemPath string, fileInfo *db.FileInfo) error {
|
func (bs *BoltStore) setFileInfo(tx *bolt.Tx, userID uint64, itemPath string, fileInfo *db.FileInfo) error {
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
if err = db.CheckFileInfo(fileInfo, false); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
fileInfoBucket := tx.Bucket([]byte(db.FileInfoNs))
|
fileInfoBucket := tx.Bucket([]byte(db.FileInfoNs))
|
||||||
if fileInfoBucket == nil {
|
if fileInfoBucket == nil {
|
||||||
return db.ErrBucketNotFound
|
return db.ErrBucketNotFound
|
||||||
|
|
|
@ -7,8 +7,6 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
SchemaV2 = "v2" // add size to file info
|
|
||||||
|
|
||||||
UserSchemaNs = "UserSchemaNs"
|
UserSchemaNs = "UserSchemaNs"
|
||||||
FileSchemaNs = "FileSchemaNs"
|
FileSchemaNs = "FileSchemaNs"
|
||||||
UserIDsNs = "UserIDsNs"
|
UserIDsNs = "UserIDsNs"
|
||||||
|
@ -27,6 +25,7 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
ErrInvalidFileInfo = errors.New("invalid fileInfo")
|
||||||
ErrInvalidUser = errors.New("invalid user")
|
ErrInvalidUser = errors.New("invalid user")
|
||||||
ErrInvalidQuota = errors.New("invalid quota")
|
ErrInvalidQuota = errors.New("invalid quota")
|
||||||
ErrInvalidPreferences = errors.New("invalid preferences")
|
ErrInvalidPreferences = errors.New("invalid preferences")
|
||||||
|
@ -206,6 +205,7 @@ func CheckSiteCfg(cfg *SiteConfig, fillDefault bool) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: check upper and lower limit
|
||||||
func CheckQuota(quota *Quota) error {
|
func CheckQuota(quota *Quota) error {
|
||||||
if quota.SpaceLimit < 0 {
|
if quota.SpaceLimit < 0 {
|
||||||
return ErrInvalidQuota
|
return ErrInvalidQuota
|
||||||
|
@ -241,6 +241,7 @@ func CheckPreferences(prefers *Preferences, fillDefault bool) error {
|
||||||
if prefers.Avatar == "" {
|
if prefers.Avatar == "" {
|
||||||
prefers.Avatar = DefaultAvatar
|
prefers.Avatar = DefaultAvatar
|
||||||
}
|
}
|
||||||
|
// TODO: add strict checking
|
||||||
if prefers.Email == "" {
|
if prefers.Email == "" {
|
||||||
prefers.Email = DefaultEmail
|
prefers.Email = DefaultEmail
|
||||||
}
|
}
|
||||||
|
@ -314,3 +315,14 @@ func CheckUser(user *User, fillDefault bool) error {
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: auto trigger hash generating
|
||||||
|
func CheckFileInfo(info *FileInfo, fillDefault bool) error {
|
||||||
|
if (info.Shared && info.ShareID == "") || (!info.Shared && info.ShareID != "") {
|
||||||
|
return fmt.Errorf("shared and ShareID are in conflict: %w", ErrInvalidFileInfo)
|
||||||
|
}
|
||||||
|
if !info.IsDir && (info.Shared || info.ShareID != "") {
|
||||||
|
return fmt.Errorf("dir can not be shared: %w", ErrInvalidFileInfo)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
|
@ -85,6 +85,10 @@ func (fi *FileInfoStore) getInfo(itemPath string) (*db.FileInfo, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("get file info: %w", err)
|
return nil, fmt.Errorf("get file info: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err = db.CheckFileInfo(info, true); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
return info, nil
|
return info, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,10 +102,14 @@ func (fi *FileInfoStore) GetInfos(itemPaths []string) (map[string]*db.FileInfo,
|
||||||
info, err := fi.getInfo(itemPath)
|
info, err := fi.getInfo(itemPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if !errors.Is(err, ErrNotFound) {
|
if !errors.Is(err, ErrNotFound) {
|
||||||
|
// TODO: try to make info data consistent with fs
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
if err = db.CheckFileInfo(info, true); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
infos[itemPath] = info
|
infos[itemPath] = info
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,6 +117,10 @@ func (fi *FileInfoStore) GetInfos(itemPaths []string) (map[string]*db.FileInfo,
|
||||||
}
|
}
|
||||||
|
|
||||||
func (fi *FileInfoStore) setInfo(itemPath string, info *db.FileInfo) error {
|
func (fi *FileInfoStore) setInfo(itemPath string, info *db.FileInfo) error {
|
||||||
|
if err := db.CheckFileInfo(info, false); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
infoStr, err := json.Marshal(info)
|
infoStr, err := json.Marshal(info)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("set file info: %w", err)
|
return fmt.Errorf("set file info: %w", err)
|
||||||
|
|
|
@ -100,11 +100,13 @@ func TestUserStores(t *testing.T) {
|
||||||
pathInfos := map[string]*db.FileInfo{
|
pathInfos := map[string]*db.FileInfo{
|
||||||
"admin/item": &db.FileInfo{
|
"admin/item": &db.FileInfo{
|
||||||
Shared: false,
|
Shared: false,
|
||||||
|
ShareID: "",
|
||||||
IsDir: false,
|
IsDir: false,
|
||||||
Sha1: "file",
|
Sha1: "file",
|
||||||
},
|
},
|
||||||
"admin/dir": &db.FileInfo{
|
"admin/dir": &db.FileInfo{
|
||||||
Shared: true,
|
Shared: true,
|
||||||
|
ShareID: "mockedShareID",
|
||||||
IsDir: true,
|
IsDir: true,
|
||||||
Sha1: "dir",
|
Sha1: "dir",
|
||||||
},
|
},
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue