Maintenance: Move User avatar logic into dedicated concern to slim down model file.
This commit is contained in:
parent
e90dd791f0
commit
b49046c597
3 changed files with 88 additions and 29 deletions
|
@ -18,6 +18,7 @@ class User < ApplicationModel
|
||||||
include HasTaskbars
|
include HasTaskbars
|
||||||
include User::HasTicketCreateScreenImpact
|
include User::HasTicketCreateScreenImpact
|
||||||
include User::Assets
|
include User::Assets
|
||||||
|
include User::Avatar
|
||||||
include User::Search
|
include User::Search
|
||||||
include User::SearchIndex
|
include User::SearchIndex
|
||||||
include User::TouchesOrganization
|
include User::TouchesOrganization
|
||||||
|
@ -50,9 +51,7 @@ class User < ApplicationModel
|
||||||
before_validation :check_name, :check_email, :check_login, :ensure_uniq_email, :ensure_password, :ensure_roles, :ensure_identifier
|
before_validation :check_name, :check_email, :check_login, :ensure_uniq_email, :ensure_password, :ensure_roles, :ensure_identifier
|
||||||
before_validation :check_mail_delivery_failed, on: :update
|
before_validation :check_mail_delivery_failed, on: :update
|
||||||
before_create :check_preferences_default, :validate_preferences, :validate_ooo, :domain_based_assignment, :set_locale
|
before_create :check_preferences_default, :validate_preferences, :validate_ooo, :domain_based_assignment, :set_locale
|
||||||
after_create :avatar_for_email_check, unless: -> { BulkImportInfo.enabled? }
|
|
||||||
before_update :check_preferences_default, :validate_preferences, :validate_ooo, :reset_login_failed, :validate_agent_limit_by_attributes, :last_admin_check_by_attribute
|
before_update :check_preferences_default, :validate_preferences, :validate_ooo, :reset_login_failed, :validate_agent_limit_by_attributes, :last_admin_check_by_attribute
|
||||||
after_update :avatar_for_email_check, unless: -> { BulkImportInfo.enabled? }
|
|
||||||
before_destroy :destroy_longer_required_objects, :destroy_move_dependency_ownership
|
before_destroy :destroy_longer_required_objects, :destroy_move_dependency_ownership
|
||||||
after_commit :update_caller_id
|
after_commit :update_caller_id
|
||||||
|
|
||||||
|
@ -1140,33 +1139,6 @@ raise 'Minimum one user need to have admin permissions'
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
def avatar_for_email_check
|
|
||||||
return true if Setting.get('import_mode')
|
|
||||||
return true if email.blank?
|
|
||||||
|
|
||||||
email_address_validation = EmailAddressValidation.new(email)
|
|
||||||
return true if !email_address_validation.valid_format?
|
|
||||||
|
|
||||||
return true if !saved_change_to_attribute?('email') && updated_at > Time.zone.now - 10.days
|
|
||||||
|
|
||||||
# save/update avatar
|
|
||||||
avatar = Avatar.auto_detection(
|
|
||||||
object: 'User',
|
|
||||||
o_id: id,
|
|
||||||
url: email,
|
|
||||||
source: 'app',
|
|
||||||
updated_by_id: updated_by_id,
|
|
||||||
created_by_id: updated_by_id,
|
|
||||||
)
|
|
||||||
|
|
||||||
# update user link
|
|
||||||
return true if !avatar
|
|
||||||
|
|
||||||
update_column(:image, avatar.store_hash) # rubocop:disable Rails/SkipsModelValidations
|
|
||||||
cache_delete
|
|
||||||
true
|
|
||||||
end
|
|
||||||
|
|
||||||
def destroy_longer_required_objects
|
def destroy_longer_required_objects
|
||||||
::Avatar.remove(self.class.to_s, id)
|
::Avatar.remove(self.class.to_s, id)
|
||||||
::UserDevice.remove(id)
|
::UserDevice.remove(id)
|
||||||
|
|
56
app/models/user/avatar.rb
Normal file
56
app/models/user/avatar.rb
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
# Copyright (C) 2012-2021 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
|
class User
|
||||||
|
module Avatar
|
||||||
|
extend ActiveSupport::Concern
|
||||||
|
|
||||||
|
included do
|
||||||
|
after_create :avatar_for_email_check, unless: -> { BulkImportInfo.enabled? }
|
||||||
|
after_update :avatar_for_email_check, unless: -> { BulkImportInfo.enabled? }
|
||||||
|
|
||||||
|
validates :image_source, format: URI::DEFAULT_PARSER.make_regexp(%w[http https]), allow_blank: true
|
||||||
|
|
||||||
|
before_validation :ensure_existing_image
|
||||||
|
end
|
||||||
|
|
||||||
|
def avatar_for_email_check
|
||||||
|
return if Setting.get('import_mode')
|
||||||
|
return if email.blank?
|
||||||
|
|
||||||
|
email_address_validation = EmailAddressValidation.new(email)
|
||||||
|
return if !email_address_validation.valid_format?
|
||||||
|
|
||||||
|
return if !saved_change_to_attribute?('email') && updated_at > Time.zone.now - 10.days
|
||||||
|
|
||||||
|
avatar_auto_detection
|
||||||
|
end
|
||||||
|
|
||||||
|
def ensure_existing_image
|
||||||
|
return if Setting.get('import_mode')
|
||||||
|
return if changes['image'].blank?
|
||||||
|
return if ::Avatar.exists?(store_hash: image)
|
||||||
|
|
||||||
|
raise Exceptions::UnprocessableEntity, "Invalid Store reference '#{image}' in 'image' attribute."
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def avatar_auto_detection
|
||||||
|
# save/update avatar
|
||||||
|
avatar = ::Avatar.auto_detection(
|
||||||
|
object: 'User',
|
||||||
|
o_id: id,
|
||||||
|
url: email,
|
||||||
|
source: 'app',
|
||||||
|
updated_by_id: updated_by_id,
|
||||||
|
created_by_id: updated_by_id,
|
||||||
|
)
|
||||||
|
|
||||||
|
# update user link
|
||||||
|
return if !avatar
|
||||||
|
|
||||||
|
update_column(:image, avatar.store_hash) # rubocop:disable Rails/SkipsModelValidations
|
||||||
|
cache_delete
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -815,6 +815,37 @@ RSpec.describe User, type: :model do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#image' do
|
||||||
|
|
||||||
|
describe 'when value is invalid' do
|
||||||
|
let(:value) { 'Th1515n0t4v4l1dh45h' }
|
||||||
|
|
||||||
|
it 'prevents create' do
|
||||||
|
expect { create(:user, image: value) }.to raise_error(Exceptions::UnprocessableEntity, %r{#{value}})
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'prevents update' do
|
||||||
|
expect { create(:user).update!(image: value) }.to raise_error(Exceptions::UnprocessableEntity, %r{#{value}})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#image_source' do
|
||||||
|
|
||||||
|
describe 'when value is invalid' do
|
||||||
|
let(:value) { 'Th1515n0t4v4l1dh45h' }
|
||||||
|
let(:escaped) { Regexp.escape(value) }
|
||||||
|
|
||||||
|
it 'prevents create' do
|
||||||
|
expect { create(:user, image_source: value) }.to raise_error(ActiveRecord::RecordInvalid, %r{Image source})
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'prevents update' do
|
||||||
|
expect { create(:user).update!(image_source: value) }.to raise_error(ActiveRecord::RecordInvalid, %r{Image source})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'Associations:' do
|
describe 'Associations:' do
|
||||||
|
|
Loading…
Reference in a new issue