Feature Flags
Flo uses database-backed feature flags to control functionality at runtime. Flags can be toggled by admins without redeployment.
Available Flags
| Flag | Controls |
|---|---|
enable_bookings | Booking/scheduling system |
enable_dynamic_entities | Dynamic entity management (SchemaGen) |
enable_user_management | User administration panel |
enable_professionals | Staff/professional management |
enable_services_management | Service/activity management |
enable_blogs | Blog content management (Strapi) |
enable_newsletter | Newsletter subscription and sending |
enable_gallery | Media gallery |
enable_closure_management | Studio closure/holiday management |
enable_analytics | Business analytics dashboard |
enable_sidebar_v2 | New collapsible sidebar with GSAP animations |
enable_immobili | Real estate bounded context |
How It Works
Backend
Feature flags are stored in the database and checked via FeatureFlagsHelper:
if (!FeatureFlagsHelper.IsFeatureEnabled(featureFlags, "enable_bookings"))
return NotFound();
Flags are loaded from the database on each request and cached for 5 minutes (ResponseCache).
Frontend
Flags are fetched before authentication during APP_INITIALIZER. This means the UI can hide/show features even before the user logs in.
Routes are protected using FeatureFlagGuard:
{
path: 'prenotazioni',
canActivate: [FeatureFlagGuard],
data: { ff: 'enable_bookings' }
}
The sidebar dynamically shows/hides menu items based on active flags.
Admin Panel
Admins can toggle feature flags from Settings > Feature Flags in the admin panel. Changes take effect immediately (after the 5-minute cache expires, or on next page reload).
Adding a New Feature Flag
- Database: Add the flag name to the feature flags table via migration or admin panel
- Backend: Check the flag in relevant controllers/services using
FeatureFlagsHelper - Frontend: Add
FeatureFlagGuardto routes and conditionally render UI elements - Sidebar: Update sidebar configuration to include/exclude menu items based on the flag
Bounded Context Flags
For the dynamic entity system, bounded contexts have their own enable flag:
enable_dynamic_entitiesmust be ON (master switch)enable_<boundedContext>must also be ON (e.g.,enable_immobilifor real estate)
Both must be active for a bounded context's entities to load at runtime.