product_logo.rb 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. # Copyright (C) 2012-2023 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. def self.sendable_asset
  8. if (asset = custom_logo)
  9. return SendableAsset.new(
  10. content: asset.content,
  11. filename: asset.filename,
  12. type: asset.preferences['Content-Type']
  13. )
  14. end
  15. SendableAsset.new(
  16. content: Rails.public_path.join('assets/images/logo.svg').read,
  17. filename: 'logo.svg',
  18. type: 'image/svg+xml'
  19. )
  20. end
  21. def self.store_logo(file)
  22. clear_all
  23. store_one PRODUCT_LOGO_RAW, file, 'logo_raw'
  24. Time.current.to_i
  25. end
  26. def self.store(logo, logo_resize)
  27. raw_preprocessed = preprocess(logo)
  28. resized_preprocessed = preprocess(logo_resize)
  29. return if !raw_preprocessed && !resized_preprocessed
  30. clear_all
  31. raw = store_one PRODUCT_LOGO_RAW, raw_preprocessed, 'logo_raw'
  32. resized = store_one PRODUCT_LOGO_RESIZED, resized_preprocessed, 'logo'
  33. Time.current.to_i if resized || raw
  34. end
  35. def self.custom_logo
  36. [PRODUCT_LOGO_RESIZED, PRODUCT_LOGO_RAW]
  37. .lazy
  38. .map { |elem| Store.list(object: 'System::Logo', o_id: elem).first }
  39. .find(&:present?)
  40. end
  41. private_class_method :custom_logo
  42. def self.preprocess(data)
  43. return if !data&.match? %r{^data:image}i
  44. ImageHelper.data_url_attributes(data)
  45. end
  46. private_class_method :preprocess
  47. def self.clear_all
  48. [PRODUCT_LOGO_RAW, PRODUCT_LOGO_RESIZED].each do |elem|
  49. Store.remove(object: 'System::Logo', o_id: elem)
  50. end
  51. end
  52. private_class_method :clear_all
  53. def self.store_one(o_id, file, filename)
  54. return if !file
  55. Store.create!(
  56. object: 'System::Logo',
  57. o_id: o_id,
  58. data: file[:content],
  59. filename: filename,
  60. preferences: {
  61. 'Content-Type' => file[:mime_type]
  62. },
  63. created_by_id: 1,
  64. )
  65. end
  66. private_class_method :store_one
  67. end
  68. end
  69. end