From 7884e10ca31675a095057f80751821e416fbe141 Mon Sep 17 00:00:00 2001 From: Yang Luo Date: Sun, 18 Jun 2023 00:22:12 +0800 Subject: [PATCH] Refactor adapter's owner and organization --- controllers/casbin_adapter.go | 45 ++++++++++++++++++++++++++++--- object/casbin_adapter.go | 23 +++++++++------- object/organization.go | 1 - web/src/AdapterEditPage.js | 17 ++++++------ web/src/AdapterListPage.js | 13 +++++---- web/src/backend/AdapterBackend.js | 4 +-- 6 files changed, 70 insertions(+), 33 deletions(-) diff --git a/controllers/casbin_adapter.go b/controllers/casbin_adapter.go index 34b2319e..427803c3 100644 --- a/controllers/casbin_adapter.go +++ b/controllers/casbin_adapter.go @@ -23,6 +23,13 @@ import ( xormadapter "github.com/casdoor/xorm-adapter/v3" ) +// GetCasbinAdapters +// @Title GetCasbinAdapters +// @Tag Adapter API +// @Description get adapters +// @Param owner query string true "The owner of adapters" +// @Success 200 {array} object.Adapter The Response object +// @router /get-adapters [get] func (c *ApiController) GetCasbinAdapters() { owner := c.Input().Get("owner") limit := c.Input().Get("pageSize") @@ -31,9 +38,9 @@ func (c *ApiController) GetCasbinAdapters() { value := c.Input().Get("value") sortField := c.Input().Get("sortField") sortOrder := c.Input().Get("sortOrder") - organization := c.Input().Get("organization") + if limit == "" || page == "" { - adapters, err := object.GetCasbinAdapters(owner, organization) + adapters, err := object.GetCasbinAdapters(owner) if err != nil { c.ResponseError(err.Error()) return @@ -42,14 +49,14 @@ func (c *ApiController) GetCasbinAdapters() { c.ResponseOk(adapters) } else { limit := util.ParseInt(limit) - count, err := object.GetCasbinAdapterCount(owner, organization, field, value) + count, err := object.GetCasbinAdapterCount(owner, field, value) if err != nil { c.ResponseError(err.Error()) return } paginator := pagination.SetPaginator(c.Ctx, limit, count) - adapters, err := object.GetPaginationCasbinAdapters(owner, organization, paginator.Offset(), limit, field, value, sortField, sortOrder) + adapters, err := object.GetPaginationCasbinAdapters(owner, paginator.Offset(), limit, field, value, sortField, sortOrder) if err != nil { c.ResponseError(err.Error()) return @@ -59,8 +66,16 @@ func (c *ApiController) GetCasbinAdapters() { } } +// GetCasbinAdapter +// @Title GetCasbinAdapter +// @Tag Adapter API +// @Description get adapter +// @Param id query string true "The id ( owner/name ) of the adapter" +// @Success 200 {object} object.Adapter The Response object +// @router /get-adapter [get] func (c *ApiController) GetCasbinAdapter() { id := c.Input().Get("id") + adapter, err := object.GetCasbinAdapter(id) if err != nil { c.ResponseError(err.Error()) @@ -70,6 +85,14 @@ func (c *ApiController) GetCasbinAdapter() { c.ResponseOk(adapter) } +// UpdateCasbinAdapter +// @Title UpdateCasbinAdapter +// @Tag Adapter API +// @Description update adapter +// @Param id query string true "The id ( owner/name ) of the adapter" +// @Param body body object.Adapter true "The details of the adapter" +// @Success 200 {object} controllers.Response The Response object +// @router /update-adapter [post] func (c *ApiController) UpdateCasbinAdapter() { id := c.Input().Get("id") @@ -84,6 +107,13 @@ func (c *ApiController) UpdateCasbinAdapter() { c.ServeJSON() } +// AddCasbinAdapter +// @Title AddCasbinAdapter +// @Tag Adapter API +// @Description add adapter +// @Param body body object.Adapter true "The details of the adapter" +// @Success 200 {object} controllers.Response The Response object +// @router /add-adapter [post] func (c *ApiController) AddCasbinAdapter() { var casbinAdapter object.CasbinAdapter err := json.Unmarshal(c.Ctx.Input.RequestBody, &casbinAdapter) @@ -96,6 +126,13 @@ func (c *ApiController) AddCasbinAdapter() { c.ServeJSON() } +// DeleteCasbinAdapter +// @Title DeleteCasbinAdapter +// @Tag Adapter API +// @Description delete adapter +// @Param body body object.Adapter true "The details of the adapter" +// @Success 200 {object} controllers.Response The Response object +// @router /delete-adapter [post] func (c *ApiController) DeleteCasbinAdapter() { var casbinAdapter object.CasbinAdapter err := json.Unmarshal(c.Ctx.Input.RequestBody, &casbinAdapter) diff --git a/object/casbin_adapter.go b/object/casbin_adapter.go index 51ae092d..8b4ddd08 100644 --- a/object/casbin_adapter.go +++ b/object/casbin_adapter.go @@ -30,9 +30,8 @@ type CasbinAdapter struct { Name string `xorm:"varchar(100) notnull pk" json:"name"` CreatedTime string `xorm:"varchar(100)" json:"createdTime"` - Organization string `xorm:"varchar(100)" json:"organization"` - Type string `xorm:"varchar(100)" json:"type"` - Model string `xorm:"varchar(100)" json:"model"` + Type string `xorm:"varchar(100)" json:"type"` + Model string `xorm:"varchar(100)" json:"model"` Host string `xorm:"varchar(100)" json:"host"` Port int `json:"port"` @@ -46,14 +45,14 @@ type CasbinAdapter struct { Adapter *xormadapter.Adapter `xorm:"-" json:"-"` } -func GetCasbinAdapterCount(owner, organization, field, value string) (int64, error) { +func GetCasbinAdapterCount(owner, field, value string) (int64, error) { session := GetSession(owner, -1, -1, field, value, "", "") - return session.Count(&CasbinAdapter{Organization: organization}) + return session.Count(&CasbinAdapter{}) } -func GetCasbinAdapters(owner string, organization string) ([]*CasbinAdapter, error) { +func GetCasbinAdapters(owner string) ([]*CasbinAdapter, error) { adapters := []*CasbinAdapter{} - err := adapter.Engine.Where("owner = ? and organization = ?", owner, organization).Find(&adapters) + err := adapter.Engine.Desc("created_time").Find(&adapters, &CasbinAdapter{Owner: owner}) if err != nil { return adapters, err } @@ -61,10 +60,10 @@ func GetCasbinAdapters(owner string, organization string) ([]*CasbinAdapter, err return adapters, nil } -func GetPaginationCasbinAdapters(owner, organization string, page, limit int, field, value, sort, order string) ([]*CasbinAdapter, error) { - session := GetSession(owner, page, limit, field, value, sort, order) +func GetPaginationCasbinAdapters(owner string, offset, limit int, field, value, sortField, sortOrder string) ([]*CasbinAdapter, error) { adapters := []*CasbinAdapter{} - err := session.Find(&adapters, &CasbinAdapter{Organization: organization}) + session := GetSession(owner, offset, limit, field, value, sortField, sortOrder) + err := session.Find(&adapters) if err != nil { return adapters, err } @@ -214,6 +213,10 @@ func SyncPolicies(casbinAdapter *CasbinAdapter) ([]*xormadapter.CasbinRule, erro return nil, err } + if modelObj == nil { + return nil, fmt.Errorf("The model: %s does not exist", util.GetId(casbinAdapter.Owner, casbinAdapter.Model)) + } + enforcer, err := initEnforcer(modelObj, casbinAdapter) if err != nil { return nil, err diff --git a/object/organization.go b/object/organization.go index 10970b46..f00865b1 100644 --- a/object/organization.go +++ b/object/organization.go @@ -402,7 +402,6 @@ func organizationChangeTrigger(oldName string, newName string) error { casbinAdapter := new(CasbinAdapter) casbinAdapter.Owner = newName - casbinAdapter.Organization = newName _, err = session.Where("owner=?", oldName).Update(casbinAdapter) if err != nil { return err diff --git a/web/src/AdapterEditPage.js b/web/src/AdapterEditPage.js index d308914d..efcb0cf9 100644 --- a/web/src/AdapterEditPage.js +++ b/web/src/AdapterEditPage.js @@ -32,7 +32,7 @@ class AdapterEditPage extends React.Component { super(props); this.state = { classes: props, - owner: props.organizationName !== undefined ? props.organizationName : props.match.params.organizationName, + organizationName: props.organizationName !== undefined ? props.organizationName : props.match.params.organizationName, adapterName: props.match.params.adapterName, adapter: null, organizations: [], @@ -47,7 +47,7 @@ class AdapterEditPage extends React.Component { } getAdapter() { - AdapterBackend.getAdapter("admin", this.state.adapterName) + AdapterBackend.getAdapter(this.state.organizationName, this.state.adapterName) .then((res) => { if (res.status === "ok") { if (res.data === null) { @@ -59,13 +59,13 @@ class AdapterEditPage extends React.Component { adapter: res.data, }); - this.getModels(this.state.owner); + this.getModels(this.state.organizationName); } }); } getOrganizations() { - OrganizationBackend.getOrganizations(this.state.organizationName) + OrganizationBackend.getOrganizations("admin") .then((res) => { this.setState({ organizations: (res.msg === undefined) ? res : [], @@ -114,9 +114,8 @@ class AdapterEditPage extends React.Component { {Setting.getLabel(i18next.t("general:Organization"), i18next.t("general:Organization - Tooltip"))} : - { this.getModels(value); - this.updateAdapterField("organization", value); this.updateAdapterField("owner", value); })}> { @@ -253,7 +252,7 @@ class AdapterEditPage extends React.Component { {Setting.getLabel(i18next.t("adapter:Policies"), i18next.t("adapter:Policies - Tooltip"))} : - + @@ -272,7 +271,7 @@ class AdapterEditPage extends React.Component { submitAdapterEdit(willExist) { const adapter = Setting.deepCopy(this.state.adapter); - AdapterBackend.updateAdapter(this.state.owner, this.state.adapterName, adapter) + AdapterBackend.updateAdapter(this.state.organizationName, this.state.adapterName, adapter) .then((res) => { if (res.status === "ok") { Setting.showMessage("success", i18next.t("general:Successfully saved")); @@ -283,7 +282,7 @@ class AdapterEditPage extends React.Component { if (willExist) { this.props.history.push("/adapters"); } else { - this.props.history.push(`/adapters/${this.state.owner}/${this.state.adapter.name}`); + this.props.history.push(`/adapters/${this.state.organizationName}/${this.state.adapter.name}`); } } else { Setting.showMessage("error", `${i18next.t("general:Failed to save")}: ${res.msg}`); diff --git a/web/src/AdapterListPage.js b/web/src/AdapterListPage.js index 3f46e62f..adf6a9cd 100644 --- a/web/src/AdapterListPage.js +++ b/web/src/AdapterListPage.js @@ -26,10 +26,9 @@ class AdapterListPage extends BaseListPage { newAdapter() { const randomName = Setting.getRandomName(); return { - owner: "admin", + owner: this.props.account.owner, name: `adapter_${randomName}`, createdTime: moment().format(), - organization: this.props.account.owner, type: "Database", host: "localhost", port: 3306, @@ -47,7 +46,7 @@ class AdapterListPage extends BaseListPage { AdapterBackend.addAdapter(newAdapter) .then((res) => { if (res.status === "ok") { - this.props.history.push({pathname: `/adapters/${newAdapter.organization}/${newAdapter.name}`, mode: "add"}); + this.props.history.push({pathname: `/adapters/${newAdapter.owner}/${newAdapter.name}`, mode: "add"}); Setting.showMessage("success", i18next.t("general:Successfully added")); } else { Setting.showMessage("error", `${i18next.t("general:Failed to add")}: ${res.msg}`); @@ -96,11 +95,11 @@ class AdapterListPage extends BaseListPage { }, { title: i18next.t("general:Organization"), - dataIndex: "organization", - key: "organization", + dataIndex: "owner", + key: "owner", width: "120px", sorter: true, - ...this.getColumnSearchProps("organization"), + ...this.getColumnSearchProps("owner"), render: (text, record, index) => { return ( @@ -247,7 +246,7 @@ class AdapterListPage extends BaseListPage { value = params.type; } this.setState({loading: true}); - AdapterBackend.getAdapters("admin", Setting.isAdminUser(this.props.account) ? "" : this.props.account.owner, params.pagination.current, params.pagination.pageSize, field, value, sortField, sortOrder) + AdapterBackend.getAdapters(Setting.isAdminUser(this.props.account) ? "" : this.props.account.owner, params.pagination.current, params.pagination.pageSize, field, value, sortField, sortOrder) .then((res) => { this.setState({ loading: false, diff --git a/web/src/backend/AdapterBackend.js b/web/src/backend/AdapterBackend.js index d913ae03..39eac16c 100644 --- a/web/src/backend/AdapterBackend.js +++ b/web/src/backend/AdapterBackend.js @@ -14,8 +14,8 @@ import * as Setting from "../Setting"; -export function getAdapters(owner, organization, page = "", pageSize = "", field = "", value = "", sortField = "", sortOrder = "") { - return fetch(`${Setting.ServerUrl}/api/get-adapters?owner=${owner}&organization=${organization}&p=${page}&pageSize=${pageSize}&field=${field}&value=${value}&sortField=${sortField}&sortOrder=${sortOrder}`, { +export function getAdapters(owner, page = "", pageSize = "", field = "", value = "", sortField = "", sortOrder = "") { + return fetch(`${Setting.ServerUrl}/api/get-adapters?owner=${owner}&p=${page}&pageSize=${pageSize}&field=${field}&value=${value}&sortField=${sortField}&sortOrder=${sortOrder}`, { method: "GET", credentials: "include", headers: {