feat(/internal): Add User Resource Owner (#9168)

Update the  ../proto/zitadel/member.proto to
include the UserResourceOwner as part of member.

Update the queries to include UserResourceOwner
for the following :
zitadel/internal/query/iam_member.go
zitadel/internal/query/org_member.go
zitadel/internal/query/project_member.go
zitadel/internal/query/project_grant_member.go

Non Breaking Changes

# Which Problems Are Solved

https://github.com/zitadel/zitadel/issues/5062

# How the Problems Are Solved

- Updated the member.proto file to include user_resource_owner. I have
compiled using` make compile` command .
- Changed the queries to include the userResourceOwner as part of
Member.
- Then, updated the converter to map the userResourceOwner.

# Additional Changes

Replace this example text with a concise list of additional changes that
this PR introduces, that are not directly solving the initial problem
but are related.
For example:
- The docs explicitly describe that the property XY is mandatory
- Adds missing translations for validations.

# Additional Context


- Closes #5062 
-
https://discordapp.com/channels/927474939156643850/1326245856193544232/1326476710752948316
This commit is contained in:
MAHANTH-wq 2025-01-15 14:10:30 +05:30 committed by GitHub
parent d01d003a03
commit b664ffe993
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
11 changed files with 78 additions and 5 deletions

View File

@ -34,6 +34,7 @@ func MemberToPb(assetAPIPrefix string, m *query.Member) *member_pb.Member {
m.ChangeDate,
m.ResourceOwner,
),
UserResourceOwner: m.UserResourceOwner,
}
}

View File

@ -44,6 +44,10 @@ var (
name: projection.MemberResourceOwner,
table: instanceMemberTable,
}
InstanceMemberUserResourceOwner = Column{
name: projection.MemberUserResourceOwner,
table: instanceMemberTable,
}
InstanceMemberInstanceID = Column{
name: projection.MemberInstanceID,
table: instanceMemberTable,
@ -96,6 +100,7 @@ func prepareInstanceMembersQuery(ctx context.Context, db prepareDatabase) (sq.Se
InstanceMemberChangeDate.identifier(),
InstanceMemberSequence.identifier(),
InstanceMemberResourceOwner.identifier(),
InstanceMemberUserResourceOwner.identifier(),
InstanceMemberUserID.identifier(),
InstanceMemberRoles.identifier(),
LoginNameNameCol.identifier(),
@ -138,6 +143,7 @@ func prepareInstanceMembersQuery(ctx context.Context, db prepareDatabase) (sq.Se
&member.ChangeDate,
&member.Sequence,
&member.ResourceOwner,
&member.UserResourceOwner,
&member.UserID,
&member.Roles,
&preferredLoginName,

View File

@ -18,6 +18,7 @@ var (
", members.change_date" +
", members.sequence" +
", members.resource_owner" +
", members.user_resource_owner" +
", members.user_id" +
", members.roles" +
", projections.login_names3.login_name" +
@ -45,6 +46,7 @@ var (
"change_date",
"sequence",
"resource_owner",
"user_resource_owner",
"user_id",
"roles",
"login_name",
@ -97,6 +99,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id",
database.TextArray[string]{"role-1", "role-2"},
"gigi@caos-ag.zitadel.ch",
@ -121,6 +124,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "gigi@caos-ag.zitadel.ch",
@ -147,6 +151,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id",
database.TextArray[string]{"role-1", "role-2"},
"machine@caos-ag.zitadel.ch",
@ -171,6 +176,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "machine@caos-ag.zitadel.ch",
@ -197,6 +203,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id-1",
database.TextArray[string]{"role-1", "role-2"},
"gigi@caos-ag.zitadel.ch",
@ -213,6 +220,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id-2",
database.TextArray[string]{"role-1", "role-2"},
"machine@caos-ag.zitadel.ch",
@ -237,6 +245,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id-1",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "gigi@caos-ag.zitadel.ch",
@ -252,6 +261,7 @@ func Test_IAMMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id-2",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "machine@caos-ag.zitadel.ch",

View File

@ -47,11 +47,11 @@ type Members struct {
}
type Member struct {
CreationDate time.Time
ChangeDate time.Time
Sequence uint64
ResourceOwner string
CreationDate time.Time
ChangeDate time.Time
Sequence uint64
ResourceOwner string
UserResourceOwner string
UserID string
Roles database.TextArray[string]
PreferredLoginName string

View File

@ -44,6 +44,10 @@ var (
name: projection.MemberResourceOwner,
table: orgMemberTable,
}
OrgMemberUserResourceOwner = Column{
name: projection.MemberUserResourceOwner,
table: orgMemberTable,
}
OrgMemberInstanceID = Column{
name: projection.MemberInstanceID,
table: orgMemberTable,
@ -99,6 +103,7 @@ func prepareOrgMembersQuery(ctx context.Context, db prepareDatabase) (sq.SelectB
OrgMemberChangeDate.identifier(),
OrgMemberSequence.identifier(),
OrgMemberResourceOwner.identifier(),
OrgMemberUserResourceOwner.identifier(),
OrgMemberUserID.identifier(),
OrgMemberRoles.identifier(),
LoginNameNameCol.identifier(),
@ -141,6 +146,7 @@ func prepareOrgMembersQuery(ctx context.Context, db prepareDatabase) (sq.SelectB
&member.ChangeDate,
&member.Sequence,
&member.ResourceOwner,
&member.UserResourceOwner,
&member.UserID,
&member.Roles,
&preferredLoginName,

View File

@ -18,6 +18,7 @@ var (
", members.change_date" +
", members.sequence" +
", members.resource_owner" +
", members.user_resource_owner" +
", members.user_id" +
", members.roles" +
", projections.login_names3.login_name" +
@ -49,6 +50,7 @@ var (
"change_date",
"sequence",
"resource_owner",
"user_resource_owner",
"user_id",
"roles",
"login_name",
@ -101,6 +103,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id",
database.TextArray[string]{"role-1", "role-2"},
"gigi@caos-ag.zitadel.ch",
@ -125,6 +128,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "gigi@caos-ag.zitadel.ch",
@ -151,6 +155,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id",
database.TextArray[string]{"role-1", "role-2"},
"machine@caos-ag.zitadel.ch",
@ -175,6 +180,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "machine@caos-ag.zitadel.ch",
@ -201,6 +207,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id-1",
database.TextArray[string]{"role-1", "role-2"},
"gigi@caos-ag.zitadel.ch",
@ -217,6 +224,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id-2",
database.TextArray[string]{"role-1", "role-2"},
"machine@caos-ag.zitadel.ch",
@ -241,6 +249,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id-1",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "gigi@caos-ag.zitadel.ch",
@ -256,6 +265,7 @@ func Test_OrgMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id-2",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "machine@caos-ag.zitadel.ch",

View File

@ -43,6 +43,10 @@ var (
name: projection.MemberResourceOwner,
table: projectGrantMemberTable,
}
ProjectGrantMemberUserResourceOwner = Column{
name: projection.MemberUserResourceOwner,
table: projectGrantMemberTable,
}
ProjectGrantMemberInstanceID = Column{
name: projection.MemberInstanceID,
table: projectGrantMemberTable,
@ -108,6 +112,7 @@ func prepareProjectGrantMembersQuery(ctx context.Context, db prepareDatabase) (s
ProjectGrantMemberChangeDate.identifier(),
ProjectGrantMemberSequence.identifier(),
ProjectGrantMemberResourceOwner.identifier(),
ProjectGrantMemberUserResourceOwner.identifier(),
ProjectGrantMemberUserID.identifier(),
ProjectGrantMemberRoles.identifier(),
LoginNameNameCol.identifier(),
@ -151,6 +156,7 @@ func prepareProjectGrantMembersQuery(ctx context.Context, db prepareDatabase) (s
&member.ChangeDate,
&member.Sequence,
&member.ResourceOwner,
&member.UserResourceOwner,
&member.UserID,
&member.Roles,
&preferredLoginName,

View File

@ -18,6 +18,7 @@ var (
", members.change_date" +
", members.sequence" +
", members.resource_owner" +
", members.user_resource_owner" +
", members.user_id" +
", members.roles" +
", projections.login_names3.login_name" +
@ -52,6 +53,7 @@ var (
"change_date",
"sequence",
"resource_owner",
"user_resource_owner",
"user_id",
"roles",
"login_name",
@ -104,6 +106,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id",
database.TextArray[string]{"role-1", "role-2"},
"gigi@caos-ag.zitadel.ch",
@ -128,6 +131,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "gigi@caos-ag.zitadel.ch",
@ -154,6 +158,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id",
database.TextArray[string]{"role-1", "role-2"},
"machine@caos-ag.zitadel.ch",
@ -178,6 +183,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "machine@caos-ag.zitadel.ch",
@ -204,6 +210,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id-1",
database.TextArray[string]{"role-1", "role-2"},
"gigi@caos-ag.zitadel.ch",
@ -220,6 +227,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id-2",
database.TextArray[string]{"role-1", "role-2"},
"machine@caos-ag.zitadel.ch",
@ -244,6 +252,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id-1",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "gigi@caos-ag.zitadel.ch",
@ -259,6 +268,7 @@ func Test_ProjectGrantMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id-2",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "machine@caos-ag.zitadel.ch",

View File

@ -44,6 +44,10 @@ var (
name: projection.MemberResourceOwner,
table: projectMemberTable,
}
ProjectMemberUserResourceOwner = Column{
name: projection.MemberUserResourceOwner,
table: projectMemberTable,
}
ProjectMemberInstanceID = Column{
name: projection.MemberInstanceID,
table: projectMemberTable,
@ -99,6 +103,7 @@ func prepareProjectMembersQuery(ctx context.Context, db prepareDatabase) (sq.Sel
ProjectMemberChangeDate.identifier(),
ProjectMemberSequence.identifier(),
ProjectMemberResourceOwner.identifier(),
ProjectMemberUserResourceOwner.identifier(),
ProjectMemberUserID.identifier(),
ProjectMemberRoles.identifier(),
LoginNameNameCol.identifier(),
@ -141,6 +146,7 @@ func prepareProjectMembersQuery(ctx context.Context, db prepareDatabase) (sq.Sel
&member.ChangeDate,
&member.Sequence,
&member.ResourceOwner,
&member.UserResourceOwner,
&member.UserID,
&member.Roles,
&preferredLoginName,

View File

@ -18,6 +18,7 @@ var (
", members.change_date" +
", members.sequence" +
", members.resource_owner" +
", members.user_resource_owner" +
", members.user_id" +
", members.roles" +
", projections.login_names3.login_name" +
@ -49,6 +50,7 @@ var (
"change_date",
"sequence",
"resource_owner",
"user_resource_owner",
"user_id",
"roles",
"login_name",
@ -101,6 +103,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id",
database.TextArray[string]{"role-1", "role-2"},
"gigi@caos-ag.zitadel.ch",
@ -125,6 +128,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "gigi@caos-ag.zitadel.ch",
@ -151,6 +155,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id",
database.TextArray[string]{"role-1", "role-2"},
"machine@caos-ag.zitadel.ch",
@ -175,6 +180,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "machine@caos-ag.zitadel.ch",
@ -201,6 +207,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id-1",
database.TextArray[string]{"role-1", "role-2"},
"gigi@caos-ag.zitadel.ch",
@ -217,6 +224,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
testNow,
uint64(20211206),
"ro",
"uro",
"user-id-2",
database.TextArray[string]{"role-1", "role-2"},
"machine@caos-ag.zitadel.ch",
@ -241,6 +249,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id-1",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "gigi@caos-ag.zitadel.ch",
@ -256,6 +265,7 @@ func Test_ProjectMemberPrepares(t *testing.T) {
ChangeDate: testNow,
Sequence: 20211206,
ResourceOwner: "ro",
UserResourceOwner: "uro",
UserID: "user-id-2",
Roles: database.TextArray[string]{"role-1", "role-2"},
PreferredLoginName: "machine@caos-ag.zitadel.ch",

View File

@ -63,6 +63,14 @@ message Member {
description: "type of the user (human / machine)"
}
];
// The organization the user belong to.
string user_resource_owner = 11 [
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
example: "\"69629023906488334\"";
}
];
}
message SearchQuery {