fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! fixup! Merge branch 'main' into org_api

This commit is contained in:
Iraq Jaber
2025-05-21 10:34:52 +02:00
parent 733b0852d5
commit 83a5371fe6
6 changed files with 78 additions and 85 deletions

View File

@@ -5,6 +5,7 @@ import (
"github.com/zitadel/zitadel/internal/query" "github.com/zitadel/zitadel/internal/query"
"github.com/zitadel/zitadel/internal/zerrors" "github.com/zitadel/zitadel/internal/zerrors"
meta_pb "github.com/zitadel/zitadel/pkg/grpc/metadata/v2beta" meta_pb "github.com/zitadel/zitadel/pkg/grpc/metadata/v2beta"
"google.golang.org/protobuf/types/known/timestamppb"
) )
// code in this file is copied from internal/api/grpc/metadata/metadata.go // code in this file is copied from internal/api/grpc/metadata/metadata.go
@@ -19,14 +20,10 @@ func OrgMetadataListToPb(dataList []*query.OrgMetadata) []*meta_pb.Metadata {
func OrgMetadataToPb(data *query.OrgMetadata) *meta_pb.Metadata { func OrgMetadataToPb(data *query.OrgMetadata) *meta_pb.Metadata {
return &meta_pb.Metadata{ return &meta_pb.Metadata{
Key: data.Key, Key: data.Key,
Value: data.Value, Value: data.Value,
Details: v2beta_object.ToViewDetailsPb( CreationDate: timestamppb.New(data.CreationDate),
data.Sequence, ChangeDate: timestamppb.New(data.ChangeDate),
data.CreationDate,
data.ChangeDate,
data.ResourceOwner,
),
} }
} }

View File

@@ -2,7 +2,6 @@ package object
import ( import (
"context" "context"
"time"
"google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/timestamppb"
@@ -116,25 +115,6 @@ func DomainValidationTypeFromModel(validationType domain.OrgDomainValidationType
} }
} }
func ToViewDetailsPb(
sequence uint64,
creationDate,
changeDate time.Time,
resourceOwner string,
) *object.Details {
details := &object.Details{
Sequence: sequence,
ResourceOwner: resourceOwner,
}
if !creationDate.IsZero() {
details.CreationDate = timestamppb.New(creationDate)
}
if !changeDate.IsZero() {
details.ChangeDate = timestamppb.New(changeDate)
}
return details
}
func DomainValidationTypeToDomain(validationType org_pb.DomainValidationType) domain.OrgDomainValidationType { func DomainValidationTypeToDomain(validationType org_pb.DomainValidationType) domain.OrgDomainValidationType {
switch validationType { switch validationType {
case org_pb.DomainValidationType_DOMAIN_VALIDATION_TYPE_HTTP: case org_pb.DomainValidationType_DOMAIN_VALIDATION_TYPE_HTTP:

View File

@@ -150,17 +150,6 @@ func FieldNameToOrgColumn(fieldName v2beta_org.OrgFieldName) query.Column {
} }
} }
// func OrgViewToPb(org *query.Org) *v2beta_org.Organization {
// return &v2beta_org.Organization{
// Id: org.ID,
// State: OrgStateToPb(org.State),
// Name: org.Name,
// PrimaryDomain: org.Domain,
// CreationDate: timestamppb.New(org.CreationDate),
// ChangedDate: timestamppb.New(org.ChangeDate),
// }
// }
func ListOrgDomainsRequestToModel(systemDefaults systemdefaults.SystemDefaults, request *org.ListOrganizationDomainsRequest) (*query.OrgDomainSearchQueries, error) { func ListOrgDomainsRequestToModel(systemDefaults systemdefaults.SystemDefaults, request *org.ListOrganizationDomainsRequest) (*query.OrgDomainSearchQueries, error) {
offset, limit, asc, err := filter.PaginationPbToQuery(systemDefaults, request.Pagination) offset, limit, asc, err := filter.PaginationPbToQuery(systemDefaults, request.Pagination)
if err != nil { if err != nil {
@@ -202,7 +191,6 @@ func DomainQueriesToModel(queries []*v2beta_org.DomainSearchFilter) (_ []query.S
func DomainQueryToModel(searchQuery *v2beta_org.DomainSearchFilter) (query.SearchQuery, error) { func DomainQueryToModel(searchQuery *v2beta_org.DomainSearchFilter) (query.SearchQuery, error) {
switch q := searchQuery.Filter.(type) { switch q := searchQuery.Filter.(type) {
case *v2beta_org.DomainSearchFilter_DomainNameFilter: case *v2beta_org.DomainSearchFilter_DomainNameFilter:
// return query.NewOrgDomainDomainSearchQuery(object.TextMethodToQuery(q.DomainNameQuery.Method), q.DomainNameQuery.Name)
return query.NewOrgDomainDomainSearchQuery(v2beta_object.TextMethodToQuery(q.DomainNameFilter.Method), q.DomainNameFilter.Name) return query.NewOrgDomainDomainSearchQuery(v2beta_object.TextMethodToQuery(q.DomainNameFilter.Method), q.DomainNameFilter.Name)
default: default:
return nil, zerrors.ThrowInvalidArgument(nil, "ORG-Ags89", "List.Query.Invalid") return nil, zerrors.ThrowInvalidArgument(nil, "ORG-Ags89", "List.Query.Invalid")

View File

@@ -5,6 +5,7 @@ package org_test
import ( import (
"context" "context"
"errors" "errors"
"fmt"
"os" "os"
"strings" "strings"
"testing" "testing"
@@ -25,11 +26,10 @@ import (
) )
var ( var (
CTX context.Context CTX context.Context
Instance *integration.Instance Instance *integration.Instance
Client v2beta_org.OrganizationServiceClient Client v2beta_org.OrganizationServiceClient
AdminClient admin.AdminServiceClient User *user.AddHumanUserResponse
User *user.AddHumanUserResponse
) )
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
@@ -39,7 +39,6 @@ func TestMain(m *testing.M) {
Instance = integration.NewInstance(ctx) Instance = integration.NewInstance(ctx)
Client = Instance.Client.OrgV2beta Client = Instance.Client.OrgV2beta
AdminClient = Instance.Client.Admin
CTX = Instance.WithAuthorization(ctx, integration.UserTypeIAMOwner) CTX = Instance.WithAuthorization(ctx, integration.UserTypeIAMOwner)
User = Instance.CreateHumanUser(CTX) User = Instance.CreateHumanUser(CTX)
@@ -168,6 +167,7 @@ func TestServer_CreateOrganization(t *testing.T) {
for _, tt := range tests { for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
got, err := Client.CreateOrganization(tt.ctx, tt.req) got, err := Client.CreateOrganization(tt.ctx, tt.req)
fmt.Printf("@@ >>>>>>>>>>>>>>>>>>>>>>>>>>>> err = %+v\n", err)
if tt.wantErr { if tt.wantErr {
require.Error(t, err) require.Error(t, err)
return return
@@ -279,12 +279,17 @@ func TestServer_ListOrganization(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
tests := []struct { tests := []struct {
name string name string
ctx context.Context ctx context.Context
query []*v2beta_org.OrganizationSearchFilter query []*v2beta_org.OrganizationSearchFilter
want []*v2beta_org.Organization want []*v2beta_org.Organization
wantErr bool err error
}{ }{
{
name: "list organizations, without required permissions",
ctx: ListOrgIinstance.WithAuthorization(CTX, integration.UserTypeNoPermission),
err: errors.New("membership not found"),
},
{ {
name: "list organizations happy path, no filter", name: "list organizations happy path, no filter",
ctx: listOrgIAmOwnerCtx, ctx: listOrgIAmOwnerCtx,
@@ -538,9 +543,9 @@ func TestServer_ListOrganization(t *testing.T) {
got, err := listOrgClient.ListOrganizations(tt.ctx, &v2beta_org.ListOrganizationsRequest{ got, err := listOrgClient.ListOrganizations(tt.ctx, &v2beta_org.ListOrganizationsRequest{
Filter: tt.query, Filter: tt.query,
}) })
if tt.err != nil {
if tt.wantErr { require.ErrorContains(t, err, tt.err.Error())
assert.Error(ttt, err) return
} }
require.NoError(ttt, err) require.NoError(ttt, err)
@@ -585,6 +590,20 @@ func TestServer_DeleteOrganization(t *testing.T) {
dontCheckTime bool dontCheckTime bool
err error err error
}{ }{
{
name: "delete org no permission",
ctx: Instance.WithAuthorization(CTX, integration.UserTypeNoPermission),
createOrgFunc: func() string {
orgs, _, err := createOrgs(CTX, Client, 1)
if err != nil {
assert.Fail(t, "unable to create org")
return ""
}
return orgs[0].Id
},
req: &v2beta_org.DeleteOrganizationRequest{},
err: errors.New("membership not found"),
},
{ {
name: "delete org happy path", name: "delete org happy path",
ctx: Instance.WithAuthorization(CTX, integration.UserTypeIAMOwner), ctx: Instance.WithAuthorization(CTX, integration.UserTypeIAMOwner),
@@ -982,7 +1001,7 @@ func TestServer_ValidateOrganizationDomain(t *testing.T) {
} }
orgId := orgs[0].Id orgId := orgs[0].Id
_, err = AdminClient.UpdateDomainPolicy(CTX, &admin.UpdateDomainPolicyRequest{ _, err = Instance.Client.Admin.UpdateDomainPolicy(CTX, &admin.UpdateDomainPolicyRequest{
ValidateOrgDomains: true, ValidateOrgDomains: true,
}) })
if err != nil && !strings.Contains(err.Error(), "Organisation is already deactivated") { if err != nil && !strings.Contains(err.Error(), "Organisation is already deactivated") {

View File

@@ -194,7 +194,6 @@ func prepareOrgMetadataQuery() (sq.SelectBuilder, func(*sql.Row) (*OrgMetadata,
&m.Key, &m.Key,
&m.Value, &m.Value,
) )
if err != nil { if err != nil {
if errors.Is(err, sql.ErrNoRows) { if errors.Is(err, sql.ErrNoRows) {
return nil, zerrors.ThrowNotFound(err, "QUERY-Rph32", "Errors.Metadata.NotFound") return nil, zerrors.ThrowNotFound(err, "QUERY-Rph32", "Errors.Metadata.NotFound")

View File

@@ -3,45 +3,55 @@ syntax = "proto3";
import "zitadel/object/v2beta/object.proto"; import "zitadel/object/v2beta/object.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";
package zitadel.metadata.v2beta; package zitadel.metadata.v2beta;
option go_package ="github.com/zitadel/zitadel/pkg/grpc/metadata/v2beta"; option go_package ="github.com/zitadel/zitadel/pkg/grpc/metadata/v2beta";
message Metadata { message Metadata {
zitadel.object.v2beta.Details details = 1; google.protobuf.Timestamp creation_date = 1 [
string key = 2 [ (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { example: "\"2025-01-23T10:34:18.051Z\"";
description: "metadata key", }
example: "\"key1\""; ];
} google.protobuf.Timestamp change_date = 2 [
]; (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
bytes value = 3 [ example: "\"2025-01-23T10:34:18.051Z\"";
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { }
description: "metadata value is base64 encoded, make sure to decode to get the value", ];
example: "\"VGhpcyBpcyBteSBmaXJzdCB2YWx1ZQ==\""; string key = 3 [
} (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
]; description: "metadata key",
example: "\"key1\"";
}
];
bytes value = 4 [
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "metadata value is base64 encoded, make sure to decode to get the value",
example: "\"VGhpcyBpcyBteSBmaXJzdCB2YWx1ZQ==\"";
}
];
} }
message MetadataQuery { message MetadataQuery {
oneof query { oneof query {
option (validate.required) = true; option (validate.required) = true;
MetadataKeyQuery key_query = 1; MetadataKeyQuery key_query = 1;
} }
} }
message MetadataKeyQuery { message MetadataKeyQuery {
string key = 1 [ string key = 1 [
(validate.rules).string = {max_len: 200}, (validate.rules).string = {max_len: 200},
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
example: "\"key\"" example: "\"key\""
} }
]; ];
zitadel.object.v2beta.TextQueryMethod method = 2 [ zitadel.object.v2beta.TextQueryMethod method = 2 [
(validate.rules).enum.defined_only = true, (validate.rules).enum.defined_only = true,
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
description: "defines which text equality method is used"; description: "defines which text equality method is used";
} }
]; ];
} }