feat: Feature flag for relational tables (#10599)

# Which Problems Are Solved

This PR introduces a new feature flag `EnableRelationalTables` that will
be used in following implementations to decide whether Zitadel should
use the relational model or the event sourcing one.

# TODO

  - [x] Implement flag at system level
- [x] Display the flag on console:
https://github.com/zitadel/zitadel/pull/10615

# How the Problems Are Solved

  - Implement loading the flag from config
- Add persistence of the flag through gRPC endpoint
(SetInstanceFeatures)
- Implement reading of the flag through gRPC endpoint
(GetInstanceFeatures)

# Additional Changes

Some minor refactoring to remove un-needed generics annotations

# Additional Context

- Closes #10574

---------

Co-authored-by: Silvan <[email protected]>
This commit is contained in:
Marco A.
2025-09-02 09:48:46 +00:00
committed by GitHub
co-authored by Silvan
parent e3dff2482e
commit 75a67be669
46 changed files with 669 additions and 91 deletions
@@ -36,6 +36,7 @@ const FEATURE_KEYS = [
'oidcTokenExchange',
'permissionCheckV2',
'userSchema',
'enableRelationalTables',
] as const;
export type ToggleState = { source: Source; enabled: boolean };
+3 -1
View File
@@ -1653,7 +1653,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Когато този флаг е активиран, конзолата използва V2 User API за създаване на нови потребители. С V2 API новосъздадените потребители започват без начален статус.",
"LOGINV2": "Вход V2",
"LOGINV2_DESCRIPTION": "Активирането на това включва новия потребителски интерфейс за вход, базиран на TypeScript, с подобрена сигурност, производителност и възможности за персонализиране.",
"LOGINV2_BASEURI": "Базов URI"
"LOGINV2_BASEURI": "Базов URI",
"ENABLERELATIONALTABLES": "Релационни таблици",
"ENABLERELATIONALTABLES_DESCRIPTION": "Активирайте това, за да използвате релационни таблици вместо проекции за съхранение на данни. В момента този превключвател не прави нищо."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1654,7 +1654,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Když je tato příznak povolen, konzole používá V2 User API k vytvoření nových uživatelů. S V2 API nově vytvoření uživatelé začínají bez počátečního stavu.",
"LOGINV2": "Přihlášení V2",
"LOGINV2_DESCRIPTION": "Povolením této možnosti se aktivuje nové přihlašovací rozhraní založené na TypeScriptu s vylepšeným zabezpečením, výkonem a přizpůsobitelností.",
"LOGINV2_BASEURI": "Základní URI"
"LOGINV2_BASEURI": "Základní URI",
"ENABLERELATIONALTABLES": "Relační tabulky",
"ENABLERELATIONALTABLES_DESCRIPTION": "Povolte toto pro použití relačních tabulek místo projekcí pro ukládání dat. Momentálně tento přepínač nic nedělá."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1654,7 +1654,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Wenn diese Option aktiviert ist, verwendet die Konsole die V2 User API, um neue Benutzer zu erstellen. Mit der V2 API starten neu erstellte Benutzer nicht im Initial Zustand.",
"LOGINV2": "Login V2",
"LOGINV2_DESCRIPTION": "Durch das Aktivieren wird das neue TypeScript-basierte Login-UI mit verbesserter Sicherheit, Leistung und Anpassbarkeit aktiviert.",
"LOGINV2_BASEURI": "Basis-URI"
"LOGINV2_BASEURI": "Basis-URI",
"ENABLERELATIONALTABLES": "Relationale Tabellen",
"ENABLERELATIONALTABLES_DESCRIPTION": "Aktivieren Sie diese Option, um relationale Tabellen anstelle von Projektionen zur Datenspeicherung zu verwenden. Diese Option hat derzeit keine Auswirkung."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1658,7 +1658,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "When this flag is enabled, the console uses the V2 User API to create new users. With the V2 API, newly created users start without an initial state.",
"LOGINV2": "Login V2",
"LOGINV2_DESCRIPTION": "Enabling this activates the new TypeScript-based login UI with improved security, performance, and customization.",
"LOGINV2_BASEURI": "Base URI"
"LOGINV2_BASEURI": "Base URI",
"ENABLERELATIONALTABLES": "Relational Tables",
"ENABLERELATIONALTABLES_DESCRIPTION": "Enable this to use relational tables instead of projections for storing data. Currently this toggle does nothing."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1655,7 +1655,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Cuando esta opción está habilitada, la consola utiliza la API V2 de usuario para crear nuevos usuarios. Con la API V2, los usuarios recién creados comienzan sin un estado inicial.",
"LOGINV2": "Inicio de sesión V2",
"LOGINV2_DESCRIPTION": "Al habilitar esto, se activa la nueva interfaz de inicio de sesión basada en TypeScript con mejoras en seguridad, rendimiento y personalización.",
"LOGINV2_BASEURI": "URI base"
"LOGINV2_BASEURI": "URI base",
"ENABLERELATIONALTABLES": "Tablas relacionales",
"ENABLERELATIONALTABLES_DESCRIPTION": "Habilitar esto para usar tablas relacionales en lugar de proyecciones para almacenar datos. Actualmente este interruptor no hace nada."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1654,7 +1654,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Lorsque ce drapeau est activé, la console utilise l'API V2 User pour créer de nouveaux utilisateurs. Avec l'API V2, les nouveaux utilisateurs commencent sans état initial.",
"LOGINV2": "Connexion V2",
"LOGINV2_DESCRIPTION": "L’activation de cette option lance la nouvelle interface de connexion basée sur TypeScript, avec une sécurité, des performances et une personnalisation améliorées.",
"LOGINV2_BASEURI": "URI de base"
"LOGINV2_BASEURI": "URI de base",
"ENABLERELATIONALTABLES": "Tables relationnelles",
"ENABLERELATIONALTABLES_DESCRIPTION": "Activez ceci pour utiliser des tables relationnelles au lieu de projections pour stocker des données. Actuellement, ce commutateur ne fait rien."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1652,7 +1652,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Ha ez a jelző engedélyezve van, a konzol a V2 User API-t használja új felhasználók létrehozásához. A V2 API-val az újonnan létrehozott felhasználók kezdeti állapot nélkül indulnak.",
"LOGINV2": "Bejelentkezés V2",
"LOGINV2_DESCRIPTION": "Ennek engedélyezésével aktiválódik az új, TypeScript-alapú bejelentkezési felület, amely jobb biztonságot, teljesítményt és testreszabhatóságot nyújt.",
"LOGINV2_BASEURI": "Alap URI"
"LOGINV2_BASEURI": "Alap URI",
"ENABLERELATIONALTABLES": "Kapcsolati táblák",
"ENABLERELATIONALTABLES_DESCRIPTION": "Engedélyez ezt a relációs táblák használatához a projekciók helyett az adatok tárolásához. Jelenleg ez a kapcsoló semmit sem csinál."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1521,7 +1521,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Ketika flag ini diaktifkan, konsol menggunakan API Pengguna V2 untuk membuat pengguna baru. Dengan API V2, pengguna yang baru dibuat dimulai tanpa keadaan awal.",
"LOGINV2": "Login V2",
"LOGINV2_DESCRIPTION": "Mengaktifkan ini akan mengaktifkan antarmuka login baru berbasis TypeScript dengan keamanan, performa, dan kustomisasi yang lebih baik.",
"LOGINV2_BASEURI": "URI dasar"
"LOGINV2_BASEURI": "URI dasar",
"ENABLERELATIONALTABLES": "Tabel Relasional",
"ENABLERELATIONALTABLES_DESCRIPTION": "Aktifkan ini untuk menggunakan tabel relasional alih-alih proyeksi untuk menyimpan data. Saat ini, toggle ini tidak berfungsi."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1654,7 +1654,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Quando questa opzione è abilitata, la console utilizza l'API V2 User per creare nuovi utenti. Con l'API V2, i nuovi utenti creati iniziano senza uno stato iniziale.",
"LOGINV2": "Accesso V2",
"LOGINV2_DESCRIPTION": "Abilitando questa opzione si attiva la nuova interfaccia di login basata su TypeScript con sicurezza, prestazioni e personalizzazione migliorate.",
"LOGINV2_BASEURI": "URI di base"
"LOGINV2_BASEURI": "URI di base",
"ENABLERELATIONALTABLES": "Tabelle relazionali",
"ENABLERELATIONALTABLES_DESCRIPTION": "Abilita questo toggle per utilizzare le tabelle relazionali invece di proiezioni per memorizzare i dati. Attualmente questo toggle non fa nulla."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1654,7 +1654,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "このフラグが有効化されると、コンソールはV2ユーザーAPIを使用して新しいユーザーを作成します。V2 APIでは、新しく作成されたユーザーは初期状態なしで開始します。",
"LOGINV2": "ログイン V2",
"LOGINV2_DESCRIPTION": "これを有効にすると、セキュリティ、パフォーマンス、およびカスタマイズ性が向上した、TypeScript ベースの新しいログイン UI が有効になります。",
"LOGINV2_BASEURI": "ベースURI"
"LOGINV2_BASEURI": "ベースURI",
"ENABLERELATIONALTABLES": "リレーショナルテーブル",
"ENABLERELATIONALTABLES_DESCRIPTION": "データを保存するためにプロジェクションの代わりにリレーショナルテーブルを使用するには、これを有効にします。現在、このトグルは何もしません。"
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1654,7 +1654,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "이 플래그가 활성화되면 콘솔은 V2 사용자 API를 사용하여 새 사용자를 생성합니다. V2 API를 사용하면 새로 생성된 사용자는 초기 상태 없이 시작합니다.",
"LOGINV2": "로그인 V2",
"LOGINV2_DESCRIPTION": "이 옵션을 활성화하면 보안, 성능 및 사용자 정의 기능이 향상된 새로운 TypeScript 기반 로그인 UI가 활성화됩니다.",
"LOGINV2_BASEURI": "기본 URI"
"LOGINV2_BASEURI": "기본 URI",
"ENABLERELATIONALTABLES": "관계형 테이블",
"ENABLERELATIONALTABLES_DESCRIPTION": "데이터 저장을 위해 프로젝션 대신 관계형 테이블을 사용하려면 이를 활성화하십시오. 현재 이 토글은 아무런 기능을 하지 않습니다."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1655,7 +1655,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Кога ова знаме е овозможено, конзолата го користи V2 User API за креирање на нови корисници. Со V2 API, новосоздадените корисници започнуваат без почетна состојба.",
"LOGINV2": "Најава V2",
"LOGINV2_DESCRIPTION": "Овозможувањето на ова ја активира новата TypeScript-базирана најава со подобрена безбедност, перформанси и прилагодливост.",
"LOGINV2_BASEURI": "Основен URI"
"LOGINV2_BASEURI": "Основен URI",
"ENABLERELATIONALTABLES": "Релациски табели",
"ENABLERELATIONALTABLES_DESCRIPTION": "Овозможете го ова за користење на релациски табели наместо проекции за складирање податоци. Во моментов, овој прекинувач не прави ништо."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1654,7 +1654,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Wanneer deze vlag is ingeschakeld, gebruikt de console de V2 User API om nieuwe gebruikers aan te maken. Met de V2 API beginnen nieuw aangemaakte gebruikers zonder een initiële status.",
"LOGINV2": "Inloggen V2",
"LOGINV2_DESCRIPTION": "Door dit in te schakelen wordt de nieuwe TypeScript-gebaseerde login-UI geactiveerd met verbeterde beveiliging, prestaties en aanpasbaarheid.",
"LOGINV2_BASEURI": "Basis-URI"
"LOGINV2_BASEURI": "Basis-URI",
"ENABLERELATIONALTABLES": "Relationele tabellen",
"ENABLERELATIONALTABLES_DESCRIPTION": "Schakel dit in om relationele tabellen te gebruiken in plaats van projecties voor het opslaan van gegevens. Momenteel doet deze schakelaar niets."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1653,7 +1653,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Gdy ta flaga jest włączona, konsola używa API V2 User do tworzenia nowych użytkowników. W przypadku API V2 nowo utworzeni użytkownicy rozpoczynają bez stanu początkowego.",
"LOGINV2": "Logowanie V2",
"LOGINV2_DESCRIPTION": "Włączenie tej opcji aktywuje nowy interfejs logowania oparty na TypeScript z ulepszonym bezpieczeństwem, wydajnością i możliwością dostosowania.",
"LOGINV2_BASEURI": "Podstawowy URI"
"LOGINV2_BASEURI": "Podstawowy URI",
"ENABLERELATIONALTABLES": "Tabele relacyjne",
"ENABLERELATIONALTABLES_DESCRIPTION": "Włącz to, aby używać tabel relacyjnych zamiast projekcji do przechowywania danych. Obecnie ten przełącznik nic nie robi."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1655,7 +1655,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Quando esta opção está ativada, o console utiliza a API V2 de Usuários para criar novos usuários. Com a API V2, os novos usuários criados começam sem um estado inicial.",
"LOGINV2": "Login V2",
"LOGINV2_DESCRIPTION": "Ativar esta opção ativa a nova interface de login baseada em TypeScript, com melhorias na segurança, desempenho e personalização.",
"LOGINV2_BASEURI": "URI base"
"LOGINV2_BASEURI": "URI base",
"ENABLERELATIONALTABLES": "Tabelas relacionais",
"ENABLERELATIONALTABLES_DESCRIPTION": "Ative isso para usar tabelas relacionais em vez de projeções para armazenar dados. Atualmente, este interruptor não faz nada."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1652,7 +1652,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Când acest indicator este activat, consola utilizează API-ul de utilizator V2 pentru a crea utilizatori noi. Cu API-ul V2, utilizatorii nou creați încep fără o stare inițială.",
"LOGINV2": "Autentificare V2",
"LOGINV2_DESCRIPTION": "Activarea acestei opțiuni pornește noua interfață de autentificare bazată pe TypeScript, cu securitate, performanță și personalizare îmbunătățite.",
"LOGINV2_BASEURI": "URI de bază"
"LOGINV2_BASEURI": "URI de bază",
"ENABLERELATIONALTABLES": "Tabele relaționale",
"ENABLERELATIONALTABLES_DESCRIPTION": "Activați acest lucru pentru a utiliza tabele relaționale în loc de proiecții pentru stocarea datelor. În prezent, acest comutator nu face nimic."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1707,7 +1707,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Когда этот флаг включен, консоль использует V2 User API для создания новых пользователей. С API V2 новые пользователи создаются без начального состояния.",
"LOGINV2": "Вход V2",
"LOGINV2_DESCRIPTION": "Включение этой опции активирует новый интерфейс входа на основе TypeScript с улучшенной безопасностью, производительностью и возможностью настройки.",
"LOGINV2_BASEURI": "Базовый URI"
"LOGINV2_BASEURI": "Базовый URI",
"ENABLERELATIONALTABLES": "Реляционные таблицы",
"ENABLERELATIONALTABLES_DESCRIPTION": "Включите это, чтобы использовать реляционные таблицы вместо проекций для хранения данных. В настоящее время этот переключатель ничего не делает."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1658,7 +1658,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "När denna flagga är aktiverad använder konsolen V2 User API för att skapa nya användare. Med V2 API startar nyligen skapade användare utan ett initialt tillstånd.",
"LOGINV2": "Inloggning V2",
"LOGINV2_DESCRIPTION": "Att aktivera detta startar det nya inloggningsgränssnittet baserat på TypeScript med förbättrad säkerhet, prestanda och anpassning.",
"LOGINV2_BASEURI": "Bas-URI"
"LOGINV2_BASEURI": "Bas-URI",
"ENABLERELATIONALTABLES": "Relationella tabeller",
"ENABLERELATIONALTABLES_DESCRIPTION": "Aktivera detta för att använda relationella tabeller istället för projektioner för att lagra data. För närvarande gör denna växel ingenting."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1657,7 +1657,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "Bu bayrak etkinleştirildiğinde, konsol yeni kullanıcılar oluşturmak için V2 Kullanıcı API'sini kullanır. V2 API ile yeni oluşturulan kullanıcılar başlangıç durumu olmadan başlar.",
"LOGINV2": "Giriş V2",
"LOGINV2_DESCRIPTION": "Bunu etkinleştirmek, gelişmiş güvenlik, performans ve özelleştirme ile yeni TypeScript tabanlı giriş UI'ını etkinleştirir.",
"LOGINV2_BASEURI": "Temel URI"
"LOGINV2_BASEURI": "Temel URI",
"ENABLERELATIONALTABLES": "İlişkisel Tablolar",
"ENABLERELATIONALTABLES_DESCRIPTION": "Veri depolamak için projeksiyonlar yerine ilişkisel tabloları kullanmak için bunu etkinleştirin. Şu anda bu anahtar hiçbir şey yapmıyor."
},
"DIALOG": {
"RESET": {
+3 -1
View File
@@ -1657,7 +1657,9 @@
"CONSOLEUSEV2USERAPI_DESCRIPTION": "启用此标志时,控制台使用V2用户API创建新用户。使用V2 API,新创建的用户将以无初始状态开始。",
"LOGINV2": "登录 V2",
"LOGINV2_DESCRIPTION": "启用此选项将激活基于 TypeScript 的新登录界面,具有更高的安全性、性能和可定制性。",
"LOGINV2_BASEURI": "基础 URI"
"LOGINV2_BASEURI": "基础 URI",
"ENABLERELATIONALTABLES": "关系表",
"ENABLERELATIONALTABLES_DESCRIPTION": "启用此功能以使用关系表而不是投影来存储数据。目前此切换没有任何作用。"
},
"DIALOG": {
"RESET": {