diff --git a/app/controllers/api/v1/accounts/inboxes_controller.rb b/app/controllers/api/v1/accounts/inboxes_controller.rb index 70c3f2a23..2f380e0cc 100644 --- a/app/controllers/api/v1/accounts/inboxes_controller.rb +++ b/app/controllers/api/v1/accounts/inboxes_controller.rb @@ -63,7 +63,7 @@ class Api::V1::Accounts::InboxesController < Api::V1::Accounts::BaseController end def destroy - ::DeleteObjectJob.perform_later(@inbox) if @inbox.present? + ::DeleteObjectJob.perform_later(@inbox, Current.user, request.ip) if @inbox.present? render status: :ok, json: { message: I18n.t('messages.inbox_deletetion_response') } end diff --git a/app/jobs/delete_object_job.rb b/app/jobs/delete_object_job.rb index 6f6e13a01..49a7e4752 100644 --- a/app/jobs/delete_object_job.rb +++ b/app/jobs/delete_object_job.rb @@ -1,7 +1,12 @@ class DeleteObjectJob < ApplicationJob queue_as :low - def perform(object) + def perform(object, user = nil, ip = nil) object.destroy! + process_post_deletion_tasks(object, user, ip) end + + def process_post_deletion_tasks(object, user, ip); end end + +DeleteObjectJob.prepend_mod_with('DeleteObjectJob') diff --git a/enterprise/app/jobs/enterprise/delete_object_job.rb b/enterprise/app/jobs/enterprise/delete_object_job.rb new file mode 100644 index 000000000..d7a7f2f17 --- /dev/null +++ b/enterprise/app/jobs/enterprise/delete_object_job.rb @@ -0,0 +1,18 @@ +module Enterprise::DeleteObjectJob + def process_post_deletion_tasks(object, user, ip) + create_audit_entry(object, user, ip) + end + + def create_audit_entry(object, user, ip) + return unless ['Inbox'].include?(object.class.to_s) && user.present? + + Enterprise::AuditLog.create( + auditable: object, + audited_changes: object.attributes, + action: 'destroy', + user: user, + associated: object.account, + remote_address: ip + ) + end +end diff --git a/enterprise/app/models/enterprise/audit/inbox.rb b/enterprise/app/models/enterprise/audit/inbox.rb index 244e5b60c..62553a3ab 100644 --- a/enterprise/app/models/enterprise/audit/inbox.rb +++ b/enterprise/app/models/enterprise/audit/inbox.rb @@ -2,6 +2,6 @@ module Enterprise::Audit::Inbox extend ActiveSupport::Concern included do - audited associated_with: :account + audited associated_with: :account, on: [:create, :update] end end diff --git a/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb b/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb index 70bfb4acd..7b3dafccb 100644 --- a/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/inboxes_controller_spec.rb @@ -287,6 +287,8 @@ RSpec.describe 'Inboxes API', type: :request do let(:admin) { create(:user, account: account, role: :administrator) } it 'deletes inbox' do + expect(DeleteObjectJob).to receive(:perform_later).with(inbox, admin, anything).once + perform_enqueued_jobs(only: DeleteObjectJob) do delete "/api/v1/accounts/#{account.id}/inboxes/#{inbox.id}", headers: admin.create_new_auth_token, diff --git a/spec/enterprise/jobs/enterprise/delete_object_job_spec.rb b/spec/enterprise/jobs/enterprise/delete_object_job_spec.rb new file mode 100644 index 000000000..53c1af7a8 --- /dev/null +++ b/spec/enterprise/jobs/enterprise/delete_object_job_spec.rb @@ -0,0 +1,29 @@ +require 'rails_helper' + +RSpec.describe DeleteObjectJob, type: :job do + include ActiveJob::TestHelper + subject(:job) { described_class.perform_later(account) } + + let(:account) { create(:account) } + let(:user) { create(:user) } + let(:team) { create(:team, account: account) } + let(:inbox) { create(:inbox, account: account) } + + context 'when an object is passed to the job with arguments' do + it 'creates log with associated data if its an inbox' do + described_class.perform_later(inbox, user, '127.0.0.1') + perform_enqueued_jobs + + audit_log = Audited::Audit.where(auditable_type: 'Inbox', action: 'destroy', username: user.uid, remote_address: '127.0.0.1').first + expect(audit_log).to be_present + expect(audit_log.audited_changes.keys).to include('id', 'name', 'account_id') + expect { inbox.reload }.to raise_error(ActiveRecord::RecordNotFound) + end + + it 'will not create logs for other objects' do + described_class.perform_later(account, user, '127.0.0.1') + perform_enqueued_jobs + expect(Audited::Audit.where(auditable_type: 'Team', action: 'destroy').count).to eq 0 + end + end +end diff --git a/spec/enterprise/models/inbox_spec.rb b/spec/enterprise/models/inbox_spec.rb index 259c24b87..978a7ba5d 100644 --- a/spec/enterprise/models/inbox_spec.rb +++ b/spec/enterprise/models/inbox_spec.rb @@ -50,12 +50,5 @@ RSpec.describe Inbox do expect(Audited::Audit.where(auditable_type: 'Inbox', action: 'update').count).to eq 1 end end - - context 'when inbox is deleted' do - it 'has associated audit log created' do - inbox.destroy! - expect(Audited::Audit.where(auditable_type: 'Inbox', action: 'destroy').count).to eq 1 - end - end end end