From c8e168ac6970aa07e875ce2e9d12f78cfecdf733 Mon Sep 17 00:00:00 2001 From: Miguel Cabrerizo <30386061+doncicuto@users.noreply.github.com> Date: Tue, 2 Jul 2024 14:08:28 +0200 Subject: [PATCH] fix: remove non-existent colums in getMembershipFromQuery queries (#7869) In issue #7841 @mahmoodfathy commented an issue when the API call for Listing My ZITADEL Manager Roles is called with any kind of query (orgQuery, projectQuery, projectGrantQuery...). A column XXXXXX does not exist (SQLSTATE 42703) error is thrown. The issue was focused in getMembershipFromQuery where filtering queries functions are called: prepareOrgMember, prepareIAMMember, prepareProjectMember and prepareProjectGrantMember Those functions allow queries for columns that are not members of the table to be queried so I've added a conditional clause to avoid using the queries that cannot be called. For example, for prepareOrgMember, member.id, member.project_id and member.grant_id columns are not added to the filter queries ``` for _, q := range query.Queries { if q.Col().table.name == membershipAlias.name && !slices.Contains([]string{membershipIAMID.name, membershipProjectID.name, membershipGrantID.name}, q.Col().name) { builder = q.toQuery(builder) } } return builder.MustSql() ``` Here I show one screenshot where the error "column XXXXXX does not exist (SQLSTATE 42703)" is no longer thrown using an orgQuery. ![image](https://github.com/zitadel/zitadel/assets/30386061/77621e69-71df-42de-b3c5-fa9b4dbf1b89) Should close #7841 ### Definition of Ready - [X] I am happy with the code - [X] Short description of the feature/issue is added in the pr description - [X] PR is linked to the corresponding user story - [X] Acceptance criteria are met - [ ] All open todos and follow ups are defined in a new ticket and justified - [ ] Deviations from the acceptance criteria and design are agreed with the PO and documented. - [X] No debug or dead code - [X] My code has no repetitions - [X] Critical parts are tested automatically - [ ] Where possible E2E tests are implemented - [ ] Documentation/examples are up-to-date - [ ] All non-functional requirements are met - [X] Functionality of the acceptance criteria is checked manually on the dev system. --------- Co-authored-by: Stefan Benz <46600784+stebenz@users.noreply.github.com> --- internal/query/user_membership.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/internal/query/user_membership.go b/internal/query/user_membership.go index b45bd5a94..7ba2629cf 100644 --- a/internal/query/user_membership.go +++ b/internal/query/user_membership.go @@ -68,7 +68,7 @@ func NewMembershipUserIDQuery(userID string) (SearchQuery, error) { } func NewMembershipOrgIDQuery(value string) (SearchQuery, error) { - return NewTextQuery(membershipOrgID, value, TextEquals) + return NewTextQuery(OrgMemberOrgID, value, TextEquals) } func NewMembershipResourceOwnersSearchQuery(ids ...string) (SearchQuery, error) { @@ -84,15 +84,15 @@ func NewMembershipGrantedOrgIDSearchQuery(id string) (SearchQuery, error) { } func NewMembershipProjectIDQuery(value string) (SearchQuery, error) { - return NewTextQuery(membershipProjectID, value, TextEquals) + return NewTextQuery(ProjectMemberProjectID, value, TextEquals) } func NewMembershipProjectGrantIDQuery(value string) (SearchQuery, error) { - return NewTextQuery(membershipGrantID, value, TextEquals) + return NewTextQuery(ProjectGrantMemberGrantID, value, TextEquals) } func NewMembershipIsIAMQuery() (SearchQuery, error) { - return NewNotNullQuery(membershipIAMID) + return NewNotNullQuery(InstanceMemberIAMID) } func (q *MembershipSearchQuery) toQuery(query sq.SelectBuilder) sq.SelectBuilder { @@ -357,7 +357,7 @@ func prepareOrgMember(query *MembershipSearchQuery) (string, []interface{}) { ).From(orgMemberTable.identifier()) for _, q := range query.Queries { - if q.Col().table.name == membershipAlias.name { + if q.Col().table.name == membershipAlias.name || q.Col().table.name == orgMemberTable.name { builder = q.toQuery(builder) } } @@ -380,7 +380,7 @@ func prepareIAMMember(query *MembershipSearchQuery) (string, []interface{}) { ).From(instanceMemberTable.identifier()) for _, q := range query.Queries { - if q.Col().table.name == membershipAlias.name { + if q.Col().table.name == membershipAlias.name || q.Col().table.name == instanceMemberTable.name { builder = q.toQuery(builder) } } @@ -403,7 +403,7 @@ func prepareProjectMember(query *MembershipSearchQuery) (string, []interface{}) ).From(projectMemberTable.identifier()) for _, q := range query.Queries { - if q.Col().table.name == membershipAlias.name { + if q.Col().table.name == membershipAlias.name || q.Col().table.name == projectMemberTable.name { builder = q.toQuery(builder) } } @@ -427,7 +427,7 @@ func prepareProjectGrantMember(query *MembershipSearchQuery) (string, []interfac ).From(projectGrantMemberTable.identifier()) for _, q := range query.Queries { - if q.Col().table.name == membershipAlias.name { + if q.Col().table.name == membershipAlias.name || q.Col().table.name == projectMemberTable.name || q.Col().table.name == projectGrantMemberTable.name { builder = q.toQuery(builder) } }