From c6177a233b39ace9f115222b99f5e4ab7c2c5ecf Mon Sep 17 00:00:00 2001 From: Jay Joshua <7008757+jayjay-w@users.noreply.github.com> Date: Fri, 20 Sep 2024 20:54:43 +0200 Subject: [PATCH] Allow deletion of api keys with media Allow deletion of API keys even if the key's user has been used to create media. --- app/models/api_key.rb | 12 +++++++++++- app/models/concerns/user_private.rb | 3 +-- app/models/user.rb | 5 +++++ test/models/api_key_test.rb | 18 ++++++++++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/app/models/api_key.rb b/app/models/api_key.rb index 3a7adcd977..f48060d2b1 100644 --- a/app/models/api_key.rb +++ b/app/models/api_key.rb @@ -16,7 +16,9 @@ class ApiKey < ApplicationRecord validate :validate_team_api_keys_limit, on: :create - has_one :bot_user, dependent: :destroy + has_one :bot_user + + after_destroy :delete_bot_user # Reimplement this method in your application def self.applications @@ -52,6 +54,14 @@ def create_bot_user end end + def delete_bot_user + if bot_user.present? && bot_user.owns_media? + bot_user.update(api_key_id: nil) + else + bot_user.destroy + end + end + def set_user_and_team self.user = User.current unless User.current.nil? self.team = Team.current unless Team.current.nil? diff --git a/app/models/concerns/user_private.rb b/app/models/concerns/user_private.rb index 8c0d6a0639..c48d1d8b99 100644 --- a/app/models/concerns/user_private.rb +++ b/app/models/concerns/user_private.rb @@ -86,8 +86,7 @@ def set_blank_email_for_unconfirmed_user end def can_destroy_user - count = ProjectMedia.where(user_id: self.id).count - throw :abort if count > 0 + throw :abort if owns_media? end def set_user_notification_settings(type, enabled) diff --git a/app/models/user.rb b/app/models/user.rb index 9c226d378d..94167341d6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -435,6 +435,11 @@ def self.reset_change_password(inputs) user end + def owns_media? + ProjectMedia.where(user_id: self.id).count > 0 + end + + # private # # Please add private methods to app/models/concerns/user_private.rb diff --git a/test/models/api_key_test.rb b/test/models/api_key_test.rb index 683b3e223b..9b2669457c 100644 --- a/test/models/api_key_test.rb +++ b/test/models/api_key_test.rb @@ -64,4 +64,22 @@ class ApiKeyTest < ActiveSupport::TestCase end end end + + test "should delete API key even if key's user has been used to create media" do + a = create_api_key + b = create_bot_user + b.api_key = a + b.save! + pm = create_project_media user: b + + assert_equal b, pm.user + + assert_difference 'ApiKey.count', -1 do + a.destroy + end + + assert_raises ActiveRecord::RecordNotFound do + ApiKey.find(a.id) + end + end end