product_logo.rb 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. # Copyright (C) 2012-2024 Zammad Foundation, https://zammad-foundation.org/
  2. module Service
  3. class SystemAssets
  4. class ProductLogo
  5. PRODUCT_LOGO_RESIZED = 2
  6. PRODUCT_LOGO_RAW = 1
  7. PRODUCT_LOGO_FIT_WIDTH = 200
  8. PRODUCT_LOGO_FIT_HEIGHT = 100
  9. def self.sendable_asset
  10. if (asset = custom_logo)
  11. return SendableAsset.new(
  12. content: asset.content,
  13. filename: asset.filename,
  14. type: asset.preferences['Content-Type']
  15. )
  16. end
  17. SendableAsset.new(
  18. content: Rails.public_path.join('assets/images/logo.svg').read,
  19. filename: 'logo.svg',
  20. type: 'image/svg+xml'
  21. )
  22. end
  23. def self.store_logo(file)
  24. clear_all
  25. store_one PRODUCT_LOGO_RAW, file, 'logo_raw'
  26. Time.current.to_i
  27. end
  28. def self.store(logo, logo_resize = nil)
  29. return if !logo && !logo_resize
  30. begin
  31. original_image = Rszr::Image.load_data logo if logo
  32. resized_image = if logo_resize
  33. Rszr::Image.load_data logo_resize
  34. else
  35. original_image.resize(PRODUCT_LOGO_FIT_WIDTH, PRODUCT_LOGO_FIT_HEIGHT)
  36. end
  37. raw_preprocessed = { content: logo, mime_type: "image/#{original_image.format}" } if logo
  38. resized_preprocessed = { content: logo_resize || resized_image.save_data, mime_type: "image/#{resized_image.format}" } if resized_image
  39. rescue Rszr::LoadError, Rszr::TransformationError
  40. return
  41. end
  42. clear_all
  43. raw = store_one PRODUCT_LOGO_RAW, raw_preprocessed, 'logo_raw'
  44. resized = store_one PRODUCT_LOGO_RESIZED, resized_preprocessed, 'logo'
  45. Time.current.to_i if resized || raw
  46. end
  47. def self.custom_logo
  48. [PRODUCT_LOGO_RESIZED, PRODUCT_LOGO_RAW]
  49. .lazy
  50. .map { |elem| Store.list(object: 'System::Logo', o_id: elem).first }
  51. .find(&:present?)
  52. end
  53. private_class_method :custom_logo
  54. def self.preprocess(data)
  55. return if !data&.match? %r{^data:image}i
  56. ImageHelper.data_url_attributes(data)
  57. end
  58. private_class_method :preprocess
  59. def self.clear_all
  60. [PRODUCT_LOGO_RAW, PRODUCT_LOGO_RESIZED].each do |elem|
  61. Store.remove(object: 'System::Logo', o_id: elem)
  62. end
  63. end
  64. private_class_method :clear_all
  65. def self.store_one(o_id, file, filename)
  66. return if !file
  67. Store.create!(
  68. object: 'System::Logo',
  69. o_id: o_id,
  70. data: file[:content],
  71. filename: filename,
  72. preferences: {
  73. 'Content-Type' => file[:mime_type]
  74. },
  75. created_by_id: 1,
  76. )
  77. end
  78. private_class_method :store_one
  79. end
  80. end
  81. end