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