creates_ticket_articles.rb 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. module CreatesTicketArticles
  2. extend ActiveSupport::Concern
  3. private
  4. def article_create(ticket, params)
  5. # create article if given
  6. form_id = params[:form_id]
  7. params.delete(:form_id)
  8. subtype = params.delete(:subtype)
  9. # check min. params
  10. raise Exceptions::UnprocessableEntity, 'Need at least article: { body: "some text" }' if !params[:body]
  11. # fill default values
  12. if params[:type_id].blank? && params[:type].blank?
  13. params[:type_id] = Ticket::Article::Type.lookup(name: 'note').id
  14. end
  15. if params[:sender_id].blank? && params[:sender].blank?
  16. sender = 'Customer'
  17. if current_user.permissions?('ticket.agent')
  18. sender = 'Agent'
  19. end
  20. params[:sender_id] = Ticket::Article::Sender.lookup(name: sender).id
  21. end
  22. # remember time accounting
  23. time_unit = params[:time_unit]
  24. clean_params = Ticket::Article.association_name_to_id_convert(params)
  25. clean_params = Ticket::Article.param_cleanup(clean_params, true)
  26. # overwrite params
  27. if !current_user.permissions?('ticket.agent')
  28. clean_params[:sender_id] = Ticket::Article::Sender.lookup(name: 'Customer').id
  29. clean_params.delete(:sender)
  30. clean_params.delete(:origin_by_id)
  31. type = Ticket::Article::Type.lookup(id: clean_params[:type_id])
  32. if !type.name.match?(/^(note|web)$/)
  33. clean_params[:type_id] = Ticket::Article::Type.lookup(name: 'note').id
  34. end
  35. clean_params.delete(:type)
  36. clean_params[:internal] = false
  37. end
  38. article = Ticket::Article.new(clean_params)
  39. article.ticket_id = ticket.id
  40. # store dataurl images to store
  41. attachments_inline = []
  42. if article.body && article.content_type =~ %r{text/html}i
  43. (article.body, attachments_inline) = HtmlSanitizer.replace_inline_images(article.body, ticket.id)
  44. end
  45. # find attachments in upload cache
  46. if form_id
  47. article.attachments = UploadCache.new(form_id).attachments
  48. end
  49. # set subtype of present
  50. article.preferences[:subtype] = subtype if subtype.present?
  51. article.save!
  52. # store inline attachments
  53. attachments_inline.each do |attachment|
  54. Store.add(
  55. object: 'Ticket::Article',
  56. o_id: article.id,
  57. data: attachment[:data],
  58. filename: attachment[:filename],
  59. preferences: attachment[:preferences],
  60. )
  61. end
  62. # add attachments as param
  63. if params[:attachments].present?
  64. params[:attachments].each_with_index do |attachment, index|
  65. # validation
  66. %w[mime-type filename data].each do |key|
  67. next if attachment[key]
  68. raise Exceptions::UnprocessableEntity, "Attachment needs '#{key}' param for attachment with index '#{index}'"
  69. end
  70. preferences = {}
  71. %w[charset mime-type].each do |key|
  72. next if !attachment[key]
  73. store_key = key.tr('-', '_').camelize.gsub(/(.+)([A-Z])/, '\1_\2').tr('_', '-')
  74. preferences[store_key] = attachment[key]
  75. end
  76. begin
  77. base64_data = attachment[:data].gsub(/[\r\n]/, '')
  78. attachment_data = Base64.strict_decode64(base64_data)
  79. rescue ArgumentError
  80. raise Exceptions::UnprocessableEntity, "Invalid base64 for attachment with index '#{index}'"
  81. end
  82. Store.add(
  83. object: 'Ticket::Article',
  84. o_id: article.id,
  85. data: attachment_data,
  86. filename: attachment[:filename],
  87. preferences: preferences,
  88. )
  89. end
  90. end
  91. # account time
  92. if time_unit.present?
  93. Ticket::TimeAccounting.create!(
  94. ticket_id: article.ticket_id,
  95. ticket_article_id: article.id,
  96. time_unit: time_unit
  97. )
  98. end
  99. return article if form_id.blank?
  100. # clear in-progress state from taskbar
  101. Taskbar
  102. .where(user_id: current_user.id)
  103. .first { |taskbar| taskbar.persisted_form_id == form_id }
  104. &.update!(state: {})
  105. # remove temporary attachment cache
  106. UploadCache.new(form_id).destroy
  107. article
  108. end
  109. end