From 5d5bf581d1aabb169d3dfec3aa69e02a10455c4e Mon Sep 17 00:00:00 2001
From: Manoj M J <mmj@gitlab.com>
Date: Thu, 30 Nov 2023 14:17:39 +0000
Subject: [PATCH] Remove usage of `user_interacted_projects` table

---
 .rubocop_todo/gitlab/namespaced_class.yml     |  1 -
 .rubocop_todo/rspec/feature_category.yml      |  1 -
 .rubocop_todo/rspec/named_subject.yml         |  1 -
 app/models/event.rb                           |  1 -
 app/models/user.rb                            |  3 --
 app/models/user_interacted_project.rb         | 39 --------------
 .../orchestration/create_bot_service.rb       |  2 +-
 spec/models/event_spec.rb                     |  9 ----
 spec/models/user_interacted_project_spec.rb   | 52 -------------------
 spec/support/rspec_order_todo.yml             |  1 -
 10 files changed, 1 insertion(+), 109 deletions(-)
 delete mode 100644 app/models/user_interacted_project.rb
 delete mode 100644 spec/models/user_interacted_project_spec.rb

diff --git a/.rubocop_todo/gitlab/namespaced_class.yml b/.rubocop_todo/gitlab/namespaced_class.yml
index 8b59571249c21..67f946e05ecb6 100644
--- a/.rubocop_todo/gitlab/namespaced_class.yml
+++ b/.rubocop_todo/gitlab/namespaced_class.yml
@@ -327,7 +327,6 @@ Gitlab/NamespacedClass:
     - 'app/models/user_custom_attribute.rb'
     - 'app/models/user_detail.rb'
     - 'app/models/user_highest_role.rb'
-    - 'app/models/user_interacted_project.rb'
     - 'app/models/user_mention.rb'
     - 'app/models/user_preference.rb'
     - 'app/models/user_status.rb'
diff --git a/.rubocop_todo/rspec/feature_category.yml b/.rubocop_todo/rspec/feature_category.yml
index 174fda7107fe5..bc5a5880d201a 100644
--- a/.rubocop_todo/rspec/feature_category.yml
+++ b/.rubocop_todo/rspec/feature_category.yml
@@ -4776,7 +4776,6 @@ RSpec/FeatureCategory:
     - 'spec/models/user_custom_attribute_spec.rb'
     - 'spec/models/user_detail_spec.rb'
     - 'spec/models/user_highest_role_spec.rb'
-    - 'spec/models/user_interacted_project_spec.rb'
     - 'spec/models/user_mentions/commit_user_mention_spec.rb'
     - 'spec/models/user_mentions/issue_user_mention_spec.rb'
     - 'spec/models/user_mentions/merge_request_user_mention_spec.rb'
diff --git a/.rubocop_todo/rspec/named_subject.yml b/.rubocop_todo/rspec/named_subject.yml
index 960b5bb5a05a8..461d4114408ba 100644
--- a/.rubocop_todo/rspec/named_subject.yml
+++ b/.rubocop_todo/rspec/named_subject.yml
@@ -2869,7 +2869,6 @@ RSpec/NamedSubject:
     - 'spec/models/uploads/fog_spec.rb'
     - 'spec/models/uploads/local_spec.rb'
     - 'spec/models/user_custom_attribute_spec.rb'
-    - 'spec/models/user_interacted_project_spec.rb'
     - 'spec/models/user_spec.rb'
     - 'spec/models/user_status_spec.rb'
     - 'spec/models/users/credit_card_validation_spec.rb'
diff --git a/app/models/event.rb b/app/models/event.rb
index 7b91727f7d49a..3f024958899bd 100644
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -82,7 +82,6 @@ class Event < ApplicationRecord
   # Callbacks
   after_create :reset_project_activity
   after_create :set_last_repository_updated_at, if: :push_action?
-  after_create ->(event) { UserInteractedProject.track(event) }
 
   # Scopes
   scope :recent, -> { reorder(id: :desc) }
diff --git a/app/models/user.rb b/app/models/user.rb
index a7c90765be184..8576a9fbb3172 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -219,9 +219,6 @@ def update_tracked_fields!(request)
   has_many :project_authorizations, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent
   has_many :authorized_projects, through: :project_authorizations, source: :project
 
-  has_many :user_interacted_projects
-  has_many :project_interactions, through: :user_interacted_projects, source: :project, class_name: 'Project'
-
   has_many :snippets,                 dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
   has_many :notes,                    dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
   has_many :issues,                   dependent: :destroy, foreign_key: :author_id # rubocop:disable Cop/ActiveRecordDependent
diff --git a/app/models/user_interacted_project.rb b/app/models/user_interacted_project.rb
deleted file mode 100644
index 73bca3629602d..0000000000000
--- a/app/models/user_interacted_project.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-class UserInteractedProject < ApplicationRecord
-  extend SuppressCompositePrimaryKeyWarning
-
-  belongs_to :user
-  belongs_to :project
-
-  validates :project_id, presence: true
-  validates :user_id, presence: true
-
-  CACHE_EXPIRY_TIME = 1.day
-
-  class << self
-    def track(event)
-      # For events without a project, we simply don't care.
-      # An example of this is the creation of a snippet (which
-      # is not related to any project).
-      return unless event.project_id
-
-      attributes = {
-        project_id: event.project_id,
-        user_id: event.author_id
-      }
-
-      cached_exists?(**attributes) do
-        where(attributes).exists? || UserInteractedProject.insert_all([attributes], unique_by: %w[project_id user_id])
-        true
-      end
-    end
-
-    private
-
-    def cached_exists?(project_id:, user_id:, &block)
-      cache_key = "user_interacted_projects:#{project_id}:#{user_id}"
-      Rails.cache.fetch(cache_key, expires_in: CACHE_EXPIRY_TIME, &block)
-    end
-  end
-end
diff --git a/ee/app/services/security/orchestration/create_bot_service.rb b/ee/app/services/security/orchestration/create_bot_service.rb
index 171f83e490bcb..2d29ca3439b2a 100644
--- a/ee/app/services/security/orchestration/create_bot_service.rb
+++ b/ee/app/services/security/orchestration/create_bot_service.rb
@@ -24,7 +24,7 @@ def execute
             bot_user_params
           ).execute
           Gitlab::Database::QueryAnalyzers::PreventCrossDatabaseModification.temporary_ignore_tables_in_transaction(
-            %w[members notification_settings events user_interacted_projects projects], url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/424290'
+            %w[members notification_settings events projects], url: 'https://gitlab.com/gitlab-org/gitlab/-/issues/424290'
           ) do
             if skip_authorization
               project.add_guest(bot_user)
diff --git a/spec/models/event_spec.rb b/spec/models/event_spec.rb
index 6430fc2ffc898..e142c35a68186 100644
--- a/spec/models/event_spec.rb
+++ b/spec/models/event_spec.rb
@@ -68,15 +68,6 @@
         end.not_to change { project.last_repository_updated_at }
       end
     end
-
-    describe 'after_create UserInteractedProject.track' do
-      let(:event) { build(:push_event, project: project, author: project.first_owner) }
-
-      it 'passes event to UserInteractedProject.track' do
-        expect(UserInteractedProject).to receive(:track).with(event)
-        event.save!
-      end
-    end
   end
 
   describe 'validations' do
diff --git a/spec/models/user_interacted_project_spec.rb b/spec/models/user_interacted_project_spec.rb
deleted file mode 100644
index aa038b06d8dd6..0000000000000
--- a/spec/models/user_interacted_project_spec.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe UserInteractedProject do
-  let_it_be(:project) { create(:project) }
-  let_it_be(:author) { project.creator }
-
-  describe '.track' do
-    subject { described_class.track(event) }
-
-    let(:event) { build(:event, project: project, author: author) }
-
-    Event.actions.each_key do |action|
-      context "for all actions (event types)" do
-        let(:event) { build(:event, project: project, author: author, action: action) }
-
-        it 'creates a record' do
-          expect { subject }.to change { described_class.count }.from(0).to(1)
-        end
-      end
-    end
-
-    it 'sets project accordingly' do
-      subject
-      expect(described_class.first.project).to eq(event.project)
-    end
-
-    it 'sets user accordingly' do
-      subject
-      expect(described_class.first.user).to eq(event.author)
-    end
-
-    it 'only creates a record once per user/project' do
-      expect do
-        subject
-        described_class.track(event)
-      end.to change { described_class.count }.from(0).to(1)
-    end
-
-    describe 'with an event without a project' do
-      let(:event) { build(:event, project: nil) }
-
-      it 'ignores the event' do
-        expect { subject }.not_to change { described_class.count }
-      end
-    end
-  end
-
-  it { is_expected.to validate_presence_of(:project_id) }
-  it { is_expected.to validate_presence_of(:user_id) }
-end
diff --git a/spec/support/rspec_order_todo.yml b/spec/support/rspec_order_todo.yml
index 17dc7fa6dbf81..b32e64fda3db1 100644
--- a/spec/support/rspec_order_todo.yml
+++ b/spec/support/rspec_order_todo.yml
@@ -7600,7 +7600,6 @@
 - './spec/models/user_custom_attribute_spec.rb'
 - './spec/models/user_detail_spec.rb'
 - './spec/models/user_highest_role_spec.rb'
-- './spec/models/user_interacted_project_spec.rb'
 - './spec/models/user_mentions/commit_user_mention_spec.rb'
 - './spec/models/user_mentions/issue_user_mention_spec.rb'
 - './spec/models/user_mentions/merge_request_user_mention_spec.rb'
-- 
GitLab