Skip to content

Commit

Permalink
feat: get accounts by path
Browse files Browse the repository at this point in the history
  • Loading branch information
xhofe committed Jun 9, 2022
1 parent e1a2ed0 commit 164dab4
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 8 deletions.
17 changes: 10 additions & 7 deletions internal/model/account.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package model

import "time"

type Account struct {
ID uint `json:"id" gorm:"primaryKey"`
VirtualPath string `json:"virtual_path" gorm:"unique" binding:"required"`
Index int `json:"index"`
Driver string `json:"driver"`
Status string `json:"status"`
Addition string `json:"addition"`
Remark string `json:"remark"`
ID uint `json:"id" gorm:"primaryKey"`
VirtualPath string `json:"virtual_path" gorm:"unique" binding:"required"`
Index int `json:"index"`
Driver string `json:"driver"`
Status string `json:"status"`
Addition string `json:"addition"`
Remark string `json:"remark"`
Modified time.Time `json:"modified"`
Sort
Proxy
}
Expand Down
41 changes: 41 additions & 0 deletions internal/operations/account.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import (
"github.com/alist-org/alist/v3/internal/store"
"github.com/alist-org/alist/v3/pkg/utils"
"github.com/pkg/errors"
"sort"
"strings"
)

// Although the driver type is stored,
Expand Down Expand Up @@ -91,3 +93,42 @@ func SaveDriverAccount(driver driver.Driver) error {
}
return nil
}

var balance = ".balance"

// GetAccountsByPath get account by longest match path, contains balance account.
// for example, there is /a/b,/a/c,/a/d/e,/a/d/e.balance
// GetAccountsByPath(/a/d/e/f) => /a/d/e,/a/d/e.balance
func GetAccountsByPath(path string) []driver.Driver {
accounts := make([]driver.Driver, 0)
curSlashCount := 0
for _, v := range accountsMap {
virtualPath := utils.StandardizationPath(v.GetAccount().VirtualPath)
bIndex := strings.LastIndex(virtualPath, balance)
if bIndex != -1 {
virtualPath = virtualPath[:bIndex]
}
if virtualPath == "/" {
virtualPath = ""
}
// not this
if path != virtualPath && !strings.HasPrefix(path, virtualPath+"/") {
continue
}
slashCount := strings.Count(virtualPath, "/")
// not the longest match
if slashCount < curSlashCount {
continue
}
if slashCount > curSlashCount {
accounts = accounts[:0]
curSlashCount = slashCount
}
accounts = append(accounts, v)
}
// make sure the order is the same for same input
sort.Slice(accounts, func(i, j int) bool {
return accounts[i].GetAccount().VirtualPath < accounts[j].GetAccount().VirtualPath
})
return accounts
}
2 changes: 1 addition & 1 deletion internal/store/account.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ func DeleteAccountById(id uint) error {
return errors.WithStack(db.Delete(&model.Account{}, id).Error)
}

// GetAccounts Get all accounts from database
// GetAccounts Get all accounts from database order by index
func GetAccounts() ([]model.Account, error) {
var accounts []model.Account
if err := db.Order(columnName("index")).Find(&accounts).Error; err != nil {
Expand Down
12 changes: 12 additions & 0 deletions pkg/utils/path.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package utils

import "strings"

// StandardizationPath convert path like '/' '/root' '/a/b'
func StandardizationPath(path string) string {
path = strings.TrimSuffix(path, "/")
if !strings.HasPrefix(path, "/") {
path = "/" + path
}
return path
}

0 comments on commit 164dab4

Please sign in to comment.