✨ Implement user-by-share, login-by-share and share-by-user retrieval
This commit is contained in:
@@ -53,6 +53,8 @@ type ShareStore interface {
|
||||
RemoveLogin(share Share, username string, loginName string) error
|
||||
|
||||
GetShares() ([]Share, error)
|
||||
GetShareUsers(share Share) ([]ShareUser, error)
|
||||
GetShareLogins(share Share, username string) ([]Login, error)
|
||||
|
||||
FindShareByLogin(username, loginName string) (LoginShare, error)
|
||||
FindSharesByUser(username string) ([]UserShare, error)
|
||||
@@ -497,6 +499,44 @@ func (store *DBStore) GetShares() (shares []Share, err error) {
|
||||
return shares, err
|
||||
}
|
||||
|
||||
func (store *DBStore) GetShareUsers(share Share) (shareUsers []ShareUser, err error) {
|
||||
err = store.db.View(func(tx *buntdb.Tx) error {
|
||||
usersPrefix := share.userKey("")
|
||||
if err := tx.AscendKeys(usersPrefix+"*", func(key, value string) bool {
|
||||
var shareUser ShareUser
|
||||
shareUser.Username = strings.TrimPrefix(key, usersPrefix)
|
||||
shareUser.Role = ShareRole(value)
|
||||
shareUsers = append(shareUsers, shareUser)
|
||||
return true
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
func (store *DBStore) GetShareLogins(share Share, username string) (logins []Login, err error) {
|
||||
err = store.db.View(func(tx *buntdb.Tx) error {
|
||||
var processingErr error
|
||||
|
||||
loginsPrefix := share.loginKey(username, "")
|
||||
if err := tx.AscendKeys(loginsPrefix+"*", func(key, value string) bool {
|
||||
var login Login
|
||||
if err := json.Unmarshal([]byte(value), &login); err != nil {
|
||||
processingErr = err
|
||||
return false
|
||||
}
|
||||
logins = append(logins, login)
|
||||
return true
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
return processingErr
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
func (store *DBStore) FindShareByLogin(username, loginName string) (loginShare LoginShare, err error) {
|
||||
err = store.db.View(func(tx *buntdb.Tx) error {
|
||||
shareIdString, err := tx.Get(loginSharePrefix + username + ":" + loginName)
|
||||
@@ -549,8 +589,39 @@ func (store *DBStore) FindShareByLogin(username, loginName string) (loginShare L
|
||||
return
|
||||
}
|
||||
|
||||
func (store *DBStore) FindSharesByUser(username string) ([]UserShare, error) {
|
||||
panic("implement me")
|
||||
func (store *DBStore) FindSharesByUser(username string) (userShares []UserShare, err error) {
|
||||
prefix := shareuserPrefix
|
||||
suffix := ":" + username
|
||||
|
||||
err = store.db.View(func(tx *buntdb.Tx) error {
|
||||
var processingError error
|
||||
if err := tx.AscendKeys(prefix+"*"+suffix, func(key, value string) bool {
|
||||
var userShare UserShare
|
||||
shareIdString := strings.TrimSuffix(strings.TrimPrefix(key, prefix), suffix)
|
||||
|
||||
if sharePayload, err := tx.Get(sharePrefix + shareIdString); err == buntdb.ErrNotFound {
|
||||
// TODO report inconsistency
|
||||
processingError = ErrShareNotFound
|
||||
return false
|
||||
} else if err != nil {
|
||||
processingError = err
|
||||
return false
|
||||
} else if err := json.Unmarshal([]byte(sharePayload), &userShare.Share); err != nil {
|
||||
processingError = fmt.Errorf("cannot unmarshal share: %w", err)
|
||||
return false
|
||||
}
|
||||
|
||||
userShare.Role = ShareRole(value)
|
||||
|
||||
userShares = append(userShares, userShare)
|
||||
|
||||
return true
|
||||
}); err != nil {
|
||||
return err
|
||||
}
|
||||
return processingError
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
func unmarshalShare(idString, payload string) (Share, error) {
|
||||
|
||||
Reference in New Issue
Block a user