[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)
|
||||
}
|
||||
|
||||
if err = db.CheckUser(userInfo, true); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return userInfo, nil
|
||||
}
|
||||
|
||||
func (bs *BoltStore) setUserInfo(tx *bolt.Tx, userID uint64, userInfo *db.User) error {
|
||||
var err error
|
||||
|
||||
if err = db.CheckUser(userInfo, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
usersBucket := tx.Bucket([]byte(db.UsersNs))
|
||||
if usersBucket == nil {
|
||||
return db.ErrBucketNotFound
|
||||
|
@ -131,12 +139,20 @@ func (bs *BoltStore) getFileInfo(tx *bolt.Tx, userID uint64, itemPath string) (*
|
|||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err = db.CheckFileInfo(fileInfo, true); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return fileInfo, nil
|
||||
}
|
||||
|
||||
func (bs *BoltStore) setFileInfo(tx *bolt.Tx, userID uint64, itemPath string, fileInfo *db.FileInfo) error {
|
||||
var err error
|
||||
|
||||
if err = db.CheckFileInfo(fileInfo, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
fileInfoBucket := tx.Bucket([]byte(db.FileInfoNs))
|
||||
if fileInfoBucket == nil {
|
||||
return db.ErrBucketNotFound
|
||||
|
|
|
@ -7,8 +7,6 @@ import (
|
|||
)
|
||||
|
||||
const (
|
||||
SchemaV2 = "v2" // add size to file info
|
||||
|
||||
UserSchemaNs = "UserSchemaNs"
|
||||
FileSchemaNs = "FileSchemaNs"
|
||||
UserIDsNs = "UserIDsNs"
|
||||
|
@ -27,6 +25,7 @@ const (
|
|||
)
|
||||
|
||||
var (
|
||||
ErrInvalidFileInfo = errors.New("invalid fileInfo")
|
||||
ErrInvalidUser = errors.New("invalid user")
|
||||
ErrInvalidQuota = errors.New("invalid quota")
|
||||
ErrInvalidPreferences = errors.New("invalid preferences")
|
||||
|
@ -206,6 +205,7 @@ func CheckSiteCfg(cfg *SiteConfig, fillDefault bool) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
// TODO: check upper and lower limit
|
||||
func CheckQuota(quota *Quota) error {
|
||||
if quota.SpaceLimit < 0 {
|
||||
return ErrInvalidQuota
|
||||
|
@ -241,6 +241,7 @@ func CheckPreferences(prefers *Preferences, fillDefault bool) error {
|
|||
if prefers.Avatar == "" {
|
||||
prefers.Avatar = DefaultAvatar
|
||||
}
|
||||
// TODO: add strict checking
|
||||
if prefers.Email == "" {
|
||||
prefers.Email = DefaultEmail
|
||||
}
|
||||
|
@ -314,3 +315,14 @@ func CheckUser(user *User, fillDefault bool) error {
|
|||
|
||||
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 {
|
||||
return nil, fmt.Errorf("get file info: %w", err)
|
||||
}
|
||||
|
||||
if err = db.CheckFileInfo(info, true); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return info, nil
|
||||
}
|
||||
|
||||
|
@ -98,10 +102,14 @@ func (fi *FileInfoStore) GetInfos(itemPaths []string) (map[string]*db.FileInfo,
|
|||
info, err := fi.getInfo(itemPath)
|
||||
if err != nil {
|
||||
if !errors.Is(err, ErrNotFound) {
|
||||
// TODO: try to make info data consistent with fs
|
||||
return nil, err
|
||||
}
|
||||
continue
|
||||
}
|
||||
if err = db.CheckFileInfo(info, true); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
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 {
|
||||
if err := db.CheckFileInfo(info, false); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
infoStr, err := json.Marshal(info)
|
||||
if err != nil {
|
||||
return fmt.Errorf("set file info: %w", err)
|
||||
|
|
|
@ -99,14 +99,16 @@ func TestUserStores(t *testing.T) {
|
|||
testInfoMethods := func(t *testing.T, store IFileInfoStore) {
|
||||
pathInfos := map[string]*db.FileInfo{
|
||||
"admin/item": &db.FileInfo{
|
||||
Shared: false,
|
||||
IsDir: false,
|
||||
Sha1: "file",
|
||||
Shared: false,
|
||||
ShareID: "",
|
||||
IsDir: false,
|
||||
Sha1: "file",
|
||||
},
|
||||
"admin/dir": &db.FileInfo{
|
||||
Shared: true,
|
||||
IsDir: true,
|
||||
Sha1: "dir",
|
||||
Shared: true,
|
||||
ShareID: "mockedShareID",
|
||||
IsDir: true,
|
||||
Sha1: "dir",
|
||||
},
|
||||
}
|
||||
var err error
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue