diff --git a/casdoor/adapter.go b/casdoor/adapter.go index fc3de3f..184571a 100644 --- a/casdoor/adapter.go +++ b/casdoor/adapter.go @@ -22,11 +22,7 @@ import ( "xorm.io/xorm" ) -var ( - adapter *Adapter = nil - Organization string - Application string -) +var adapter *Adapter type Session struct { SessionKey string `xorm:"char(64) notnull pk"` @@ -41,9 +37,6 @@ func InitCasdoorAdapter() { } adapter = NewAdapter(beego.AppConfig.String("driverName"), beego.AppConfig.String("dataSourceName"), beego.AppConfig.String("casdoorDbName")) - - Organization = beego.AppConfig.String("casdoorOrganization") - Application = beego.AppConfig.String("casdoorApplication") } // Adapter represents the MySQL adapter for policy storage. diff --git a/casdoor/resource.go b/casdoor/resource.go index ee2f6fd..0cf0674 100644 --- a/casdoor/resource.go +++ b/casdoor/resource.go @@ -15,15 +15,26 @@ package casdoor import ( + "fmt" + + "github.com/astaxie/beego" "github.com/casdoor/casdoor-go-sdk/casdoorsdk" ) -func ListResources(prefix string) ([]*casdoorsdk.Resource, error) { - res, err := casdoorsdk.GetResources("built-in", "admin", "", "", "", "") +func ListResources(provider string, prefix string) ([]*casdoorsdk.Resource, error) { + casdoorOrganization := beego.AppConfig.String("casdoorOrganization") + casdoorApplication := beego.AppConfig.String("casdoorApplication") + res, err := casdoorsdk.GetResources(casdoorOrganization, casdoorApplication, "provider", provider, "Casibase", "") return res, err } -func GetResource(key string) (*casdoorsdk.Resource, error) { - res, err := casdoorsdk.GetResourceEx("built-in", key) +func GetResource(provider string, key string) (*casdoorsdk.Resource, error) { + casdoorOrganization := beego.AppConfig.String("casdoorOrganization") + res, err := casdoorsdk.GetResourceEx(casdoorOrganization, key) + + if provider != res.Provider { + panic(fmt.Errorf("the resource's provider expected to be: %s, but got: %s", provider, res.Provider)) + } + return res, err } diff --git a/object/file.go b/object/file.go index ed1a010..85c4330 100644 --- a/object/file.go +++ b/object/file.go @@ -49,7 +49,7 @@ func AddFile(storeId string, key string, isLeaf bool, filename string, file mult } bs := fileBuffer.Bytes() - err = storage.PutObject(store.Bucket, objectKey, fileBuffer) + err = storage.PutObject(store.StorageProvider, objectKey, fileBuffer) if err != nil { return false, nil, err } @@ -60,7 +60,7 @@ func AddFile(storeId string, key string, isLeaf bool, filename string, file mult objectKey = strings.TrimLeft(objectKey, "/") fileBuffer = bytes.NewBuffer(nil) bs := fileBuffer.Bytes() - err = storage.PutObject(store.Bucket, objectKey, fileBuffer) + err = storage.PutObject(store.StorageProvider, objectKey, fileBuffer) if err != nil { return false, nil, err } @@ -79,18 +79,18 @@ func DeleteFile(storeId string, key string, isLeaf bool) (bool, error) { } if isLeaf { - err = storage.DeleteObject(store.Bucket, key) + err = storage.DeleteObject(store.StorageProvider, key) if err != nil { return false, err } } else { - objects, err := storage.ListObjects(store.Bucket, key) + objects, err := storage.ListObjects(store.StorageProvider, key) if err != nil { return false, err } for _, object := range objects { - err = storage.DeleteObject(store.Bucket, object.Key) + err = storage.DeleteObject(store.StorageProvider, object.Key) if err != nil { return false, err } diff --git a/object/store.go b/object/store.go index 8297afe..6b31da6 100644 --- a/object/store.go +++ b/object/store.go @@ -43,8 +43,7 @@ type Store struct { CreatedTime string `xorm:"varchar(100)" json:"createdTime"` DisplayName string `xorm:"varchar(100)" json:"displayName"` - Bucket string `xorm:"varchar(100)" json:"bucket"` - Domain string `xorm:"varchar(100)" json:"domain"` + StorageProvider string `xorm:"varchar(100)" json:"storageProvider"` FileTree *File `xorm:"mediumtext" json:"fileTree"` PropertiesMap map[string]*Properties `xorm:"mediumtext" json:"propertiesMap"` @@ -77,7 +76,7 @@ func GetDefaultStore(owner string) (*Store, error) { } for _, store := range stores { - if store.Domain != "https://cdn.example.com" { + if store.StorageProvider != "" { return store, nil } } diff --git a/object/store_provider.go b/object/store_provider.go index 5002106..d9437e5 100644 --- a/object/store_provider.go +++ b/object/store_provider.go @@ -80,7 +80,7 @@ func isObjectLeaf(object *storage.Object) bool { } func (store *Store) Populate() error { - objects, err := storage.ListObjects(store.Bucket, "") + objects, err := storage.ListObjects(store.StorageProvider, "") if err != nil { return err } @@ -123,7 +123,7 @@ func (store *Store) Populate() error { } func (store *Store) GetVideoData() ([]string, error) { - objects, err := storage.ListObjects(store.Bucket, "2023/视频附件") + objects, err := storage.ListObjects(store.StorageProvider, "2023/视频附件") if err != nil { return nil, err } @@ -134,7 +134,7 @@ func (store *Store) GetVideoData() ([]string, error) { continue } - url := fmt.Sprintf("%s/%s", store.Domain, object.Key) + url := fmt.Sprintf("%s/%s", store.StorageProvider, object.Key) res = append(res, url) } diff --git a/storage/storage.go b/storage/storage.go index 823c29c..6536c52 100644 --- a/storage/storage.go +++ b/storage/storage.go @@ -21,6 +21,7 @@ import ( "net/http" "time" + "github.com/astaxie/beego" "github.com/casbin/casibase/casdoor" "github.com/casbin/casibase/util" "github.com/casdoor/casdoor-go-sdk/casdoorsdk" @@ -32,8 +33,8 @@ type Object struct { Size int64 } -func ListObjects(bucketName string, prefix string) ([]*Object, error) { - resources, err := casdoor.ListResources(prefix) +func ListObjects(provider string, prefix string) ([]*Object, error) { + resources, err := casdoor.ListResources(provider, prefix) if err != nil { return nil, err } @@ -50,8 +51,8 @@ func ListObjects(bucketName string, prefix string) ([]*Object, error) { return res, nil } -func GetObject(bucketName string, key string) (io.ReadCloser, error) { - res, err := casdoor.GetResource(key) +func GetObject(provider string, key string) (io.ReadCloser, error) { + res, err := casdoor.GetResource(provider, key) if err != nil { return nil, err } @@ -64,7 +65,7 @@ func GetObject(bucketName string, key string) (io.ReadCloser, error) { return response.Body, nil } -func PutObject(bucketName string, key string, fileBuffer *bytes.Buffer) error { +func PutObject(provider string, key string, fileBuffer *bytes.Buffer) error { _, _, err := casdoorsdk.UploadResource("Casibase", "Casibase", "Casibase", fmt.Sprintf("/casibase/%s", key), fileBuffer.Bytes()) if err != nil { @@ -73,8 +74,9 @@ func PutObject(bucketName string, key string, fileBuffer *bytes.Buffer) error { return nil } -func DeleteObject(bucketName string, key string) error { - _, err := casdoorsdk.DeleteResource(util.GetIdFromOwnerAndName("built-in", fmt.Sprintf("/casibase/%s", key))) +func DeleteObject(provider string, key string) error { + casdoorOrganization := beego.AppConfig.String("casdoorOrganization") + _, err := casdoorsdk.DeleteResource(util.GetIdFromOwnerAndName(casdoorOrganization, fmt.Sprintf("/casibase/%s", key))) if err != nil { return err } diff --git a/storage/storage_test.go b/storage/storage_test.go index d29e6e1..c08ce12 100644 --- a/storage/storage_test.go +++ b/storage/storage_test.go @@ -30,7 +30,7 @@ func TestStorage(t *testing.T) { object.InitConfig() controllers.InitAuthConfig() - objects, err := storage.ListObjects("casibase", "") + objects, err := storage.ListObjects("provider_storage_casibase", "") if err != nil { panic(err) } diff --git a/web/src/StoreEditPage.js b/web/src/StoreEditPage.js index adc6d39..5758fa0 100644 --- a/web/src/StoreEditPage.js +++ b/web/src/StoreEditPage.js @@ -14,7 +14,6 @@ import React from "react"; import {Button, Card, Col, Input, Row} from "antd"; -import {LinkOutlined} from "@ant-design/icons"; import * as StoreBackend from "./backend/StoreBackend"; import * as Setting from "./Setting"; import i18next from "i18next"; @@ -99,21 +98,11 @@ class StoreEditPage extends React.Component { - {i18next.t("store:Bucket")}: + {i18next.t("store:Storage provider")}: - { - this.updateStoreField("bucket", e.target.value); - }} /> - - - - - {i18next.t("store:Domain")}: - - - } value={this.state.store.domain} onChange={e => { - this.updateStoreField("domain", e.target.value); + { + this.updateStoreField("storageProvider", e.target.value); }} /> diff --git a/web/src/StoreListPage.js b/web/src/StoreListPage.js index 20fac9b..71f89de 100644 --- a/web/src/StoreListPage.js +++ b/web/src/StoreListPage.js @@ -53,8 +53,7 @@ class StoreListPage extends React.Component { name: `store_${randomName}`, createdTime: moment().format(), displayName: `New Store - ${randomName}`, - bucket: `bucket-${this.state.stores.length}`, - domain: "https://cdn.example.com", + storageProvider: "", propertiesMap: {}, }; } @@ -117,6 +116,13 @@ class StoreListPage extends React.Component { // width: "600px", sorter: (a, b) => a.displayName.localeCompare(b.displayName), }, + { + title: i18next.t("store:Storage provider"), + dataIndex: "storageProvider", + key: "storageProvider", + width: "250px", + sorter: (a, b) => a.storageProvider.localeCompare(b.storageProvider), + }, { title: i18next.t("general:Action"), dataIndex: "action",