| @@ -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. | |||
| @@ -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 | |||
| } | |||
| @@ -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 | |||
| } | |||
| @@ -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 | |||
| } | |||
| } | |||
| @@ -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) | |||
| } | |||
| @@ -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 | |||
| } | |||
| @@ -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) | |||
| } | |||
| @@ -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 { | |||
| </Row> | |||
| <Row style={{marginTop: "20px"}} > | |||
| <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> | |||
| {i18next.t("store:Bucket")}: | |||
| {i18next.t("store:Storage provider")}: | |||
| </Col> | |||
| <Col span={22} > | |||
| <Input value={this.state.store.bucket} onChange={e => { | |||
| this.updateStoreField("bucket", e.target.value); | |||
| }} /> | |||
| </Col> | |||
| </Row> | |||
| <Row style={{marginTop: "20px"}} > | |||
| <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> | |||
| {i18next.t("store:Domain")}: | |||
| </Col> | |||
| <Col span={22} > | |||
| <Input prefix={<LinkOutlined />} value={this.state.store.domain} onChange={e => { | |||
| this.updateStoreField("domain", e.target.value); | |||
| <Input value={this.state.store.storageProvider} onChange={e => { | |||
| this.updateStoreField("storageProvider", e.target.value); | |||
| }} /> | |||
| </Col> | |||
| </Row> | |||
| @@ -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", | |||