[Backend] Add an API to retrieve the state of a project analytics stack
Problem to solve
Analytics instances can be managed by multiple project members on the frontend. To prevent erroneous state management and actions from being performed we should centralise state management in the backend and use it as the only source of truth.
More details in the parent epic Use the backend as the single source of truth f... (&9914 - closed).
Proposed solution
Add a helper method and new GraphQL resource to retrieve the state of a project's analytics stack.
Given a project ID, we should be able to retrieve the following states:
def product_analytics_state
project_analytics_disabled? # check if feature is available if needed
return nil
no_project_instance? # check if Jitsu key exists
return 'create_instance'
instance_initializing? # check if project:{ID}:product_analytics_initializing exists
return 'loading_instance'
no_instance_data? # Check if cube has TrackedEvents.count > 0. Memoize the result for performance.
return 'waiting_for_events'
'show_dashboards'
end
The frontend app can use this information to route to the correct page. And the backend could also use this to check user actions against the current state, for example ProductAnalytics::InitializeStackService.new
should only be called if the state is create_instance
.
Implementation plan
- Add a new helper method for
product_analytics_state
which takes a project UID. - For
no_instance_data
replicate thehasAnalyticsData
query in the backend and memoize the result. - Add a new GraphQL resource for project > product analytics status which calls the helper.
- Update the
ProjectInitializeProductAnalytics
resource to also include the status.- The frontend will rely on this to know what the current state is after calling initialize.