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
+14
View File
@@ -84,6 +84,13 @@ message SetInstanceFeaturesRequest{
description: "If this is enabled the console web client will use the new User v2 API for certain calls";
}
];
optional bool enable_relational_tables = 16 [
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
example: "true";
description: "If this is enabled Zitadel will use the relational tables instead of the projections as the main source to store the data. Regardless of the flag state, both the relational table and the projections are kept up to date. Currently the flag has no effect.";
}
];
}
message SetInstanceFeaturesResponse {
@@ -178,4 +185,11 @@ message GetInstanceFeaturesResponse {
description: "If this is enabled the console web client will use the new User v2 API for certain calls";
}
];
FeatureFlag enable_relational_tables = 17 [
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
example: "true";
description: "If this is enabled Zitadel will use the relational tables instead of the projections as the main source to store the data. Regardless of the flag state, both the relational table and the projections are kept up to date. Currently the flag has no effect.";
}
];
}
+15
View File
@@ -70,6 +70,14 @@ message SetSystemFeaturesRequest{
description: "Enable a newer, more performant, permission check used for v2 and v3 resource based APIs.";
}
];
optional bool enable_relational_tables = 13 [
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
example: "true";
description: "If this is enabled Zitadel will use the relational tables instead of the projections as the main source to store the data. Regardless of the flag state, both the relational table and the projections are kept up to date. Currently the flag has no effect.";
}
];
}
message SetSystemFeaturesResponse {
@@ -143,4 +151,11 @@ message GetSystemFeaturesResponse {
description: "Enable a newer, more performant, permission check used for v2 and v3 resource based APIs.";
}
];
FeatureFlag enable_relational_tables = 14 [
(grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {
example: "true";
description: "If this is enabled Zitadel will use the relational tables instead of the projections as the main source to store the data. Regardless of the flag state, both the relational table and the projections are kept up to date. Currently the flag has no effect.";
}
];
}