fixup! Merge branch 'main' into org_api

This commit is contained in:
Iraq Jaber
2025-05-07 13:36:50 +02:00
parent 7383c24931
commit 25d4f1af78
8 changed files with 117 additions and 84 deletions

View File

@@ -463,7 +463,7 @@ func startAPIs(
if err := apis.RegisterService(ctx, settings_v2beta.CreateServer(commands, queries)); err != nil { if err := apis.RegisterService(ctx, settings_v2beta.CreateServer(commands, queries)); err != nil {
return nil, err return nil, err
} }
if err := apis.RegisterService(ctx, org_v2beta.CreateServer(commands, queries, permissionCheck)); err != nil { if err := apis.RegisterService(ctx, org_v2beta.CreateServer(config.SystemDefaults, commands, queries, permissionCheck)); err != nil {
return nil, err return nil, err
} }
if err := apis.RegisterService(ctx, feature_v2beta.CreateServer(commands, queries)); err != nil { if err := apis.RegisterService(ctx, feature_v2beta.CreateServer(commands, queries)); err != nil {

View File

@@ -901,6 +901,7 @@ func (s *Server) ListHumanLinkedIDPs(ctx context.Context, req *mgmt_pb.ListHuman
Details: obj_grpc.ToListDetails(res.Count, res.Sequence, res.LastRun), Details: obj_grpc.ToListDetails(res.Count, res.Sequence, res.LastRun),
}, nil }, nil
} }
func (s *Server) RemoveHumanLinkedIDP(ctx context.Context, req *mgmt_pb.RemoveHumanLinkedIDPRequest) (*mgmt_pb.RemoveHumanLinkedIDPResponse, error) { func (s *Server) RemoveHumanLinkedIDP(ctx context.Context, req *mgmt_pb.RemoveHumanLinkedIDPRequest) (*mgmt_pb.RemoveHumanLinkedIDPResponse, error) {
objectDetails, err := s.command.RemoveUserIDPLink(ctx, RemoveHumanLinkedIDPRequestToDomain(ctx, req)) objectDetails, err := s.command.RemoveUserIDPLink(ctx, RemoveHumanLinkedIDPRequestToDomain(ctx, req))
if err != nil { if err != nil {
@@ -947,18 +948,21 @@ func cascadingIAMMembership(membership *query.IAMMembership) *command.CascadingI
} }
return &command.CascadingIAMMembership{IAMID: membership.IAMID} return &command.CascadingIAMMembership{IAMID: membership.IAMID}
} }
func cascadingOrgMembership(membership *query.OrgMembership) *command.CascadingOrgMembership { func cascadingOrgMembership(membership *query.OrgMembership) *command.CascadingOrgMembership {
if membership == nil { if membership == nil {
return nil return nil
} }
return &command.CascadingOrgMembership{OrgID: membership.OrgID} return &command.CascadingOrgMembership{OrgID: membership.OrgID}
} }
func cascadingProjectMembership(membership *query.ProjectMembership) *command.CascadingProjectMembership { func cascadingProjectMembership(membership *query.ProjectMembership) *command.CascadingProjectMembership {
if membership == nil { if membership == nil {
return nil return nil
} }
return &command.CascadingProjectMembership{ProjectID: membership.ProjectID} return &command.CascadingProjectMembership{ProjectID: membership.ProjectID}
} }
func cascadingProjectGrantMembership(membership *query.ProjectGrantMembership) *command.CascadingProjectGrantMembership { func cascadingProjectGrantMembership(membership *query.ProjectGrantMembership) *command.CascadingProjectGrantMembership {
if membership == nil { if membership == nil {
return nil return nil

View File

@@ -6,6 +6,7 @@ import (
metadata "github.com/zitadel/zitadel/internal/api/grpc/metadata/v2beta" metadata "github.com/zitadel/zitadel/internal/api/grpc/metadata/v2beta"
v2beta_object "github.com/zitadel/zitadel/internal/api/grpc/object/v2beta" v2beta_object "github.com/zitadel/zitadel/internal/api/grpc/object/v2beta"
"github.com/zitadel/zitadel/internal/command" "github.com/zitadel/zitadel/internal/command"
"github.com/zitadel/zitadel/internal/config/systemdefaults"
"github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/eventstore/v1/models" "github.com/zitadel/zitadel/internal/eventstore/v1/models"
"github.com/zitadel/zitadel/internal/query" "github.com/zitadel/zitadel/internal/query"
@@ -14,6 +15,7 @@ import (
"google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/timestamppb"
// TODO fix below // TODO fix below
filter "github.com/zitadel/zitadel/internal/api/grpc/filter/v2beta"
org "github.com/zitadel/zitadel/pkg/grpc/org/v2beta" org "github.com/zitadel/zitadel/pkg/grpc/org/v2beta"
v2beta_org "github.com/zitadel/zitadel/pkg/grpc/org/v2beta" v2beta_org "github.com/zitadel/zitadel/pkg/grpc/org/v2beta"
) )
@@ -21,9 +23,12 @@ import (
// NOTE: most of this code is copied from `internal/api/grpc/admin/*`, as we will eventually axe the previous versons of the API, // NOTE: most of this code is copied from `internal/api/grpc/admin/*`, as we will eventually axe the previous versons of the API,
// we will have code duplication until then // we will have code duplication until then
func listOrgRequestToModel(request *v2beta_org.ListOrganizationsRequest) (*query.OrgSearchQueries, error) { func listOrgRequestToModel(systemDefaults systemdefaults.SystemDefaults, request *v2beta_org.ListOrganizationsRequest) (*query.OrgSearchQueries, error) {
offset, limit, asc := v2beta_object.ListQueryToModel(request.Query) offset, limit, asc, err := filter.PaginationPbToQuery(systemDefaults, request.Pagination)
queries, err := OrgQueriesToModel(request.Queries) if err != nil {
return nil, err
}
queries, err := OrgQueriesToModel(request.Filter)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -94,7 +99,7 @@ func OrgViewsToPb(orgs []*query.Org) []*v2beta_org.Organization {
return o return o
} }
func OrgQueriesToModel(queries []*v2beta_org.OrgQuery) (_ []query.SearchQuery, err error) { func OrgQueriesToModel(queries []*v2beta_org.OrgQueryFilter) (_ []query.SearchQuery, err error) {
q := make([]query.SearchQuery, len(queries)) q := make([]query.SearchQuery, len(queries))
for i, query := range queries { for i, query := range queries {
q[i], err = OrgQueryToModel(query) q[i], err = OrgQueryToModel(query)
@@ -105,15 +110,15 @@ func OrgQueriesToModel(queries []*v2beta_org.OrgQuery) (_ []query.SearchQuery, e
return q, nil return q, nil
} }
func OrgQueryToModel(apiQuery *v2beta_org.OrgQuery) (query.SearchQuery, error) { func OrgQueryToModel(apiQuery *v2beta_org.OrgQueryFilter) (query.SearchQuery, error) {
switch q := apiQuery.Query.(type) { switch q := apiQuery.Query.(type) {
case *v2beta_org.OrgQuery_DomainQuery: case *v2beta_org.OrgQueryFilter_DomainQuery:
return query.NewOrgVerifiedDomainSearchQuery(v2beta_object.TextMethodToQuery(q.DomainQuery.Method), q.DomainQuery.Domain) return query.NewOrgVerifiedDomainSearchQuery(v2beta_object.TextMethodToQuery(q.DomainQuery.Method), q.DomainQuery.Domain)
case *v2beta_org.OrgQuery_NameQuery: case *v2beta_org.OrgQueryFilter_NameQuery:
return query.NewOrgNameSearchQuery(v2beta_object.TextMethodToQuery(q.NameQuery.Method), q.NameQuery.Name) return query.NewOrgNameSearchQuery(v2beta_object.TextMethodToQuery(q.NameQuery.Method), q.NameQuery.Name)
case *v2beta_org.OrgQuery_StateQuery: case *v2beta_org.OrgQueryFilter_StateQuery:
return query.NewOrgStateSearchQuery(OrgStateToDomain(q.StateQuery.State)) return query.NewOrgStateSearchQuery(OrgStateToDomain(q.StateQuery.State))
case *v2beta_org.OrgQuery_IdQuery: case *v2beta_org.OrgQueryFilter_IdQuery:
return query.NewOrgIDSearchQuery(q.IdQuery.Id) return query.NewOrgIDSearchQuery(q.IdQuery.Id)
default: default:
return nil, zerrors.ThrowInvalidArgument(nil, "ORG-vR9nC", "List.Query.Invalid") return nil, zerrors.ThrowInvalidArgument(nil, "ORG-vR9nC", "List.Query.Invalid")
@@ -164,10 +169,9 @@ func OrgViewToPb(org *query.Org) *v2beta_org.Organization {
} }
} }
func ListOrgDomainsRequestToModel(req *org.ListOrganizationDomainsRequest) (*query.OrgDomainSearchQueries, error) { func ListOrgDomainsRequestToModel(systemDefaults systemdefaults.SystemDefaults, request *org.ListOrganizationDomainsRequest) (*query.OrgDomainSearchQueries, error) {
offset, limit, asc := ListQueryToModel(req.Query) offset, limit, asc, err := filter.PaginationPbToQuery(systemDefaults, request.Pagination)
// queries, err := org_grpc.DomainQueriesToModel(req.Queries) queries, err := DomainQueriesToModel(request.Filter)
queries, err := DomainQueriesToModel(req.Queries)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -249,9 +253,9 @@ func BulkSetOrgMetadataToDomain(req *v2beta_org.SetOrganizationMetadataRequest)
return metadata return metadata
} }
func ListOrgMetadataToDomain(request *v2beta_org.ListOrganizationMetadataRequest) (*query.OrgMetadataSearchQueries, error) { func ListOrgMetadataToDomain(systemDefaults systemdefaults.SystemDefaults, request *v2beta_org.ListOrganizationMetadataRequest) (*query.OrgMetadataSearchQueries, error) {
offset, limit, asc := v2beta_object.ListQueryToModel(request.Query) offset, limit, asc, err := filter.PaginationPbToQuery(systemDefaults, request.Pagination)
queries, err := metadata.OrgMetadataQueriesToQuery(request.Queries) queries, err := metadata.OrgMetadataQueriesToQuery(request.Filter)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -276,7 +276,7 @@ func TestServer_ListOrganization(t *testing.T) {
tests := []struct { tests := []struct {
name string name string
ctx context.Context ctx context.Context
query []*v2beta_org.OrgQuery query []*v2beta_org.OrgQueryFilter
want []*v2beta_org.Organization want []*v2beta_org.Organization
wantErr bool wantErr bool
}{ }{
@@ -301,9 +301,9 @@ func TestServer_ListOrganization(t *testing.T) {
{ {
name: "list organizations by id happy path", name: "list organizations by id happy path",
ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner), ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner),
query: []*v2beta_org.OrgQuery{ query: []*v2beta_org.OrgQueryFilter{
{ {
Query: &v2beta_org.OrgQuery_IdQuery{ Query: &v2beta_org.OrgQueryFilter_IdQuery{
IdQuery: &v2beta_org.OrgIDQuery{ IdQuery: &v2beta_org.OrgIDQuery{
Id: orgs[1].Id, Id: orgs[1].Id,
}, },
@@ -320,9 +320,9 @@ func TestServer_ListOrganization(t *testing.T) {
{ {
name: "list organizations by state active", name: "list organizations by state active",
ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner), ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner),
query: []*v2beta_org.OrgQuery{ query: []*v2beta_org.OrgQueryFilter{
{ {
Query: &v2beta_org.OrgQuery_StateQuery{ Query: &v2beta_org.OrgQueryFilter_StateQuery{
StateQuery: &v2beta_org.OrgStateQuery{ StateQuery: &v2beta_org.OrgStateQuery{
State: v2beta_org.OrgState_ORG_STATE_ACTIVE, State: v2beta_org.OrgState_ORG_STATE_ACTIVE,
}, },
@@ -343,9 +343,9 @@ func TestServer_ListOrganization(t *testing.T) {
{ {
name: "list organizations by state inactive", name: "list organizations by state inactive",
ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner), ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner),
query: []*v2beta_org.OrgQuery{ query: []*v2beta_org.OrgQueryFilter{
{ {
Query: &v2beta_org.OrgQuery_StateQuery{ Query: &v2beta_org.OrgQueryFilter_StateQuery{
StateQuery: &v2beta_org.OrgStateQuery{ StateQuery: &v2beta_org.OrgStateQuery{
State: v2beta_org.OrgState_ORG_STATE_INACTIVE, State: v2beta_org.OrgState_ORG_STATE_INACTIVE,
}, },
@@ -362,9 +362,9 @@ func TestServer_ListOrganization(t *testing.T) {
{ {
name: "list organizations by id bad id", name: "list organizations by id bad id",
ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner), ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner),
query: []*v2beta_org.OrgQuery{ query: []*v2beta_org.OrgQueryFilter{
{ {
Query: &v2beta_org.OrgQuery_IdQuery{ Query: &v2beta_org.OrgQueryFilter_IdQuery{
IdQuery: &v2beta_org.OrgIDQuery{ IdQuery: &v2beta_org.OrgIDQuery{
Id: "bad id", Id: "bad id",
}, },
@@ -375,9 +375,9 @@ func TestServer_ListOrganization(t *testing.T) {
{ {
name: "list organizations specify org name equals", name: "list organizations specify org name equals",
ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner), ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner),
query: []*v2beta_org.OrgQuery{ query: []*v2beta_org.OrgQueryFilter{
{ {
Query: &v2beta_org.OrgQuery_NameQuery{ Query: &v2beta_org.OrgQueryFilter_NameQuery{
NameQuery: &v2beta_org.OrgNameQuery{ NameQuery: &v2beta_org.OrgNameQuery{
Name: orgsName[1], Name: orgsName[1],
Method: v2beta_object.TextQueryMethod_TEXT_QUERY_METHOD_EQUALS, Method: v2beta_object.TextQueryMethod_TEXT_QUERY_METHOD_EQUALS,
@@ -395,9 +395,9 @@ func TestServer_ListOrganization(t *testing.T) {
{ {
name: "list organizations specify org name contains", name: "list organizations specify org name contains",
ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner), ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner),
query: []*v2beta_org.OrgQuery{ query: []*v2beta_org.OrgQueryFilter{
{ {
Query: &v2beta_org.OrgQuery_NameQuery{ Query: &v2beta_org.OrgQueryFilter_NameQuery{
NameQuery: &v2beta_org.OrgNameQuery{ NameQuery: &v2beta_org.OrgNameQuery{
Name: func() string { Name: func() string {
return orgsName[1][1 : len(orgsName[1])-2] return orgsName[1][1 : len(orgsName[1])-2]
@@ -417,9 +417,9 @@ func TestServer_ListOrganization(t *testing.T) {
{ {
name: "list organizations specify org name contains IGNORE CASE", name: "list organizations specify org name contains IGNORE CASE",
ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner), ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner),
query: []*v2beta_org.OrgQuery{ query: []*v2beta_org.OrgQueryFilter{
{ {
Query: &v2beta_org.OrgQuery_NameQuery{ Query: &v2beta_org.OrgQueryFilter_NameQuery{
NameQuery: &v2beta_org.OrgNameQuery{ NameQuery: &v2beta_org.OrgNameQuery{
Name: func() string { Name: func() string {
return strings.ToUpper(orgsName[1][1 : len(orgsName[1])-2]) return strings.ToUpper(orgsName[1][1 : len(orgsName[1])-2])
@@ -439,15 +439,15 @@ func TestServer_ListOrganization(t *testing.T) {
{ {
name: "list organizations specify domain name equals", name: "list organizations specify domain name equals",
ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner), ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner),
query: []*v2beta_org.OrgQuery{ query: []*v2beta_org.OrgQueryFilter{
{ {
Query: &org.OrgQuery_DomainQuery{ Query: &org.OrgQueryFilter_DomainQuery{
DomainQuery: &org.OrgDomainQuery{ DomainQuery: &org.OrgDomainQuery{
Domain: func() string { Domain: func() string {
listOrgRes, err := Client.ListOrganizations(CTX, &v2beta_org.ListOrganizationsRequest{ listOrgRes, err := Client.ListOrganizations(CTX, &v2beta_org.ListOrganizationsRequest{
Queries: []*v2beta_org.OrgQuery{ Filter: []*v2beta_org.OrgQueryFilter{
{ {
Query: &v2beta_org.OrgQuery_IdQuery{ Query: &v2beta_org.OrgQueryFilter_IdQuery{
IdQuery: &v2beta_org.OrgIDQuery{ IdQuery: &v2beta_org.OrgIDQuery{
Id: orgs[1].Id, Id: orgs[1].Id,
}, },
@@ -474,9 +474,9 @@ func TestServer_ListOrganization(t *testing.T) {
{ {
name: "list organizations specify domain name contains", name: "list organizations specify domain name contains",
ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner), ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner),
query: []*v2beta_org.OrgQuery{ query: []*v2beta_org.OrgQueryFilter{
{ {
Query: &org.OrgQuery_DomainQuery{ Query: &org.OrgQueryFilter_DomainQuery{
DomainQuery: &org.OrgDomainQuery{ DomainQuery: &org.OrgDomainQuery{
Domain: func() string { Domain: func() string {
domain := strings.ToLower(strings.ReplaceAll(orgsName[1][1:len(orgsName[1])-2], " ", "-")) domain := strings.ToLower(strings.ReplaceAll(orgsName[1][1:len(orgsName[1])-2], " ", "-"))
@@ -497,9 +497,9 @@ func TestServer_ListOrganization(t *testing.T) {
{ {
name: "list organizations specify org name contains IGNORE CASE", name: "list organizations specify org name contains IGNORE CASE",
ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner), ctx: Instance.WithAuthorization(context.Background(), integration.UserTypeIAMOwner),
query: []*v2beta_org.OrgQuery{ query: []*v2beta_org.OrgQueryFilter{
{ {
Query: &org.OrgQuery_DomainQuery{ Query: &org.OrgQueryFilter_DomainQuery{
DomainQuery: &org.OrgDomainQuery{ DomainQuery: &org.OrgDomainQuery{
Domain: func() string { Domain: func() string {
domain := strings.ToUpper(strings.ReplaceAll(orgsName[1][1:len(orgsName[1])-2], " ", "-")) domain := strings.ToUpper(strings.ReplaceAll(orgsName[1][1:len(orgsName[1])-2], " ", "-"))
@@ -523,7 +523,7 @@ func TestServer_ListOrganization(t *testing.T) {
retryDuration, tick := integration.WaitForAndTickWithMaxDuration(context.Background(), 10*time.Minute) retryDuration, tick := integration.WaitForAndTickWithMaxDuration(context.Background(), 10*time.Minute)
require.EventuallyWithT(t, func(ttt *assert.CollectT) { require.EventuallyWithT(t, func(ttt *assert.CollectT) {
got, err := Client.ListOrganizations(tt.ctx, &v2beta_org.ListOrganizationsRequest{ got, err := Client.ListOrganizations(tt.ctx, &v2beta_org.ListOrganizationsRequest{
Queries: tt.query, Filter: tt.query,
}) })
if tt.wantErr { if tt.wantErr {
@@ -596,9 +596,9 @@ func TestServer_DeleteOrganization(t *testing.T) {
assert.WithinRange(t, gotCD, now.Add(-time.Minute), now.Add(time.Minute)) assert.WithinRange(t, gotCD, now.Add(-time.Minute), now.Add(time.Minute))
listOrgRes, err := Client.ListOrganizations(tt.ctx, &v2beta_org.ListOrganizationsRequest{ listOrgRes, err := Client.ListOrganizations(tt.ctx, &v2beta_org.ListOrganizationsRequest{
Queries: []*v2beta_org.OrgQuery{ Filter: []*v2beta_org.OrgQueryFilter{
{ {
Query: &v2beta_org.OrgQuery_IdQuery{ Query: &v2beta_org.OrgQueryFilter_IdQuery{
IdQuery: &v2beta_org.OrgIDQuery{ IdQuery: &v2beta_org.OrgIDQuery{
Id: tt.req.Id, Id: tt.req.Id,
}, },
@@ -639,9 +639,9 @@ func TestServer_DeactivateReactivateOrganization(t *testing.T) {
// 2. check inital state of organization // 2. check inital state of organization
listOrgRes, err := Client.ListOrganizations(ctx, &v2beta_org.ListOrganizationsRequest{ listOrgRes, err := Client.ListOrganizations(ctx, &v2beta_org.ListOrganizationsRequest{
Queries: []*v2beta_org.OrgQuery{ Filter: []*v2beta_org.OrgQueryFilter{
{ {
Query: &v2beta_org.OrgQuery_IdQuery{ Query: &v2beta_org.OrgQueryFilter_IdQuery{
IdQuery: &v2beta_org.OrgIDQuery{ IdQuery: &v2beta_org.OrgIDQuery{
Id: orgId, Id: orgId,
}, },
@@ -663,9 +663,9 @@ func TestServer_DeactivateReactivateOrganization(t *testing.T) {
// 4. check organization state is deactivated // 4. check organization state is deactivated
listOrgRes, err = Client.ListOrganizations(ctx, &v2beta_org.ListOrganizationsRequest{ listOrgRes, err = Client.ListOrganizations(ctx, &v2beta_org.ListOrganizationsRequest{
Queries: []*v2beta_org.OrgQuery{ Filter: []*v2beta_org.OrgQueryFilter{
{ {
Query: &v2beta_org.OrgQuery_IdQuery{ Query: &v2beta_org.OrgQueryFilter_IdQuery{
IdQuery: &v2beta_org.OrgIDQuery{ IdQuery: &v2beta_org.OrgIDQuery{
Id: orgId, Id: orgId,
}, },
@@ -686,9 +686,9 @@ func TestServer_DeactivateReactivateOrganization(t *testing.T) {
// 6. repeat check organization state is still deactivated // 6. repeat check organization state is still deactivated
listOrgRes, err = Client.ListOrganizations(ctx, &v2beta_org.ListOrganizationsRequest{ listOrgRes, err = Client.ListOrganizations(ctx, &v2beta_org.ListOrganizationsRequest{
Queries: []*v2beta_org.OrgQuery{ Filter: []*v2beta_org.OrgQueryFilter{
{ {
Query: &v2beta_org.OrgQuery_IdQuery{ Query: &v2beta_org.OrgQueryFilter_IdQuery{
IdQuery: &v2beta_org.OrgIDQuery{ IdQuery: &v2beta_org.OrgIDQuery{
Id: orgId, Id: orgId,
}, },
@@ -710,9 +710,9 @@ func TestServer_DeactivateReactivateOrganization(t *testing.T) {
// 8. check organization state is active // 8. check organization state is active
listOrgRes, err = Client.ListOrganizations(ctx, &v2beta_org.ListOrganizationsRequest{ listOrgRes, err = Client.ListOrganizations(ctx, &v2beta_org.ListOrganizationsRequest{
Queries: []*v2beta_org.OrgQuery{ Filter: []*v2beta_org.OrgQueryFilter{
{ {
Query: &v2beta_org.OrgQuery_IdQuery{ Query: &v2beta_org.OrgQueryFilter_IdQuery{
IdQuery: &v2beta_org.OrgIDQuery{ IdQuery: &v2beta_org.OrgIDQuery{
Id: orgId, Id: orgId,
}, },
@@ -732,9 +732,9 @@ func TestServer_DeactivateReactivateOrganization(t *testing.T) {
// 10. repeat check organization state is still active // 10. repeat check organization state is still active
listOrgRes, err = Client.ListOrganizations(ctx, &v2beta_org.ListOrganizationsRequest{ listOrgRes, err = Client.ListOrganizations(ctx, &v2beta_org.ListOrganizationsRequest{
Queries: []*v2beta_org.OrgQuery{ Filter: []*v2beta_org.OrgQueryFilter{
{ {
Query: &v2beta_org.OrgQuery_IdQuery{ Query: &v2beta_org.OrgQueryFilter_IdQuery{
IdQuery: &v2beta_org.OrgIDQuery{ IdQuery: &v2beta_org.OrgIDQuery{
Id: orgId, Id: orgId,
}, },

View File

@@ -9,6 +9,7 @@ import (
"github.com/zitadel/zitadel/internal/command" "github.com/zitadel/zitadel/internal/command"
"github.com/zitadel/zitadel/internal/query" "github.com/zitadel/zitadel/internal/query"
"github.com/zitadel/zitadel/internal/zerrors" "github.com/zitadel/zitadel/internal/zerrors"
filter "github.com/zitadel/zitadel/pkg/grpc/filter/v2beta"
org "github.com/zitadel/zitadel/pkg/grpc/org/v2beta" org "github.com/zitadel/zitadel/pkg/grpc/org/v2beta"
v2beta_org "github.com/zitadel/zitadel/pkg/grpc/org/v2beta" v2beta_org "github.com/zitadel/zitadel/pkg/grpc/org/v2beta"
"google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/timestamppb"
@@ -38,7 +39,7 @@ func (s *Server) UpdateOrganization(ctx context.Context, request *v2beta_org.Upd
} }
func (s *Server) ListOrganizations(ctx context.Context, request *v2beta_org.ListOrganizationsRequest) (*v2beta_org.ListOrganizationsResponse, error) { func (s *Server) ListOrganizations(ctx context.Context, request *v2beta_org.ListOrganizationsRequest) (*v2beta_org.ListOrganizationsResponse, error) {
queries, err := listOrgRequestToModel(request) queries, err := listOrgRequestToModel(s.systemDefaults, request)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -47,8 +48,11 @@ func (s *Server) ListOrganizations(ctx context.Context, request *v2beta_org.List
return nil, err return nil, err
} }
return &v2beta_org.ListOrganizationsResponse{ return &v2beta_org.ListOrganizationsResponse{
Result: OrgViewsToPb(orgs.Orgs), Result: OrgViewsToPb(orgs.Orgs),
Details: object.ToListDetails(orgs.SearchResponse), Pagination: &filter.PaginationResponse{
TotalResult: orgs.Count,
AppliedLimit: uint64(request.GetPagination().GetLimit()),
},
}, nil }, nil
} }
@@ -73,7 +77,7 @@ func (s *Server) SetOrganizationMetadata(ctx context.Context, request *v2beta_or
} }
func (s *Server) ListOrganizationMetadata(ctx context.Context, request *v2beta_org.ListOrganizationMetadataRequest) (*v2beta_org.ListOrganizationMetadataResponse, error) { func (s *Server) ListOrganizationMetadata(ctx context.Context, request *v2beta_org.ListOrganizationMetadataRequest) (*v2beta_org.ListOrganizationMetadataResponse, error) {
metadataQueries, err := ListOrgMetadataToDomain(request) metadataQueries, err := ListOrgMetadataToDomain(s.systemDefaults, request)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -82,8 +86,11 @@ func (s *Server) ListOrganizationMetadata(ctx context.Context, request *v2beta_o
return nil, err return nil, err
} }
return &v2beta_org.ListOrganizationMetadataResponse{ return &v2beta_org.ListOrganizationMetadataResponse{
Result: metadata.OrgMetadataListToPb(res.Metadata), Result: metadata.OrgMetadataListToPb(res.Metadata),
Details: object.ToListDetails(res.SearchResponse), Pagination: &filter.PaginationResponse{
TotalResult: res.Count,
AppliedLimit: uint64(request.GetPagination().GetLimit()),
},
}, nil }, nil
} }
@@ -132,7 +139,7 @@ func (s *Server) AddOrganizationDomain(ctx context.Context, request *org.AddOrga
} }
func (s *Server) ListOrganizationDomains(ctx context.Context, req *org.ListOrganizationDomainsRequest) (*org.ListOrganizationDomainsResponse, error) { func (s *Server) ListOrganizationDomains(ctx context.Context, req *org.ListOrganizationDomainsRequest) (*org.ListOrganizationDomainsResponse, error) {
queries, err := ListOrgDomainsRequestToModel(req) queries, err := ListOrgDomainsRequestToModel(s.systemDefaults, req)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -147,8 +154,11 @@ func (s *Server) ListOrganizationDomains(ctx context.Context, req *org.ListOrgan
return nil, err return nil, err
} }
return &org.ListOrganizationDomainsResponse{ return &org.ListOrganizationDomainsResponse{
Result: object.DomainsToPb(domains.Domains), Result: object.DomainsToPb(domains.Domains),
Details: object.ToListDetails(domains.SearchResponse), Pagination: &filter.PaginationResponse{
TotalResult: domains.Count,
AppliedLimit: uint64(req.GetPagination().GetLimit()),
},
}, nil }, nil
} }

View File

@@ -6,6 +6,7 @@ import (
"github.com/zitadel/zitadel/internal/api/authz" "github.com/zitadel/zitadel/internal/api/authz"
"github.com/zitadel/zitadel/internal/api/grpc/server" "github.com/zitadel/zitadel/internal/api/grpc/server"
"github.com/zitadel/zitadel/internal/command" "github.com/zitadel/zitadel/internal/command"
"github.com/zitadel/zitadel/internal/config/systemdefaults"
"github.com/zitadel/zitadel/internal/domain" "github.com/zitadel/zitadel/internal/domain"
"github.com/zitadel/zitadel/internal/query" "github.com/zitadel/zitadel/internal/query"
org "github.com/zitadel/zitadel/pkg/grpc/org/v2beta" org "github.com/zitadel/zitadel/pkg/grpc/org/v2beta"
@@ -15,6 +16,7 @@ var _ org.OrganizationServiceServer = (*Server)(nil)
type Server struct { type Server struct {
org.UnimplementedOrganizationServiceServer org.UnimplementedOrganizationServiceServer
systemDefaults systemdefaults.SystemDefaults
command *command.Commands command *command.Commands
query *query.Queries query *query.Queries
checkPermission domain.PermissionCheck checkPermission domain.PermissionCheck
@@ -23,11 +25,13 @@ type Server struct {
type Config struct{} type Config struct{}
func CreateServer( func CreateServer(
systemDefaults systemdefaults.SystemDefaults,
command *command.Commands, command *command.Commands,
query *query.Queries, query *query.Queries,
checkPermission domain.PermissionCheck, checkPermission domain.PermissionCheck,
) *Server { ) *Server {
return &Server{ return &Server{
systemDefaults: systemDefaults,
command: command, command: command,
query: query, query: query,
checkPermission: checkPermission, checkPermission: checkPermission,

View File

@@ -45,7 +45,7 @@ enum OrgFieldName {
ORG_FIELD_NAME_CREATION_DATE = 2; ORG_FIELD_NAME_CREATION_DATE = 2;
} }
message OrgQuery { message OrgQueryFilter {
oneof query { oneof query {
option (validate.required) = true; option (validate.required) = true;

View File

@@ -15,6 +15,7 @@ import "google/protobuf/struct.proto";
import "protoc-gen-openapiv2/options/annotations.proto"; import "protoc-gen-openapiv2/options/annotations.proto";
import "validate/validate.proto"; import "validate/validate.proto";
import "google/protobuf/timestamp.proto"; import "google/protobuf/timestamp.proto";
import "zitadel/filter/v2beta/filter.proto";
option go_package = "github.com/zitadel/zitadel/pkg/grpc/org/v2beta;org"; option go_package = "github.com/zitadel/zitadel/pkg/grpc/org/v2beta;org";
@@ -488,21 +489,21 @@ message ListOrganizationsRequest {
json_schema: { json_schema: {
description: "Search query for lists"; description: "Search query for lists";
required: ["query"] required: ["query"]
}; };
}; };
// list limitations and ordering // List limitations and ordering.
zitadel.object.v2beta.ListQuery query = 1; optional zitadel.filter.v2beta.PaginationRequest pagination = 1;
// the field the result is sorted // the field the result is sorted
zitadel.org.v2beta.OrgFieldName sorting_column = 2; zitadel.org.v2beta.OrgFieldName sorting_column = 2;
//criteria the client is looking for // Define the criteria to query for.
repeated zitadel.org.v2beta.OrgQuery queries = 3; // repeated ProjectRoleFilter filters = 4;
repeated zitadel.org.v2beta.OrgQueryFilter filter = 3;
} }
message ListOrganizationsResponse { message ListOrganizationsResponse {
zitadel.object.v2beta.ListDetails details = 1; zitadel.filter.v2beta.PaginationResponse pagination = 1;
zitadel.org.v2beta.OrgFieldName sorting_column = 2; repeated zitadel.org.v2beta.Organization result = 2;
repeated zitadel.org.v2beta.Organization result = 3;
} }
message DeleteOrganizationRequest { message DeleteOrganizationRequest {
@@ -613,14 +614,15 @@ message ListOrganizationDomainsRequest {
description: "Organization ID of the organization you want the domains of." description: "Organization ID of the organization you want the domains of."
} }
]; ];
//list limitations and ordering
zitadel.object.v2beta.ListQuery query = 2; // List limitations and ordering.
//criteria the client is looking for optional zitadel.filter.v2beta.PaginationRequest pagination = 2;
repeated DomainSearchQuery queries = 3; // Define the criteria to query for.
repeated DomainSearchQuery filter = 3;
} }
message ListOrganizationDomainsResponse { message ListOrganizationDomainsResponse {
zitadel.object.v2beta.ListDetails details = 1; zitadel.filter.v2beta.PaginationResponse pagination = 1;
repeated Domain result = 2; repeated Domain result = 2;
} }
@@ -638,6 +640,7 @@ message DeleteOrganizationDomainRequest {
string domain = 2 [ string domain = 2 [
(validate.rules).string = {min_len: 1, max_len: 200}, (validate.rules).string = {min_len: 1, max_len: 200},
(google.api.field_behavior) = REQUIRED, (google.api.field_behavior) = REQUIRED,
// repeated ProjectRoleFilter filters = 4;
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
min_length: 1; min_length: 1;
max_length: 200; max_length: 200;
@@ -746,17 +749,25 @@ message SetOrganizationMetadataResponse{
} }
message ListOrganizationMetadataRequest { message ListOrganizationMetadataRequest {
string id = 1; // Organization ID
zitadel.object.v2beta.ListQuery query = 2; string id = 1 [
repeated zitadel.metadata.v2beta.MetadataQuery queries = 3 [ (validate.rules).string = {min_len: 1, max_len: 200},
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { (google.api.field_behavior) = REQUIRED,
title: "Medata Query" (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "Metadata object-specific queries." min_length: 1;
}]; max_length: 200;
example: "\"69629012906488334\"";
}
];
// List limitations and ordering.
optional zitadel.filter.v2beta.PaginationRequest pagination = 2;
// Define the criteria to query for.
repeated zitadel.metadata.v2beta.MetadataQuery filter = 3;
} }
message ListOrganizationMetadataResponse { message ListOrganizationMetadataResponse {
zitadel.object.v2beta.ListDetails details = 1; zitadel.filter.v2beta.PaginationResponse pagination = 1;
repeated zitadel.metadata.v2beta.Metadata result = 2; repeated zitadel.metadata.v2beta.Metadata result = 2;
} }