Rename bucket to storage provider
This commit is contained in:
parent
9c3f8aed8b
commit
23a2de182f
|
@ -22,11 +22,7 @@ import (
|
||||||
"xorm.io/xorm"
|
"xorm.io/xorm"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var adapter *Adapter
|
||||||
adapter *Adapter = nil
|
|
||||||
Organization string
|
|
||||||
Application string
|
|
||||||
)
|
|
||||||
|
|
||||||
type Session struct {
|
type Session struct {
|
||||||
SessionKey string `xorm:"char(64) notnull pk"`
|
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"))
|
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.
|
// Adapter represents the MySQL adapter for policy storage.
|
||||||
|
|
|
@ -15,15 +15,26 @@
|
||||||
package casdoor
|
package casdoor
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/astaxie/beego"
|
||||||
"github.com/casdoor/casdoor-go-sdk/casdoorsdk"
|
"github.com/casdoor/casdoor-go-sdk/casdoorsdk"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ListResources(prefix string) ([]*casdoorsdk.Resource, error) {
|
func ListResources(provider string, prefix string) ([]*casdoorsdk.Resource, error) {
|
||||||
res, err := casdoorsdk.GetResources("built-in", "admin", "", "", "", "")
|
casdoorOrganization := beego.AppConfig.String("casdoorOrganization")
|
||||||
|
casdoorApplication := beego.AppConfig.String("casdoorApplication")
|
||||||
|
res, err := casdoorsdk.GetResources(casdoorOrganization, casdoorApplication, "provider", provider, "Casibase", "")
|
||||||
return res, err
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetResource(key string) (*casdoorsdk.Resource, error) {
|
func GetResource(provider string, key string) (*casdoorsdk.Resource, error) {
|
||||||
res, err := casdoorsdk.GetResourceEx("built-in", key)
|
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
|
return res, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ func AddFile(storeId string, key string, isLeaf bool, filename string, file mult
|
||||||
}
|
}
|
||||||
|
|
||||||
bs := fileBuffer.Bytes()
|
bs := fileBuffer.Bytes()
|
||||||
err = storage.PutObject(store.Bucket, objectKey, fileBuffer)
|
err = storage.PutObject(store.StorageProvider, objectKey, fileBuffer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, nil, err
|
return false, nil, err
|
||||||
}
|
}
|
||||||
|
@ -60,7 +60,7 @@ func AddFile(storeId string, key string, isLeaf bool, filename string, file mult
|
||||||
objectKey = strings.TrimLeft(objectKey, "/")
|
objectKey = strings.TrimLeft(objectKey, "/")
|
||||||
fileBuffer = bytes.NewBuffer(nil)
|
fileBuffer = bytes.NewBuffer(nil)
|
||||||
bs := fileBuffer.Bytes()
|
bs := fileBuffer.Bytes()
|
||||||
err = storage.PutObject(store.Bucket, objectKey, fileBuffer)
|
err = storage.PutObject(store.StorageProvider, objectKey, fileBuffer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, nil, err
|
return false, nil, err
|
||||||
}
|
}
|
||||||
|
@ -79,18 +79,18 @@ func DeleteFile(storeId string, key string, isLeaf bool) (bool, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if isLeaf {
|
if isLeaf {
|
||||||
err = storage.DeleteObject(store.Bucket, key)
|
err = storage.DeleteObject(store.StorageProvider, key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
objects, err := storage.ListObjects(store.Bucket, key)
|
objects, err := storage.ListObjects(store.StorageProvider, key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, object := range objects {
|
for _, object := range objects {
|
||||||
err = storage.DeleteObject(store.Bucket, object.Key)
|
err = storage.DeleteObject(store.StorageProvider, object.Key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,8 +43,7 @@ type Store struct {
|
||||||
CreatedTime string `xorm:"varchar(100)" json:"createdTime"`
|
CreatedTime string `xorm:"varchar(100)" json:"createdTime"`
|
||||||
DisplayName string `xorm:"varchar(100)" json:"displayName"`
|
DisplayName string `xorm:"varchar(100)" json:"displayName"`
|
||||||
|
|
||||||
Bucket string `xorm:"varchar(100)" json:"bucket"`
|
StorageProvider string `xorm:"varchar(100)" json:"storageProvider"`
|
||||||
Domain string `xorm:"varchar(100)" json:"domain"`
|
|
||||||
|
|
||||||
FileTree *File `xorm:"mediumtext" json:"fileTree"`
|
FileTree *File `xorm:"mediumtext" json:"fileTree"`
|
||||||
PropertiesMap map[string]*Properties `xorm:"mediumtext" json:"propertiesMap"`
|
PropertiesMap map[string]*Properties `xorm:"mediumtext" json:"propertiesMap"`
|
||||||
|
@ -77,7 +76,7 @@ func GetDefaultStore(owner string) (*Store, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, store := range stores {
|
for _, store := range stores {
|
||||||
if store.Domain != "https://cdn.example.com" {
|
if store.StorageProvider != "" {
|
||||||
return store, nil
|
return store, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,7 +80,7 @@ func isObjectLeaf(object *storage.Object) bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (store *Store) Populate() error {
|
func (store *Store) Populate() error {
|
||||||
objects, err := storage.ListObjects(store.Bucket, "")
|
objects, err := storage.ListObjects(store.StorageProvider, "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -123,7 +123,7 @@ func (store *Store) Populate() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (store *Store) GetVideoData() ([]string, error) {
|
func (store *Store) GetVideoData() ([]string, error) {
|
||||||
objects, err := storage.ListObjects(store.Bucket, "2023/视频附件")
|
objects, err := storage.ListObjects(store.StorageProvider, "2023/视频附件")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -134,7 +134,7 @@ func (store *Store) GetVideoData() ([]string, error) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
url := fmt.Sprintf("%s/%s", store.Domain, object.Key)
|
url := fmt.Sprintf("%s/%s", store.StorageProvider, object.Key)
|
||||||
res = append(res, url)
|
res = append(res, url)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ import (
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/astaxie/beego"
|
||||||
"github.com/casbin/casibase/casdoor"
|
"github.com/casbin/casibase/casdoor"
|
||||||
"github.com/casbin/casibase/util"
|
"github.com/casbin/casibase/util"
|
||||||
"github.com/casdoor/casdoor-go-sdk/casdoorsdk"
|
"github.com/casdoor/casdoor-go-sdk/casdoorsdk"
|
||||||
|
@ -32,8 +33,8 @@ type Object struct {
|
||||||
Size int64
|
Size int64
|
||||||
}
|
}
|
||||||
|
|
||||||
func ListObjects(bucketName string, prefix string) ([]*Object, error) {
|
func ListObjects(provider string, prefix string) ([]*Object, error) {
|
||||||
resources, err := casdoor.ListResources(prefix)
|
resources, err := casdoor.ListResources(provider, prefix)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -50,8 +51,8 @@ func ListObjects(bucketName string, prefix string) ([]*Object, error) {
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetObject(bucketName string, key string) (io.ReadCloser, error) {
|
func GetObject(provider string, key string) (io.ReadCloser, error) {
|
||||||
res, err := casdoor.GetResource(key)
|
res, err := casdoor.GetResource(provider, key)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -64,7 +65,7 @@ func GetObject(bucketName string, key string) (io.ReadCloser, error) {
|
||||||
return response.Body, nil
|
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",
|
_, _, err := casdoorsdk.UploadResource("Casibase", "Casibase", "Casibase",
|
||||||
fmt.Sprintf("/casibase/%s", key), fileBuffer.Bytes())
|
fmt.Sprintf("/casibase/%s", key), fileBuffer.Bytes())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -73,8 +74,9 @@ func PutObject(bucketName string, key string, fileBuffer *bytes.Buffer) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func DeleteObject(bucketName string, key string) error {
|
func DeleteObject(provider string, key string) error {
|
||||||
_, err := casdoorsdk.DeleteResource(util.GetIdFromOwnerAndName("built-in", fmt.Sprintf("/casibase/%s", key)))
|
casdoorOrganization := beego.AppConfig.String("casdoorOrganization")
|
||||||
|
_, err := casdoorsdk.DeleteResource(util.GetIdFromOwnerAndName(casdoorOrganization, fmt.Sprintf("/casibase/%s", key)))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,7 +30,7 @@ func TestStorage(t *testing.T) {
|
||||||
object.InitConfig()
|
object.InitConfig()
|
||||||
controllers.InitAuthConfig()
|
controllers.InitAuthConfig()
|
||||||
|
|
||||||
objects, err := storage.ListObjects("casibase", "")
|
objects, err := storage.ListObjects("provider_storage_casibase", "")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
|
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import {Button, Card, Col, Input, Row} from "antd";
|
import {Button, Card, Col, Input, Row} from "antd";
|
||||||
import {LinkOutlined} from "@ant-design/icons";
|
|
||||||
import * as StoreBackend from "./backend/StoreBackend";
|
import * as StoreBackend from "./backend/StoreBackend";
|
||||||
import * as Setting from "./Setting";
|
import * as Setting from "./Setting";
|
||||||
import i18next from "i18next";
|
import i18next from "i18next";
|
||||||
|
@ -99,21 +98,11 @@ class StoreEditPage extends React.Component {
|
||||||
</Row>
|
</Row>
|
||||||
<Row style={{marginTop: "20px"}} >
|
<Row style={{marginTop: "20px"}} >
|
||||||
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
|
||||||
{i18next.t("store:Bucket")}:
|
{i18next.t("store:Storage provider")}:
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={22} >
|
<Col span={22} >
|
||||||
<Input value={this.state.store.bucket} onChange={e => {
|
<Input value={this.state.store.storageProvider} onChange={e => {
|
||||||
this.updateStoreField("bucket", e.target.value);
|
this.updateStoreField("storageProvider", 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);
|
|
||||||
}} />
|
}} />
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
|
|
|
@ -53,8 +53,7 @@ class StoreListPage extends React.Component {
|
||||||
name: `store_${randomName}`,
|
name: `store_${randomName}`,
|
||||||
createdTime: moment().format(),
|
createdTime: moment().format(),
|
||||||
displayName: `New Store - ${randomName}`,
|
displayName: `New Store - ${randomName}`,
|
||||||
bucket: `bucket-${this.state.stores.length}`,
|
storageProvider: "",
|
||||||
domain: "https://cdn.example.com",
|
|
||||||
propertiesMap: {},
|
propertiesMap: {},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -117,6 +116,13 @@ class StoreListPage extends React.Component {
|
||||||
// width: "600px",
|
// width: "600px",
|
||||||
sorter: (a, b) => a.displayName.localeCompare(b.displayName),
|
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"),
|
title: i18next.t("general:Action"),
|
||||||
dataIndex: "action",
|
dataIndex: "action",
|
||||||
|
|
Loading…
Reference in New Issue