Feature Flag Setup - CDCgov/prime-simplereport GitHub Wiki
The feature flag setup allows developers to deploy new functionality in dark and later launch the feature live by turning the flag on. The current setup also allows the frontend and the backend to share the same source of truth hence being always in sync.
Using this setup will launch the feature at the application/org/facility level. If you need to launch a feature at the user level another method using okta groups has been used in the past.
Overview
The setup consists of 3 main pieces:
FeatureFlagsConfig
object.GET /feature-flags
REST endpoint.WithFeatureFlags
react context.
FeatureFlagsConfig object
When the server starts this object loads the flag values that have been setup in the application yaml under the features property. To have access to the feature flags on the Java code import this object as part of the Java class that needs access (example of integration with Java class).
When creating a new flag, besides adding the flag and its value as a property to the yaml file, you also need to add it as a new property of this object.
As an optional capability this configuration object can be set up to retrieve the flag value from the database every minute allowing the possibility of turning on a feature without the need of a redeployment or a server restart (both things are needed when relying on setting the flag through the yaml only). This extra setup is done by adding a new entry to the feature_flag table in our DB and adding the logic to map that entry value to the config object.
GET /feature-flags REST endpoint
The backend exposes a GET /feature-flags endpoint (through the FeatureFlagsController.java) which returns a JSON with all the flags and their values to the UI. No change is needed in this service when adding a new flag as it will automatically reflect the new additions in the response.
WithFeatureFlags context
In the UI side the application uses the flagged
library to implement a react context called WithFeatureFlags.tsx that takes care of calling the /feature-flags endpoint on load and injecting the flag values in the application's root component. Through the use of the useFeature
hook any component in SimpleReport can access any flag value (example of integration with react component).
Additional: DB models and feature_flag table
As mentioned in the FeatureFlagsConfig section. This setup also has the capability to set the flag value in the database to allow the launch of a feature without the need of code changes (updates to the yaml) and redeployments.
To support this load of values the backend also counts with a FeatureFlag.java which is the model to represent an entry from the feature_flag table, and the FeatureFlagRepository.Java with is the object used to connect and retrieve the values to the database.