From 0b5079c11fef69c1fe9e37ac602127bec8ac13dd Mon Sep 17 00:00:00 2001 From: Livio Spring Date: Fri, 25 Oct 2024 17:51:44 +0200 Subject: [PATCH] fix: correctly search for verified domain (#8820) # Which Problems Are Solved Searching orgs by domain currently only looked for the primary domain, but should be possible with all verified domains (as documented) # How the Problems Are Solved - fixed the search query # Additional Changes None # Additional Context - closes https://github.com/zitadel/zitadel/issues/8749 --- internal/api/grpc/org/converter.go | 2 +- .../org/v2/integration_test/query_test.go | 41 +++++++++++++++++++ internal/api/grpc/org/v2/query.go | 2 +- internal/query/org.go | 20 ++++++++- 4 files changed, 61 insertions(+), 4 deletions(-) diff --git a/internal/api/grpc/org/converter.go b/internal/api/grpc/org/converter.go index 43fc1c18d..fa91599c0 100644 --- a/internal/api/grpc/org/converter.go +++ b/internal/api/grpc/org/converter.go @@ -22,7 +22,7 @@ func OrgQueriesToModel(queries []*org_pb.OrgQuery) (_ []query.SearchQuery, err e func OrgQueryToModel(apiQuery *org_pb.OrgQuery) (query.SearchQuery, error) { switch q := apiQuery.Query.(type) { case *org_pb.OrgQuery_DomainQuery: - return query.NewOrgDomainSearchQuery(object.TextMethodToQuery(q.DomainQuery.Method), q.DomainQuery.Domain) + return query.NewOrgVerifiedDomainSearchQuery(object.TextMethodToQuery(q.DomainQuery.Method), q.DomainQuery.Domain) case *org_pb.OrgQuery_NameQuery: return query.NewOrgNameSearchQuery(object.TextMethodToQuery(q.NameQuery.Method), q.NameQuery.Name) case *org_pb.OrgQuery_StateQuery: diff --git a/internal/api/grpc/org/v2/integration_test/query_test.go b/internal/api/grpc/org/v2/integration_test/query_test.go index e476b4e60..bd0352ed7 100644 --- a/internal/api/grpc/org/v2/integration_test/query_test.go +++ b/internal/api/grpc/org/v2/integration_test/query_test.go @@ -15,6 +15,7 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" "github.com/zitadel/zitadel/internal/integration" + "github.com/zitadel/zitadel/pkg/grpc/management" "github.com/zitadel/zitadel/pkg/grpc/object/v2" "github.com/zitadel/zitadel/pkg/grpc/org/v2" ) @@ -214,6 +215,46 @@ func TestServer_ListOrganizations(t *testing.T) { }, }, }, + { + name: "list org by domain (non primary), ok", + args: args{ + CTX, + &org.ListOrganizationsRequest{}, + func(ctx context.Context, request *org.ListOrganizationsRequest) ([]orgAttr, error) { + orgs := make([]orgAttr, 1) + name := fmt.Sprintf("ListOrgs-%s", gofakeit.AppName()) + orgResp := Instance.CreateOrganization(ctx, name, gofakeit.Email()) + orgs[0] = orgAttr{ + ID: orgResp.GetOrganizationId(), + Name: name, + Details: orgResp.GetDetails(), + } + domain := gofakeit.DomainName() + _, err := Instance.Client.Mgmt.AddOrgDomain(integration.SetOrgID(ctx, orgResp.GetOrganizationId()), &management.AddOrgDomainRequest{ + Domain: domain, + }) + if err != nil { + return nil, err + } + request.Queries = []*org.SearchQuery{ + OrganizationDomainQuery(domain), + } + return orgs, nil + }, + }, + want: &org.ListOrganizationsResponse{ + Details: &object.ListDetails{ + TotalResult: 1, + Timestamp: timestamppb.Now(), + }, + SortingColumn: 0, + Result: []*org.Organization{ + { + State: org.OrganizationState_ORGANIZATION_STATE_ACTIVE, + }, + }, + }, + }, { name: "list org by inactive state, ok", args: args{ diff --git a/internal/api/grpc/org/v2/query.go b/internal/api/grpc/org/v2/query.go index 6c2919c5b..f07fb71d2 100644 --- a/internal/api/grpc/org/v2/query.go +++ b/internal/api/grpc/org/v2/query.go @@ -57,7 +57,7 @@ func orgQueriesToQuery(ctx context.Context, queries []*org.SearchQuery) (_ []que func orgQueryToQuery(ctx context.Context, orgQuery *org.SearchQuery) (query.SearchQuery, error) { switch q := orgQuery.Query.(type) { case *org.SearchQuery_DomainQuery: - return query.NewOrgDomainSearchQuery(object.TextMethodToQuery(q.DomainQuery.Method), q.DomainQuery.Domain) + return query.NewOrgVerifiedDomainSearchQuery(object.TextMethodToQuery(q.DomainQuery.Method), q.DomainQuery.Domain) case *org.SearchQuery_NameQuery: return query.NewOrgNameSearchQuery(object.TextMethodToQuery(q.NameQuery.Method), q.NameQuery.Name) case *org.SearchQuery_StateQuery: diff --git a/internal/query/org.go b/internal/query/org.go index 50e2d4dbd..1c2025517 100644 --- a/internal/query/org.go +++ b/internal/query/org.go @@ -308,8 +308,24 @@ func NewOrgIDSearchQuery(value string) (SearchQuery, error) { return NewTextQuery(OrgColumnID, value, TextEquals) } -func NewOrgDomainSearchQuery(method TextComparison, value string) (SearchQuery, error) { - return NewTextQuery(OrgColumnDomain, value, method) +func NewOrgVerifiedDomainSearchQuery(method TextComparison, value string) (SearchQuery, error) { + domainQuery, err := NewTextQuery(OrgDomainDomainCol, value, method) + if err != nil { + return nil, err + } + verifiedQuery, err := NewBoolQuery(OrgDomainIsVerifiedCol, true) + if err != nil { + return nil, err + } + subSelect, err := NewSubSelect(OrgDomainOrgIDCol, []SearchQuery{domainQuery, verifiedQuery}) + if err != nil { + return nil, err + } + return NewListQuery( + OrgColumnID, + subSelect, + ListIn, + ) } func NewOrgNameSearchQuery(method TextComparison, value string) (SearchQuery, error) {