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,