From 51585a32d0f9eeff943cb698e0bdd53209c14aff Mon Sep 17 00:00:00 2001
From: Rudy Crespo <rcrespo@gitlab.com>
Date: Thu, 9 Mar 2023 15:29:33 +0000
Subject: [PATCH] Provide legacy page data if feature flag disabled

As part of the conversion to GraphQL, legacy page data will only be
passed down to app if the contribution-analytics-graphql feature flag
is disabled.

EE: true
---
 .../analytics/contribution_analytics/index.js | 13 ++++++-
 .../contribution_analytics/show.html.haml     | 11 +-----
 .../contribution_analytics/data_collector.rb  | 17 +++++++++
 .../data_collector_spec.rb                    | 35 ++++++++++++++++++-
 4 files changed, 64 insertions(+), 12 deletions(-)

diff --git a/ee/app/assets/javascripts/analytics/contribution_analytics/index.js b/ee/app/assets/javascripts/analytics/contribution_analytics/index.js
index 71f2a32e2e36b..1681c16f51c29 100644
--- a/ee/app/assets/javascripts/analytics/contribution_analytics/index.js
+++ b/ee/app/assets/javascripts/analytics/contribution_analytics/index.js
@@ -1,5 +1,6 @@
 import Vue from 'vue';
 import VueApollo from 'vue-apollo';
+import * as Sentry from '@sentry/browser';
 import createDefaultClient from '~/lib/graphql';
 import LegacyApp from './legacy_components/app.vue';
 import App from './components/app.vue';
@@ -27,12 +28,22 @@ export default (el) => {
     memberContributionsPath,
   } = el.dataset;
 
+  let analyticsDataParsed = {};
+
+  if (!gon.features?.contributionAnalyticsGraphql) {
+    try {
+      analyticsDataParsed = JSON.parse(analyticsData);
+    } catch (e) {
+      Sentry.captureException(e);
+    }
+  }
+
   const {
     labels,
     push,
     merge_requests_created: mergeRequestsCreated,
     issues_closed: issuesClosed,
-  } = JSON.parse(analyticsData);
+  } = analyticsDataParsed;
 
   return new Vue({
     el,
diff --git a/ee/app/views/groups/contribution_analytics/show.html.haml b/ee/app/views/groups/contribution_analytics/show.html.haml
index 6fcae73653376..97433f2f960ca 100644
--- a/ee/app/views/groups/contribution_analytics/show.html.haml
+++ b/ee/app/views/groups/contribution_analytics/show.html.haml
@@ -14,15 +14,6 @@
     start_date: @start_date.to_date.iso8601,
     end_date: Date.today.iso8601,
 
-    analytics_data: @data_collector.group_member_contributions_table_data.to_json.html_safe,
-    total_push_count: @data_collector.total_push_count,
-    total_commit_count: @data_collector.total_commit_count,
-    total_push_author_count: @data_collector.total_push_author_count,
-    total_merge_requests_closed_count: @data_collector.total_merge_requests_closed_count,
-    total_merge_requests_created_count: @data_collector.total_merge_requests_created_count,
-    total_merge_requests_merged_count: @data_collector.total_merge_requests_merged_count,
-    total_issues_created_count: @data_collector.total_issues_created_count,
-    total_issues_closed_count: @data_collector.total_issues_closed_count,
-    member_contributions_path: group_contribution_analytics_path(@group, { start_date: @start_date, format: :json })
+    **@data_collector.legacy_page_data
   }
 }
diff --git a/ee/lib/gitlab/contribution_analytics/data_collector.rb b/ee/lib/gitlab/contribution_analytics/data_collector.rb
index 63e73d039e6c5..0946555bd4ddb 100644
--- a/ee/lib/gitlab/contribution_analytics/data_collector.rb
+++ b/ee/lib/gitlab/contribution_analytics/data_collector.rb
@@ -130,6 +130,23 @@ def totals
         }
       end
 
+      def legacy_page_data
+        return {} if Feature.enabled?(:contribution_analytics_graphql, group)
+
+        {
+          analytics_data: group_member_contributions_table_data.to_json.html_safe,
+          total_push_count: total_push_count,
+          total_commit_count: total_commit_count,
+          total_push_author_count: total_push_author_count,
+          total_merge_requests_closed_count: total_merge_requests_closed_count,
+          total_merge_requests_created_count: total_merge_requests_created_count,
+          total_merge_requests_merged_count: total_merge_requests_merged_count,
+          total_issues_created_count: total_issues_created_count,
+          total_issues_closed_count: total_issues_closed_count,
+          member_contributions_path: ::Gitlab::Routing.url_helpers.group_contribution_analytics_path(group, { start_date: from, format: :json })
+        }
+      end
+
       # rubocop: disable CodeReuse/ActiveRecord
       def base_query
         cte = Gitlab::SQL::CTE.new(:project_ids,
diff --git a/ee/spec/lib/gitlab/contribution_analytics/data_collector_spec.rb b/ee/spec/lib/gitlab/contribution_analytics/data_collector_spec.rb
index 9ef6f4c5a980b..c63e321a075ea 100644
--- a/ee/spec/lib/gitlab/contribution_analytics/data_collector_spec.rb
+++ b/ee/spec/lib/gitlab/contribution_analytics/data_collector_spec.rb
@@ -2,7 +2,7 @@
 
 require 'spec_helper'
 
-RSpec.describe Gitlab::ContributionAnalytics::DataCollector do
+RSpec.describe Gitlab::ContributionAnalytics::DataCollector, feature_category: :value_stream_management do
   let_it_be(:group) { create(:group) }
   let_it_be(:project1) { create(:project, group: group) }
   let_it_be(:project2) { create(:project, group: group) }
@@ -136,4 +136,37 @@
       end
     end
   end
+
+  describe '#legacy_page_data' do
+    subject { described_class.new(group: group).legacy_page_data }
+
+    context 'when contribution_analytics_graphql feature flag is enabled' do
+      before do
+        stub_feature_flags(contribution_analytics_graphql: true)
+      end
+
+      it { is_expected.to eq({}) }
+    end
+
+    context 'when contribution_analytics_graphql feature flag is not enabled' do
+      before do
+        stub_feature_flags(contribution_analytics_graphql: false)
+      end
+
+      it {
+        is_expected.to include(
+          :analytics_data,
+          :total_push_count,
+          :total_commit_count,
+          :total_push_author_count,
+          :total_merge_requests_closed_count,
+          :total_merge_requests_created_count,
+          :total_merge_requests_merged_count,
+          :total_issues_created_count,
+          :total_issues_closed_count,
+          :member_contributions_path
+        )
+      }
+    end
+  end
 end
-- 
GitLab