Feature flags modul
Pomocí modulu a jeho logiky lze rychle nastavovat příznaky bežící platformy
- příznaky jsou reprezentované názvem a boolean stavem
- jejich definice pak obsahuje výchozí hodnotu, možnosti uložení a modul kam logicky patří
- z kódu lze nastavení příznaku získat statickou metodou, dle typu uložení pak lze nastavení měnit
- změna je možná jak globálně (pro danou JVM), tak jen pro daného uživatele (jeho session)
Modul je dostupný od Edee v7.6.0 a jedná se o tzv. systémový modul, který není nutné konfigurovat - je povolený vždy. Aktuální dokumentace pokrývá stav dostupný od Edee v10.4.0.
Čtení stavu
získání hodnoty pomocí FlagsHolder
// se specifikací výchozího stavu, pokud není příznak nastvenboolean previewMode = FlagsHolder.getFlags().isEnabled(EdeeFlags.PREVIEW_MODE,false);
// kontrola stavu, výchozí hodnota brána z definiceif (FlagsHolder.getFlags().isEnabled(EdeeFlags.ADMIN_BAR)) { // povoleno}Změna stavu
Pro změnu nastavení lze použít získanou instanci Flags
Flags flags = FlagsHolder.getFlags();if (flags instanceof FlagsSetter) { ((FlagsSetter) flags).setFeatureFlag(EdeeFlags.ASSESSMENT_MODE, true);}Nebo lépe přes helper metodu
// modifikace dle definice uložení příznakuFlagsSetter.setFlag(EdeeFlags.ASSESSMENT_MODE, true);
// modifikace s určením uložení (např. pokud jich příznak povoluje více)FlagsSetter.setFlag(EdeeFlags.ADMIN_BAR, true, FlagPersistenceType.USER_CLIENT_STORE);Možnosti uložení
Definováno pomocí enumerace FlagPersistenceType
USER_SESSION- stav je uložen v session uživatele, nastavená hodnota mizí po zavření prohlížečeUSER_CLIENT_STORE- stav je uložen na straně prohlížeče návštěvníka (jako cookie), používat s ohledem na bezpečnostJVM_STATE- nastavení na úrovni JVM instance, po restartem aplikačního serveru není zachována, změna není reflektována v clusteruPROJECT_WIDE- nastavení je uloženo do db projektu, přežije tedy i restart a hodnota je dostupná v celém clusteru (aktuálně se ale chová stejně jako JVM_STATE)
Definice příznaku
Příznak (FlagDefinition) je definován
- název - unikátní název reprezentující ve zkratce jeho účel (
name) - výchozí hodnota (
enabledByDefault) - původ - tedy v jakém modulu příznak vzniká (
originModule) - persistence - určuje jakým způsobem lze příznak nastavit (
persistenceTypes)
Známé příznaky jsou evidovány v FlagRegistry, pro jejich registraci lze využít builder pattern
public static final String PREVIEW_MODE = "edee.previewMode";public static final FlagDefinition PREVIEW_MODE_FLAG = FlagRegistry.builder(PREVIEW_MODE) .module("previewmode") .persistence(USER_SESSION) .register();Registrace je zajistěna i pokud cizí modul poskytuje com.fg.edee.featureflags.registry.FlagDefinitionProvider.
Ramjet
V ramjet stránce lze nastavit hodnotu pomocí interceptoru
com.fg.edee.integration.web.ui.featureflag.SetFeatureFlagInterceptor
nebo pomocí command
com.fg.edee.integration.web.ui.featureflag.SetFeatureFlagCommand
Lze také provést registraci nového příznaku pomocí
com.fg.edee.integration.web.ui.featureflag.RegisterFeatureFlagInterceptor
Pro získání aktuální hodnoty je pak připraven provider
com.fg.edee.integration.web.ui.featureflag.FeatureFlagDataProvider
REST API
Stav příznaků lze číst i přes REST API, které poskytuje samostatný modul lib_feature_flags_rest_api
(v modules.xml se zapíná elementem <featureflagsrestapimodule/>). Modul vystavuje pod prefixem /api/featureflags:
- veřejný endpoint
GET /api/featureflags/public/server- bez přihlášení vrací jen příznaky výslovně povolené v konfiguraci (<publicAccess>/<flag>) a stav odstávky (edee.maintenanceMode), typicky pro headless frontend, - administrační endpointy
GET /api/featureflags/flagsaGET /api/featureflags/flags/{name}- vyžadují přihlášení a oprávnění ke čtení příznaků.
