From eb4a252d08076618838123589db6667b0ba3092a Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Sat, 4 Jul 2020 11:32:20 +0800 Subject: [PATCH] feature: project filter that list jointable projects for user or group --- pkg/apis/identity/input.go | 3 +++ pkg/keystone/models/projects.go | 24 ++++++++++++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/pkg/apis/identity/input.go b/pkg/apis/identity/input.go index 726e14a601..13a35e4a47 100644 --- a/pkg/apis/identity/input.go +++ b/pkg/apis/identity/input.go @@ -151,6 +151,9 @@ type ProjectListInput struct { UserFilterListInput GroupFilterListInput + + // 过滤出指定用户或者组可以加入的项目 + Jointable *bool `json:"jointable"` } type DomainListInput struct { diff --git a/pkg/keystone/models/projects.go b/pkg/keystone/models/projects.go index ac68aba350..6c27b08c55 100644 --- a/pkg/keystone/models/projects.go +++ b/pkg/keystone/models/projects.go @@ -233,7 +233,17 @@ func (manager *SProjectManager) ListItemFilter( } } subq := AssignmentManager.fetchUserProjectIdsQuery(userObj.GetId()) - q = q.In("id", subq.SubQuery()) + if query.Jointable != nil && *query.Jointable { + user := userObj.(*SUser) + if user.DomainId == api.DEFAULT_DOMAIN_ID { + q = q.Equals("domain_id", api.DEFAULT_DOMAIN_ID) + } else { + q = q.In("domain_id", []string{user.DomainId, api.DEFAULT_DOMAIN_ID}) + } + q = q.NotIn("id", subq.SubQuery()) + } else { + q = q.In("id", subq.SubQuery()) + } } groupStr := query.Group @@ -247,7 +257,17 @@ func (manager *SProjectManager) ListItemFilter( } } subq := AssignmentManager.fetchGroupProjectIdsQuery(groupObj.GetId()) - q = q.In("id", subq.SubQuery()) + if query.Jointable != nil && *query.Jointable { + group := groupObj.(*SGroup) + if group.DomainId == api.DEFAULT_DOMAIN_ID { + q = q.Equals("domain_id", api.DEFAULT_DOMAIN_ID) + } else { + q = q.In("domain_id", []string{group.DomainId, api.DEFAULT_DOMAIN_ID}) + } + q = q.NotIn("id", subq.SubQuery()) + } else { + q = q.In("id", subq.SubQuery()) + } } return q, nil