From ff88eb87ca5b0cc17388a7e1ca8c69d7e4d2bb4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B1=88=E8=BD=A9?= Date: Wed, 17 Jul 2024 10:12:58 +0800 Subject: [PATCH] fix(cloudid): distinct field for cloudid resources (#20820) --- pkg/cloudid/models/cloudgroup.go | 25 +++++++++++++++++++++ pkg/cloudid/models/clouduser.go | 22 +++++++++++++++++++ pkg/cloudid/models/samluser.go | 37 ++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) diff --git a/pkg/cloudid/models/cloudgroup.go b/pkg/cloudid/models/cloudgroup.go index 6823087096..ad89718793 100644 --- a/pkg/cloudid/models/cloudgroup.go +++ b/pkg/cloudid/models/cloudgroup.go @@ -258,6 +258,31 @@ func (manager *SCloudgroupManager) FetchCustomizeColumns( return rows } +func (manager *SCloudgroupManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) { + switch field { + case "manager": + managerQuery := CloudproviderManager.Query("name", "id").SubQuery() + q.AppendField(managerQuery.Field("name", field)).Distinct() + q = q.Join(managerQuery, sqlchemy.Equals(q.Field("manager_id"), managerQuery.Field("id"))) + return q, nil + case "account": + accountQuery := CloudaccountManager.Query("name", "id").SubQuery() + providers := CloudproviderManager.Query("id", "cloudaccount_id").SubQuery() + q.AppendField(accountQuery.Field("name", field)).Distinct() + q = q.Join(providers, sqlchemy.Equals(q.Field("manager_id"), providers.Field("id"))) + q = q.Join(accountQuery, sqlchemy.Equals(providers.Field("cloudaccount_id"), accountQuery.Field("id"))) + return q, nil + case "provider", "brand": + accountQuery := CloudaccountManager.Query(field, "id").Distinct().SubQuery() + providers := CloudproviderManager.Query("id", "cloudaccount_id").SubQuery() + q.AppendField(accountQuery.Field(field)).Distinct() + q = q.Join(providers, sqlchemy.Equals(q.Field("manager_id"), providers.Field("id"))) + q = q.Join(accountQuery, sqlchemy.Equals(providers.Field("cloudaccount_id"), accountQuery.Field("id"))) + return q, nil + } + return q, httperrors.ErrNotFound +} + // 创建权限组 func (manager *SCloudgroupManager) ValidateCreateData( ctx context.Context, diff --git a/pkg/cloudid/models/clouduser.go b/pkg/cloudid/models/clouduser.go index f643fcd340..f9f385b81c 100644 --- a/pkg/cloudid/models/clouduser.go +++ b/pkg/cloudid/models/clouduser.go @@ -185,6 +185,28 @@ func (manager *SClouduserManager) QueryDistinctExtraField(q *sqlchemy.SQuery, fi if err == nil { return q, nil } + + switch field { + case "manager": + managerQuery := CloudproviderManager.Query("name", "id").SubQuery() + q.AppendField(managerQuery.Field("name", field)).Distinct() + q = q.Join(managerQuery, sqlchemy.Equals(q.Field("manager_id"), managerQuery.Field("id"))) + return q, nil + case "account": + accountQuery := CloudaccountManager.Query("name", "id").SubQuery() + providers := CloudproviderManager.Query("id", "cloudaccount_id").SubQuery() + q.AppendField(accountQuery.Field("name", field)).Distinct() + q = q.Join(providers, sqlchemy.Equals(q.Field("manager_id"), providers.Field("id"))) + q = q.Join(accountQuery, sqlchemy.Equals(providers.Field("cloudaccount_id"), accountQuery.Field("id"))) + return q, nil + case "provider", "brand": + accountQuery := CloudaccountManager.Query(field, "id").Distinct().SubQuery() + providers := CloudproviderManager.Query("id", "cloudaccount_id").SubQuery() + q.AppendField(accountQuery.Field(field)).Distinct() + q = q.Join(providers, sqlchemy.Equals(q.Field("manager_id"), providers.Field("id"))) + q = q.Join(accountQuery, sqlchemy.Equals(providers.Field("cloudaccount_id"), accountQuery.Field("id"))) + return q, nil + } return q, httperrors.ErrNotFound } diff --git a/pkg/cloudid/models/samluser.go b/pkg/cloudid/models/samluser.go index 968dc4738b..733554b066 100644 --- a/pkg/cloudid/models/samluser.go +++ b/pkg/cloudid/models/samluser.go @@ -117,6 +117,43 @@ func (manager *SSamluserManager) ListItemFilter(ctx context.Context, q *sqlchemy return q, nil } +func (manager *SSamluserManager) QueryDistinctExtraField(q *sqlchemy.SQuery, field string) (*sqlchemy.SQuery, error) { + var err error + q, err = manager.SStatusDomainLevelUserResourceBaseManager.QueryDistinctExtraField(q, field) + if err == nil { + return q, nil + } + + switch field { + case "manager": + managerQuery := CloudproviderManager.Query("name", "id").SubQuery() + groupQuery := CloudgroupManager.Query("id").SubQuery() + q.AppendField(managerQuery.Field("name", field)).Distinct() + q = q.Join(groupQuery, sqlchemy.Equals(q.Field("cloudgroup_id"), groupQuery.Field("id"))) + q = q.Join(managerQuery, sqlchemy.Equals(groupQuery.Field("manager_id"), managerQuery.Field("id"))) + return q, nil + case "account": + accountQuery := CloudaccountManager.Query("name", "id").SubQuery() + providers := CloudproviderManager.Query("id", "cloudaccount_id").SubQuery() + groupQuery := CloudgroupManager.Query("id").SubQuery() + q.AppendField(accountQuery.Field("name", field)).Distinct() + q = q.Join(groupQuery, sqlchemy.Equals(q.Field("cloudgroup_id"), groupQuery.Field("id"))) + q = q.Join(providers, sqlchemy.Equals(groupQuery.Field("manager_id"), providers.Field("id"))) + q = q.Join(accountQuery, sqlchemy.Equals(providers.Field("cloudaccount_id"), accountQuery.Field("id"))) + return q, nil + case "provider", "brand": + accountQuery := CloudaccountManager.Query(field, "id").Distinct().SubQuery() + providers := CloudproviderManager.Query("id", "cloudaccount_id").SubQuery() + groupQuery := CloudgroupManager.Query("id").SubQuery() + q.AppendField(accountQuery.Field(field)).Distinct() + q = q.Join(groupQuery, sqlchemy.Equals(q.Field("cloudgroup_id"), groupQuery.Field("id"))) + q = q.Join(providers, sqlchemy.Equals(groupQuery.Field("manager_id"), providers.Field("id"))) + q = q.Join(accountQuery, sqlchemy.Equals(providers.Field("cloudaccount_id"), accountQuery.Field("id"))) + return q, nil + } + return q, httperrors.ErrNotFound +} + // 创建SAML认证用户 func (manager *SSamluserManager) ValidateCreateData( ctx context.Context,