mirror of https://github.com/Xhofe/alist
feat: driver and account operate
parent
5b73b68eb5
commit
e1a2ed0436
|
@ -2,10 +2,10 @@ package local
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
|
||||||
"github.com/alist-org/alist/v3/internal/driver"
|
"github.com/alist-org/alist/v3/internal/driver"
|
||||||
"github.com/alist-org/alist/v3/internal/model"
|
"github.com/alist-org/alist/v3/internal/model"
|
||||||
"github.com/alist-org/alist/v3/pkg/utils"
|
"github.com/alist-org/alist/v3/pkg/utils"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
)
|
)
|
||||||
|
@ -24,15 +24,11 @@ func (d *Driver) Init(ctx context.Context, account model.Account) error {
|
||||||
addition := d.Account.Addition
|
addition := d.Account.Addition
|
||||||
err := utils.Json.UnmarshalFromString(addition, d.Addition)
|
err := utils.Json.UnmarshalFromString(addition, d.Addition)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error while unmarshal addition: %w", err)
|
return errors.Wrap(err, "error while unmarshal addition")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *Driver) Update(ctx context.Context, account model.Account) error {
|
|
||||||
return d.Init(ctx, account)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (d *Driver) Drop(ctx context.Context) error {
|
func (d *Driver) Drop(ctx context.Context) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -44,7 +40,7 @@ func (d *Driver) GetAddition() driver.Additional {
|
||||||
func (d *Driver) File(ctx context.Context, path string) (driver.FileInfo, error) {
|
func (d *Driver) File(ctx context.Context, path string) (driver.FileInfo, error) {
|
||||||
fullPath := filepath.Join(d.RootFolder, path)
|
fullPath := filepath.Join(d.RootFolder, path)
|
||||||
if !utils.Exists(fullPath) {
|
if !utils.Exists(fullPath) {
|
||||||
return nil, driver.ErrorObjectNotFound
|
return nil, errors.WithStack(driver.ErrorObjectNotFound)
|
||||||
}
|
}
|
||||||
f, err := os.Stat(fullPath)
|
f, err := os.Stat(fullPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
package local
|
package local
|
||||||
|
|
||||||
import "github.com/alist-org/alist/v3/internal/driver"
|
import (
|
||||||
|
"github.com/alist-org/alist/v3/internal/driver"
|
||||||
|
"github.com/alist-org/alist/v3/internal/operations"
|
||||||
|
)
|
||||||
|
|
||||||
type Addition struct {
|
type Addition struct {
|
||||||
RootFolder string `json:"root_folder" help:"root folder path" default:"/"`
|
RootFolder string `json:"root_folder" help:"root folder path" default:"/"`
|
||||||
|
@ -17,5 +20,5 @@ func New() driver.Driver {
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
driver.RegisterDriver(config, New)
|
operations.RegisterDriver(config, New)
|
||||||
}
|
}
|
||||||
|
|
3
go.mod
3
go.mod
|
@ -10,6 +10,8 @@ require (
|
||||||
github.com/go-playground/universal-translator v0.18.0 // indirect
|
github.com/go-playground/universal-translator v0.18.0 // indirect
|
||||||
github.com/go-playground/validator/v10 v10.11.0 // indirect
|
github.com/go-playground/validator/v10 v10.11.0 // indirect
|
||||||
github.com/goccy/go-json v0.9.7 // indirect
|
github.com/goccy/go-json v0.9.7 // indirect
|
||||||
|
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||||
|
github.com/jinzhu/now v1.1.5 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
github.com/leodido/go-urn v1.2.1 // indirect
|
github.com/leodido/go-urn v1.2.1 // indirect
|
||||||
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible // indirect
|
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible // indirect
|
||||||
|
@ -27,4 +29,5 @@ require (
|
||||||
golang.org/x/text v0.3.7 // indirect
|
golang.org/x/text v0.3.7 // indirect
|
||||||
google.golang.org/protobuf v1.28.0 // indirect
|
google.golang.org/protobuf v1.28.0 // indirect
|
||||||
gopkg.in/yaml.v2 v2.4.0 // indirect
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
||||||
|
gorm.io/gorm v1.23.5 // indirect
|
||||||
)
|
)
|
||||||
|
|
7
go.sum
7
go.sum
|
@ -19,6 +19,11 @@ github.com/goccy/go-json v0.9.7/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGF
|
||||||
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
|
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||||
|
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
||||||
|
github.com/jinzhu/now v1.1.4/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||||
|
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
|
||||||
|
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||||
|
@ -93,3 +98,5 @@ gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gorm.io/gorm v1.23.5 h1:TnlF26wScKSvknUC/Rn8t0NLLM22fypYBlvj1+aH6dM=
|
||||||
|
gorm.io/gorm v1.23.5/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
|
||||||
|
|
|
@ -14,10 +14,11 @@ type Driver interface {
|
||||||
|
|
||||||
type Meta interface {
|
type Meta interface {
|
||||||
Config() Config
|
Config() Config
|
||||||
|
// Init If already initialized, drop first
|
||||||
|
// need to unmarshal string to addition first
|
||||||
Init(ctx context.Context, account model.Account) error
|
Init(ctx context.Context, account model.Account) error
|
||||||
Update(ctx context.Context, account model.Account) error
|
|
||||||
Drop(ctx context.Context) error
|
Drop(ctx context.Context) error
|
||||||
// GetAccount transform additional field to string and assign to account's addition
|
// GetAccount just get raw account
|
||||||
GetAccount() model.Account
|
GetAccount() model.Account
|
||||||
GetAddition() Additional
|
GetAddition() Additional
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@ package model
|
||||||
|
|
||||||
type Account struct {
|
type Account struct {
|
||||||
ID uint `json:"id" gorm:"primaryKey"`
|
ID uint `json:"id" gorm:"primaryKey"`
|
||||||
VirtualPath string `json:"virtual_path"`
|
VirtualPath string `json:"virtual_path" gorm:"unique" binding:"required"`
|
||||||
Index int `json:"index"`
|
Index int `json:"index"`
|
||||||
Driver string `json:"driver"`
|
Driver string `json:"driver"`
|
||||||
Status string `json:"status"`
|
Status string `json:"status"`
|
||||||
|
|
|
@ -0,0 +1,93 @@
|
||||||
|
package operations
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"github.com/alist-org/alist/v3/internal/driver"
|
||||||
|
"github.com/alist-org/alist/v3/internal/model"
|
||||||
|
"github.com/alist-org/alist/v3/internal/store"
|
||||||
|
"github.com/alist-org/alist/v3/pkg/utils"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Although the driver type is stored,
|
||||||
|
// there is an account in each driver,
|
||||||
|
// so it should actually be an account, just wrapped by the driver
|
||||||
|
var accountsMap = map[string]driver.Driver{}
|
||||||
|
|
||||||
|
func GetAccountByVirtualPath(virtualPath string) (driver.Driver, error) {
|
||||||
|
accountDriver, ok := accountsMap[virtualPath]
|
||||||
|
if !ok {
|
||||||
|
return nil, errors.Errorf("no virtual path for an account is: %s", virtualPath)
|
||||||
|
}
|
||||||
|
return accountDriver, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateAccount Save the account to database so account can get an id
|
||||||
|
// then instantiate corresponding driver and save it in memory
|
||||||
|
func CreateAccount(ctx context.Context, account model.Account) error {
|
||||||
|
err := store.CreateAccount(&account)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WithMessage(err, "failed create account in database")
|
||||||
|
}
|
||||||
|
// already has an id
|
||||||
|
driverName := account.Driver
|
||||||
|
driverNew, err := GetDriverNew(driverName)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WithMessage(err, "failed get driver new")
|
||||||
|
}
|
||||||
|
accountDriver := driverNew()
|
||||||
|
err = accountDriver.Init(ctx, account)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WithMessage(err, "failed init account")
|
||||||
|
}
|
||||||
|
accountsMap[account.VirtualPath] = accountDriver
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateAccount update account
|
||||||
|
// get old account first
|
||||||
|
// drop the account then reinitialize
|
||||||
|
func UpdateAccount(ctx context.Context, account model.Account) error {
|
||||||
|
oldAccount, err := store.GetAccountById(account.ID)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WithMessage(err, "failed get old account")
|
||||||
|
}
|
||||||
|
err = store.UpdateAccount(&account)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WithMessage(err, "failed update account in database")
|
||||||
|
}
|
||||||
|
if oldAccount.VirtualPath != account.VirtualPath {
|
||||||
|
// virtual path renamed
|
||||||
|
delete(accountsMap, oldAccount.VirtualPath)
|
||||||
|
}
|
||||||
|
accountDriver, err := GetAccountByVirtualPath(oldAccount.VirtualPath)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WithMessage(err, "failed get account driver")
|
||||||
|
}
|
||||||
|
err = accountDriver.Drop(ctx)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WithMessage(err, "failed drop account")
|
||||||
|
}
|
||||||
|
err = accountDriver.Init(ctx, account)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WithMessage(err, "failed init account")
|
||||||
|
}
|
||||||
|
accountsMap[account.VirtualPath] = accountDriver
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SaveDriverAccount call from specific driver
|
||||||
|
func SaveDriverAccount(driver driver.Driver) error {
|
||||||
|
account := driver.GetAccount()
|
||||||
|
addition := driver.GetAddition()
|
||||||
|
bytes, err := utils.Json.Marshal(addition)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrap(err, "error while marshal addition")
|
||||||
|
}
|
||||||
|
account.Addition = string(bytes)
|
||||||
|
err = store.UpdateAccount(&account)
|
||||||
|
if err != nil {
|
||||||
|
return errors.WithMessage(err, "failed update account in database")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -1,78 +1,88 @@
|
||||||
package driver
|
package operations
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/alist-org/alist/v3/internal/driver"
|
||||||
|
"github.com/pkg/errors"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type New func() Driver
|
type New func() driver.Driver
|
||||||
|
|
||||||
var driversMap = map[string]New{}
|
var driverNewMap = map[string]New{}
|
||||||
var driverItemsMap = map[string]Items{}
|
var driverItemsMap = map[string]driver.Items{}
|
||||||
|
|
||||||
func RegisterDriver(config Config, driver New) {
|
func RegisterDriver(config driver.Config, driver New) {
|
||||||
log.Infof("register driver: [%s]", config.Name)
|
log.Infof("register driver: [%s]", config.Name)
|
||||||
registerDriverItems(config, driver().GetAddition())
|
registerDriverItems(config, driver().GetAddition())
|
||||||
driversMap[config.Name] = driver
|
driverNewMap[config.Name] = driver
|
||||||
}
|
}
|
||||||
|
|
||||||
func registerDriverItems(config Config, addition Additional) {
|
func GetDriverNew(name string) (New, error) {
|
||||||
|
n, ok := driverNewMap[name]
|
||||||
|
if !ok {
|
||||||
|
return nil, errors.Errorf("no driver named: %s", name)
|
||||||
|
}
|
||||||
|
return n, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func registerDriverItems(config driver.Config, addition driver.Additional) {
|
||||||
tAddition := reflect.TypeOf(addition)
|
tAddition := reflect.TypeOf(addition)
|
||||||
mainItems := getMainItems(config)
|
mainItems := getMainItems(config)
|
||||||
additionalItems := getAdditionalItems(tAddition)
|
additionalItems := getAdditionalItems(tAddition)
|
||||||
driverItemsMap[config.Name] = Items{mainItems, additionalItems}
|
driverItemsMap[config.Name] = driver.Items{mainItems, additionalItems}
|
||||||
}
|
}
|
||||||
|
|
||||||
func getMainItems(config Config) []Item {
|
func getMainItems(config driver.Config) []driver.Item {
|
||||||
items := []Item{{
|
items := []driver.Item{{
|
||||||
Name: "virtual_path",
|
Name: "virtual_path",
|
||||||
Type: TypeString,
|
Type: driver.TypeString,
|
||||||
Required: true,
|
Required: true,
|
||||||
Help: "",
|
Help: "",
|
||||||
}, {
|
}, {
|
||||||
Name: "index",
|
Name: "index",
|
||||||
Type: TypeNumber,
|
Type: driver.TypeNumber,
|
||||||
Help: "use to sort",
|
Help: "use to sort",
|
||||||
}, {
|
}, {
|
||||||
Name: "down_proxy_url",
|
Name: "down_proxy_url",
|
||||||
Type: TypeText,
|
Type: driver.TypeText,
|
||||||
}, {
|
}, {
|
||||||
Name: "webdav_direct",
|
Name: "webdav_direct",
|
||||||
Type: TypeBool,
|
Type: driver.TypeBool,
|
||||||
Help: "Transfer the WebDAV of this account through the native without redirect",
|
Help: "Transfer the WebDAV of this account through the native without redirect",
|
||||||
}}
|
}}
|
||||||
if !config.OnlyProxy && !config.OnlyLocal {
|
if !config.OnlyProxy && !config.OnlyLocal {
|
||||||
items = append(items, []Item{{
|
items = append(items, []driver.Item{{
|
||||||
Name: "web_proxy",
|
Name: "web_proxy",
|
||||||
Type: TypeBool,
|
Type: driver.TypeBool,
|
||||||
}, {
|
}, {
|
||||||
Name: "webdav_proxy",
|
Name: "webdav_proxy",
|
||||||
Type: TypeBool,
|
Type: driver.TypeBool,
|
||||||
},
|
},
|
||||||
}...)
|
}...)
|
||||||
}
|
}
|
||||||
if config.LocalSort {
|
if config.LocalSort {
|
||||||
items = append(items, []Item{{
|
items = append(items, []driver.Item{{
|
||||||
Name: "order_by",
|
Name: "order_by",
|
||||||
Type: TypeSelect,
|
Type: driver.TypeSelect,
|
||||||
Values: "name,size,modified",
|
Values: "name,size,modified",
|
||||||
}, {
|
}, {
|
||||||
Name: "order_direction",
|
Name: "order_direction",
|
||||||
Type: TypeSelect,
|
Type: driver.TypeSelect,
|
||||||
Values: "ASC,DESC",
|
Values: "ASC,DESC",
|
||||||
}}...)
|
}}...)
|
||||||
}
|
}
|
||||||
items = append(items, Item{
|
items = append(items, driver.Item{
|
||||||
Name: "extract_folder",
|
Name: "extract_folder",
|
||||||
Type: TypeSelect,
|
Type: driver.TypeSelect,
|
||||||
Values: "front,back",
|
Values: "front,back",
|
||||||
})
|
})
|
||||||
return items
|
return items
|
||||||
}
|
}
|
||||||
|
|
||||||
func getAdditionalItems(t reflect.Type) []Item {
|
func getAdditionalItems(t reflect.Type) []driver.Item {
|
||||||
var items []Item
|
var items []driver.Item
|
||||||
for i := 0; i < t.NumField(); i++ {
|
for i := 0; i < t.NumField(); i++ {
|
||||||
field := t.Field(i)
|
field := t.Field(i)
|
||||||
tag := field.Tag
|
tag := field.Tag
|
||||||
|
@ -80,7 +90,7 @@ func getAdditionalItems(t reflect.Type) []Item {
|
||||||
if !ok || ignore == "false" {
|
if !ok || ignore == "false" {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
item := Item{
|
item := driver.Item{
|
||||||
Name: tag.Get("json"),
|
Name: tag.Get("json"),
|
||||||
Type: strings.ToLower(field.Type.Name()),
|
Type: strings.ToLower(field.Type.Name()),
|
||||||
Default: tag.Get("default"),
|
Default: tag.Get("default"),
|
|
@ -0,0 +1,3 @@
|
||||||
|
package operations
|
||||||
|
|
||||||
|
var ()
|
|
@ -1,11 +1,40 @@
|
||||||
package store
|
package store
|
||||||
|
|
||||||
import "github.com/alist-org/alist/v3/internal/model"
|
import (
|
||||||
|
"github.com/alist-org/alist/v3/internal/model"
|
||||||
|
"github.com/pkg/errors"
|
||||||
|
)
|
||||||
|
|
||||||
type Account interface {
|
// CreateAccount just insert account to database
|
||||||
Create(account model.Account) error
|
func CreateAccount(account *model.Account) error {
|
||||||
Update(account model.Account) error
|
return errors.WithStack(db.Create(account).Error)
|
||||||
Delete(id uint) error
|
}
|
||||||
GetByID(id uint) (*model.Account, error)
|
|
||||||
List() ([]model.Account, error)
|
// UpdateAccount just update account in database
|
||||||
|
func UpdateAccount(account *model.Account) error {
|
||||||
|
return errors.WithStack(db.Save(account).Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeleteAccountById just delete account from database by id
|
||||||
|
func DeleteAccountById(id uint) error {
|
||||||
|
return errors.WithStack(db.Delete(&model.Account{}, id).Error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAccounts Get all accounts from database
|
||||||
|
func GetAccounts() ([]model.Account, error) {
|
||||||
|
var accounts []model.Account
|
||||||
|
if err := db.Order(columnName("index")).Find(&accounts).Error; err != nil {
|
||||||
|
return nil, errors.WithStack(err)
|
||||||
|
}
|
||||||
|
return accounts, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetAccountById Get Account by id, used to update account usually
|
||||||
|
func GetAccountById(id uint) (*model.Account, error) {
|
||||||
|
var account model.Account
|
||||||
|
account.ID = id
|
||||||
|
if err := db.First(&account).Error; err != nil {
|
||||||
|
return nil, errors.WithStack(err)
|
||||||
|
}
|
||||||
|
return &account, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
package store
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gorm.io/gorm"
|
||||||
|
)
|
||||||
|
|
||||||
|
var db gorm.DB
|
|
@ -0,0 +1,13 @@
|
||||||
|
package store
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/alist-org/alist/v3/conf"
|
||||||
|
)
|
||||||
|
|
||||||
|
func columnName(name string) string {
|
||||||
|
if conf.Conf.Database.Type == "postgres" {
|
||||||
|
return fmt.Sprintf(`"%s"`, name)
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("`%s`", name)
|
||||||
|
}
|
Loading…
Reference in New Issue