feat: set metadata at the user level in CreateUser request (#11719)

# Which Problems Are Solved

Currently, metadata can be set/updated only for human users, but it
should be available also for service accounts (machine users).

# How the Problems Are Solved

This is achieved by:
- adding a metadata field at the root level in `CreateUserRequest`,
which makes it available for both `human` and `machine` user types
- returning an error when both the root level and human-level `metadata`
fields are set in the `CreateUserRequest`
- setting `human` and `machine` metadata from the root `metadata` field
in the server layer
- pushing `user.metadata.set` event during machine user creation in the
command layer
- adding integration tests

# Additional Changes
N/A

# Additional Context
- Related to https://github.com/zitadel/zitadel/issues/11369

---------

Co-authored-by: Vitor Bari Buccianti <[email protected]>
Co-authored-by: Silvan <[email protected]>
This commit is contained in:
Gayathri Vijayan
2026-03-03 08:34:43 +00:00
committed by GitHub
co-authored by Vitor Bari Buccianti Silvan
parent 92a628d892
commit 4aacfa842f
29 changed files with 440 additions and 144 deletions
+2
View File
@@ -132,6 +132,8 @@ Errors:
CouldNotGenerate: "تعذر توليد السر"
PAT:
NotFound: "رمز الوصول الشخصي غير موجود"
Metadata:
Conflicting: "يجب عدم تعيين البيانات الوصفية في كلٍ من حقول [user] و[human] في الوقت نفسه"
NotHuman: "يجب أن يكون المستخدم شخصياً"
NotMachine: "يجب أن يكون المستخدم تقنياً"
WrongType: "غير مسموح لنوع المستخدم هذا"
+2
View File
@@ -131,6 +131,8 @@ Errors:
CouldNotGenerate: "Тайната не можа да бъде генерирана"
PAT:
NotFound: "Личен токен за достъп не е намерен"
Metadata:
Conflicting: "Метаданните не трябва да бъдат зададени едновременно в полетата [user] и [human]"
NotHuman: "Потребителят трябва да е личен"
NotMachine: "Потребителят трябва да е техничен"
WrongType: "Не е разрешено за този тип потребител"
+2
View File
@@ -131,6 +131,8 @@ Errors:
CouldNotGenerate: "Tajemství nelze vygenerovat"
PAT:
NotFound: "Osobní přístupový token nenalezen"
Metadata:
Conflicting: "Metadata nesmí být nastavena současně v polích [user] a [human]"
NotHuman: "Uživatel musí být fyzická osoba"
NotMachine: "Uživatel musí být systémový uživatel / technická entita"
WrongType: "Nepovolen pro tento typ uživatele"
+2
View File
@@ -131,6 +131,8 @@ Errors:
CouldNotGenerate: "Secret konnte nicht generiert werden"
PAT:
NotFound: "Persönliches Access Token nicht gefunden"
Metadata:
Conflicting: "Metadaten dürfen nicht gleichzeitig in den Feldern [user] und [human] gesetzt sein"
NotHuman: "Der Benutzer muss eine Person sein"
NotMachine: "Der Benutzer muss technisch sein"
WrongType: "Für diesen Benutzertyp nicht erlaubt"
+2
View File
@@ -132,6 +132,8 @@ Errors:
CouldNotGenerate: "Secret could not be generated"
PAT:
NotFound: "Personal Access Token not found"
Metadata:
Conflicting: "Metadata must not be set on both the user and human fields"
NotHuman: "The User must be personal"
NotMachine: "The User must be technical"
WrongType: "Not allowed for this user type"
+2
View File
@@ -131,6 +131,8 @@ Errors:
CouldNotGenerate: "El secreto no pudo generarse"
PAT:
NotFound: "Token de acceso personal no encontrado"
Metadata:
Conflicting: "Los metadatos no deben definirse simultáneamente en los campos [user] y [human]"
NotHuman: "El usuario debe ser personal"
NotMachine: "El usuario debe ser técnico"
WrongType: "Tipo de usuario no permitido"
+2
View File
@@ -131,6 +131,8 @@ Errors:
CouldNotGenerate: "Secret n'a pas pu être généré"
PAT:
NotFound: "Token d'accès personnel non trouvé"
Metadata:
Conflicting: "Les métadonnées ne doivent pas être définies simultanément dans les champs [user] et [human]"
NotHuman: "L'utilisateur doit être personnel"
NotMachine: "L'utilisateur doit être technique"
WrongType: "Non autorisé pour ce type d'utilisateur"
+2
View File
@@ -131,6 +131,8 @@ Errors:
CouldNotGenerate: "A titkot nem sikerült generálni"
PAT:
NotFound: "A személyes hozzáférési token nem található"
Metadata:
Conflicting: "A metaadatok nem lehetnek egyszerre beállítva a [user] és a [human] mezőkben"
NotHuman: "A felhasználónak személyesnek kell lennie"
NotMachine: "A felhasználónak technikai jellegűnek kell lennie"
WrongType: "Ez a felhasználótípus számára nem engedélyezett"
+2
View File
@@ -131,6 +131,8 @@ Errors:
CouldNotGenerate: "Rahasia tidak dapat dibuat"
PAT:
NotFound: "Token Akses Pribadi tidak ditemukan"
Metadata:
Conflicting: "Metadata tidak boleh diatur secara bersamaan pada field [user] dan [human]"
NotHuman: "Pengguna harus bersifat pribadi"
NotMachine: "Pengguna harus teknis"
WrongType: "Tidak diizinkan untuk jenis pengguna ini"
+2
View File
@@ -131,6 +131,8 @@ Errors:
CouldNotGenerate: "Non è stato possibile generare il Secret"
PAT:
NotFound: "Personal Access Token non trovato"
Metadata:
Conflicting: "I metadati non devono essere impostati contemporaneamente nei campi [user] e [human]"
NotHuman: "L'utente deve essere personale"
NotMachine: "L'utente deve essere tecnico"
WrongType: "Non consentito per questo tipo di utente"
+2
View File
@@ -132,6 +132,8 @@ Errors:
CouldNotGenerate: "シークレットの生成に失敗しました"
PAT:
NotFound: "パーソナルアクセストークンが見つかりません"
Metadata:
Conflicting: "メタデータは [user] と [human] の両方のフィールドに同時に設定してはなりません"
NotHuman: "ユーザーはパーソナルである必要があります"
NotMachine: "ユーザーはテクニカルである必要があります"
WrongType: "このユーザータイプは許可されていません"
+2
View File
@@ -132,6 +132,8 @@ Errors:
CouldNotGenerate: "시크릿을 생성할 수 없습니다"
PAT:
NotFound: "개인 액세스 토큰을 찾을 수 없습니다"
Metadata:
Conflicting: "메타데이터는 [user] 및 [human] 필드에 동시에 설정되어서는 안 됩니다"
NotHuman: "사용자는 개인이어야 합니다"
NotMachine: "사용자는 기술적이어야 합니다"
WrongType: "이 사용자 유형에는 허용되지 않습니다"
+2
View File
@@ -131,6 +131,8 @@ Errors:
CouldNotGenerate: "Тајната не може да биде генерирана"
PAT:
NotFound: "Личниот токен за пристап не е пронајден"
Metadata:
Conflicting: "Метаподатоците не смеат да бидат поставени истовремено во полињата [user] и [human]"
NotHuman: "Корисникот мора да биде личност"
NotMachine: "Корисникот мора да биде технички"
WrongType: "Не е дозволено за овој тип на корисник"
+2
View File
@@ -131,6 +131,8 @@ Errors:
CouldNotGenerate: "Geheim kon niet worden gegenereerd"
PAT:
NotFound: "Persoonlijk toegangstoken niet gevonden"
Metadata:
Conflicting: "Metadata mogen niet tegelijkertijd in de velden [user] en [human] worden ingesteld"
NotHuman: "De gebruiker moet persoonlijk zijn"
NotMachine: "De gebruiker moet technisch zijn"
WrongType: "Niet toegestaan voor dit gebruikerstype"
+2
View File
@@ -131,6 +131,8 @@ Errors:
CouldNotGenerate: "Sekret nie mógł zostać wygenerowany"
PAT:
NotFound: "Osobisty token dostępu nie znaleziony"
Metadata:
Conflicting: "Metadane nie mogą być ustawione jednocześnie w polach [user] i [human]"
NotHuman: "Użytkownik musi być osobą"
NotMachine: "Użytkownik musi być techniczny"
WrongType: "Niedozwolone dla tego typu użytkownika"
+2
View File
@@ -131,6 +131,8 @@ Errors:
CouldNotGenerate: "Não foi possível gerar o segredo"
PAT:
NotFound: "Token de Acesso Pessoal não encontrado"
Metadata:
Conflicting: "Os metadados não devem ser definidos simultaneamente nos campos [user] e [human]"
NotHuman: "O usuário deve ser pessoal"
NotMachine: "O usuário deve ser técnico"
WrongType: "Não permitido para este tipo de usuário"
+2
View File
@@ -132,6 +132,8 @@ Errors:
CouldNotGenerate: "Secretul nu a putut fi generat"
PAT:
NotFound: "Token-ul de acces personal nu a fost găsit"
Metadata:
Conflicting: "Metadatele nu trebuie setate simultan în câmpurile [user] și [human]"
NotHuman: "Utilizatorul trebuie să fie personal"
NotMachine: "Utilizatorul trebuie să fie tehnic"
WrongType: "Nu este permis pentru acest tip de utilizator"
+2
View File
@@ -132,6 +132,8 @@ Errors:
CouldNotGenerate: "Ключ не может быть сгенерирован"
PAT:
NotFound: "Токен личного доступа не найден"
Metadata:
Conflicting: "Метаданные не должны быть заданы одновременно в полях [user] и [human]"
NotHuman: "Пользователь должен быть персональным"
NotMachine: "Пользователь должен быть техническим"
WrongType: "Запрещено для данного типа пользователя"
+2
View File
@@ -131,6 +131,8 @@ Errors:
CouldNotGenerate: "Hemlig kod kunde inte genereras"
PAT:
NotFound: "Personlig åtkomst-token hittades inte"
Metadata:
Conflicting: "Metadata får inte anges samtidigt i fälten [user] och [human]"
NotHuman: "Användaren måste vara en person"
NotMachine: "Användaren måste vara en maskin"
WrongType: "Inte tillåtet för denna användartyp"
+2
View File
@@ -132,6 +132,8 @@ Errors:
CouldNotGenerate: "Gizli anahtar oluşturulamadı"
PAT:
NotFound: "Kişisel Erişim Token'ı bulunamadı"
Metadata:
Conflicting: "Meta veriler [user] ve [human] alanlarında aynı anda ayarlanmamalıdır"
NotHuman: "Kullanıcı kişisel olmalı"
NotMachine: "Kullanıcı teknik olmalı"
WrongType: "Bu kullanıcı türü için izin verilmiyor"
+2
View File
@@ -131,6 +131,8 @@ Errors:
CouldNotGenerate: "Не вдалося згенерувати секрет"
PAT:
NotFound: "Персональний токен доступу не знайдено"
Metadata:
Conflicting: "Метадані не повинні бути встановлені одночасно в полях [user] і [human]"
NotHuman: "Користувач повинен бути особистим"
NotMachine: "Користувач повинен бути технічним"
WrongType: "Не дозволено для цього типу користувача"
+2
View File
@@ -132,6 +132,8 @@ Errors:
CouldNotGenerate: "无法生成秘密"
PAT:
NotFound: "未找到个人访问令牌"
Metadata:
Conflicting: "元数据不得同时在 [user] 和 [human] 字段中设置"
NotHuman: "用户必须是个人"
NotMachine: "用户必须是技术人员"
WrongType: "此用户类型不允许"