fix(api): correct mapping of user state queries (#9956)

# Which Problems Are Solved

the mapping of `ListUsers` was wrong for user states.

# How the Problems Are Solved

mapping of user state introduced to correctly map it

# Additional Changes

mapping of user type introduced to prevent same issue

# Additional Context

Requires backport to 2.x and 3.x

Co-authored-by: Livio Spring <livio.a@gmail.com>
(cherry picked from commit eb0eed21fa682774e476d0c720c501b37f0f7793)
This commit is contained in:
Silvan 2025-05-26 13:23:38 +02:00 committed by Livio Spring
parent 3c99cf82f8
commit c9a0f0bc45
No known key found for this signature in database
8 changed files with 113 additions and 9 deletions

View File

@ -84,11 +84,11 @@ func EmailQueryToQuery(q *user_pb.EmailQuery) (query.SearchQuery, error) {
} }
func StateQueryToQuery(q *user_pb.StateQuery) (query.SearchQuery, error) { func StateQueryToQuery(q *user_pb.StateQuery) (query.SearchQuery, error) {
return query.NewUserStateSearchQuery(int32(q.State)) return query.NewUserStateSearchQuery(q.State.ToDomain())
} }
func TypeQueryToQuery(q *user_pb.TypeQuery) (query.SearchQuery, error) { func TypeQueryToQuery(q *user_pb.TypeQuery) (query.SearchQuery, error) {
return query.NewUserTypeSearchQuery(int32(q.Type)) return query.NewUserTypeSearchQuery(q.Type.ToDomain())
} }
func LoginNameQueryToQuery(q *user_pb.LoginNameQuery) (query.SearchQuery, error) { func LoginNameQueryToQuery(q *user_pb.LoginNameQuery) (query.SearchQuery, error) {

View File

@ -301,11 +301,11 @@ func phoneQueryToQuery(q *user.PhoneQuery) (query.SearchQuery, error) {
} }
func stateQueryToQuery(q *user.StateQuery) (query.SearchQuery, error) { func stateQueryToQuery(q *user.StateQuery) (query.SearchQuery, error) {
return query.NewUserStateSearchQuery(int32(q.State)) return query.NewUserStateSearchQuery(q.State.ToDomain())
} }
func typeQueryToQuery(q *user.TypeQuery) (query.SearchQuery, error) { func typeQueryToQuery(q *user.TypeQuery) (query.SearchQuery, error) {
return query.NewUserTypeSearchQuery(int32(q.Type)) return query.NewUserTypeSearchQuery(q.Type.ToDomain())
} }
func loginNameQueryToQuery(q *user.LoginNameQuery) (query.SearchQuery, error) { func loginNameQueryToQuery(q *user.LoginNameQuery) (query.SearchQuery, error) {

View File

@ -295,11 +295,11 @@ func phoneQueryToQuery(q *user.PhoneQuery) (query.SearchQuery, error) {
} }
func stateQueryToQuery(q *user.StateQuery) (query.SearchQuery, error) { func stateQueryToQuery(q *user.StateQuery) (query.SearchQuery, error) {
return query.NewUserStateSearchQuery(int32(q.State)) return query.NewUserStateSearchQuery(q.State.ToDomain())
} }
func typeQueryToQuery(q *user.TypeQuery) (query.SearchQuery, error) { func typeQueryToQuery(q *user.TypeQuery) (query.SearchQuery, error) {
return query.NewUserTypeSearchQuery(int32(q.Type)) return query.NewUserTypeSearchQuery(q.Type.ToDomain())
} }
func loginNameQueryToQuery(q *user.LoginNameQuery) (query.SearchQuery, error) { func loginNameQueryToQuery(q *user.LoginNameQuery) (query.SearchQuery, error) {

View File

@ -70,7 +70,7 @@ func (h *UsersHandler) buildListQuery(ctx context.Context, request *ListRequest)
} }
// the zitadel scim implementation only supports humans for now // the zitadel scim implementation only supports humans for now
userTypeQuery, err := query.NewUserTypeSearchQuery(int32(domain.UserTypeHuman)) userTypeQuery, err := query.NewUserTypeSearchQuery(domain.UserTypeHuman)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@ -768,11 +768,11 @@ func NewUserVerifiedPhoneSearchQuery(value string, comparison TextComparison) (S
return NewTextQuery(NotifyVerifiedPhoneCol, value, comparison) return NewTextQuery(NotifyVerifiedPhoneCol, value, comparison)
} }
func NewUserStateSearchQuery(value int32) (SearchQuery, error) { func NewUserStateSearchQuery(value domain.UserState) (SearchQuery, error) {
return NewNumberQuery(UserStateCol, value, NumberEquals) return NewNumberQuery(UserStateCol, value, NumberEquals)
} }
func NewUserTypeSearchQuery(value int32) (SearchQuery, error) { func NewUserTypeSearchQuery(value domain.UserType) (SearchQuery, error) {
return NewNumberQuery(UserTypeCol, value, NumberEquals) return NewNumberQuery(UserTypeCol, value, NumberEquals)
} }

View File

@ -1,5 +1,7 @@
package user package user
import "github.com/zitadel/zitadel/internal/domain"
type SearchQuery_ResourceOwner struct { type SearchQuery_ResourceOwner struct {
ResourceOwner *ResourceOwnerQuery ResourceOwner *ResourceOwnerQuery
} }
@ -13,3 +15,37 @@ type ResourceOwnerQuery struct {
type UserType = isUser_Type type UserType = isUser_Type
type MembershipType = isMembership_Type type MembershipType = isMembership_Type
func (s UserState) ToDomain() domain.UserState {
switch s {
case UserState_USER_STATE_UNSPECIFIED:
return domain.UserStateUnspecified
case UserState_USER_STATE_ACTIVE:
return domain.UserStateActive
case UserState_USER_STATE_INACTIVE:
return domain.UserStateInactive
case UserState_USER_STATE_DELETED:
return domain.UserStateDeleted
case UserState_USER_STATE_LOCKED:
return domain.UserStateLocked
case UserState_USER_STATE_SUSPEND:
return domain.UserStateSuspend
case UserState_USER_STATE_INITIAL:
return domain.UserStateInitial
default:
return domain.UserStateUnspecified
}
}
func (t Type) ToDomain() domain.UserType {
switch t {
case Type_TYPE_UNSPECIFIED:
return domain.UserTypeUnspecified
case Type_TYPE_HUMAN:
return domain.UserTypeHuman
case Type_TYPE_MACHINE:
return domain.UserTypeMachine
default:
return domain.UserTypeUnspecified
}
}

View File

@ -1,3 +1,37 @@
package user package user
import "github.com/zitadel/zitadel/internal/domain"
type UserType = isUser_Type type UserType = isUser_Type
func (s UserState) ToDomain() domain.UserState {
switch s {
case UserState_USER_STATE_UNSPECIFIED:
return domain.UserStateUnspecified
case UserState_USER_STATE_ACTIVE:
return domain.UserStateActive
case UserState_USER_STATE_INACTIVE:
return domain.UserStateInactive
case UserState_USER_STATE_DELETED:
return domain.UserStateDeleted
case UserState_USER_STATE_LOCKED:
return domain.UserStateLocked
case UserState_USER_STATE_INITIAL:
return domain.UserStateInitial
default:
return domain.UserStateUnspecified
}
}
func (t Type) ToDomain() domain.UserType {
switch t {
case Type_TYPE_UNSPECIFIED:
return domain.UserTypeUnspecified
case Type_TYPE_HUMAN:
return domain.UserTypeHuman
case Type_TYPE_MACHINE:
return domain.UserTypeMachine
default:
return domain.UserTypeUnspecified
}
}

View File

@ -1,3 +1,37 @@
package user package user
import "github.com/zitadel/zitadel/internal/domain"
type UserType = isUser_Type type UserType = isUser_Type
func (s UserState) ToDomain() domain.UserState {
switch s {
case UserState_USER_STATE_UNSPECIFIED:
return domain.UserStateUnspecified
case UserState_USER_STATE_ACTIVE:
return domain.UserStateActive
case UserState_USER_STATE_INACTIVE:
return domain.UserStateInactive
case UserState_USER_STATE_DELETED:
return domain.UserStateDeleted
case UserState_USER_STATE_LOCKED:
return domain.UserStateLocked
case UserState_USER_STATE_INITIAL:
return domain.UserStateInitial
default:
return domain.UserStateUnspecified
}
}
func (t Type) ToDomain() domain.UserType {
switch t {
case Type_TYPE_UNSPECIFIED:
return domain.UserTypeUnspecified
case Type_TYPE_HUMAN:
return domain.UserTypeHuman
case Type_TYPE_MACHINE:
return domain.UserTypeMachine
default:
return domain.UserTypeUnspecified
}
}