fix(cloudid): distinct field for cloudid resources (#20820)

This commit is contained in:
屈轩
2024-07-17 10:12:58 +08:00
committed by GitHub
parent 6cd471633c
commit ff88eb87ca
3 changed files with 84 additions and 0 deletions

View File

@@ -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,

View File

@@ -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
}

View File

@@ -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,