2017-03-09 11:44:51 +00:00
|
|
|
module CreatesTicketArticles
|
|
|
|
extend ActiveSupport::Concern
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def article_create(ticket, params)
|
|
|
|
|
|
|
|
# create article if given
|
|
|
|
form_id = params[:form_id]
|
|
|
|
params.delete(:form_id)
|
|
|
|
|
|
|
|
# check min. params
|
|
|
|
raise Exceptions::UnprocessableEntity, 'Need at least article: { body: "some text" }' if !params[:body]
|
|
|
|
|
|
|
|
# fill default values
|
2017-09-08 08:28:34 +00:00
|
|
|
if params[:type_id].blank? && params[:type].blank?
|
2017-03-09 11:44:51 +00:00
|
|
|
params[:type_id] = Ticket::Article::Type.lookup(name: 'note').id
|
|
|
|
end
|
2017-09-08 08:28:34 +00:00
|
|
|
if params[:sender_id].blank? && params[:sender].blank?
|
2017-03-09 11:44:51 +00:00
|
|
|
sender = 'Customer'
|
|
|
|
if current_user.permissions?('ticket.agent')
|
|
|
|
sender = 'Agent'
|
|
|
|
end
|
|
|
|
params[:sender_id] = Ticket::Article::Sender.lookup(name: sender).id
|
|
|
|
end
|
|
|
|
|
|
|
|
# remember time accounting
|
|
|
|
time_unit = params[:time_unit]
|
|
|
|
|
|
|
|
clean_params = Ticket::Article.association_name_to_id_convert(params)
|
|
|
|
clean_params = Ticket::Article.param_cleanup(clean_params, true)
|
|
|
|
|
|
|
|
# overwrite params
|
|
|
|
if !current_user.permissions?('ticket.agent')
|
|
|
|
clean_params[:sender_id] = Ticket::Article::Sender.lookup(name: 'Customer').id
|
|
|
|
clean_params.delete(:sender)
|
2017-04-25 14:06:23 +00:00
|
|
|
clean_params.delete(:origin_by_id)
|
2017-03-09 11:44:51 +00:00
|
|
|
type = Ticket::Article::Type.lookup(id: clean_params[:type_id])
|
2018-05-04 14:05:10 +00:00
|
|
|
if !type.name.match?(/^(note|web)$/)
|
2017-03-09 11:44:51 +00:00
|
|
|
clean_params[:type_id] = Ticket::Article::Type.lookup(name: 'note').id
|
|
|
|
end
|
|
|
|
clean_params.delete(:type)
|
|
|
|
clean_params[:internal] = false
|
|
|
|
end
|
|
|
|
|
|
|
|
article = Ticket::Article.new(clean_params)
|
|
|
|
article.ticket_id = ticket.id
|
|
|
|
|
|
|
|
# store dataurl images to store
|
2017-03-10 05:34:51 +00:00
|
|
|
attachments_inline = []
|
|
|
|
if article.body && article.content_type =~ %r{text/html}i
|
2017-03-17 05:27:50 +00:00
|
|
|
(article.body, attachments_inline) = HtmlSanitizer.replace_inline_images(article.body, ticket.id)
|
2017-03-09 11:44:51 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
# find attachments in upload cache
|
|
|
|
if form_id
|
|
|
|
article.attachments = Store.list(
|
|
|
|
object: 'UploadCache',
|
|
|
|
o_id: form_id,
|
|
|
|
)
|
|
|
|
end
|
|
|
|
article.save!
|
|
|
|
|
2017-03-10 05:34:51 +00:00
|
|
|
# store inline attachments
|
2017-10-01 12:25:52 +00:00
|
|
|
attachments_inline.each do |attachment|
|
2017-03-10 05:34:51 +00:00
|
|
|
Store.add(
|
|
|
|
object: 'Ticket::Article',
|
|
|
|
o_id: article.id,
|
|
|
|
data: attachment[:data],
|
|
|
|
filename: attachment[:filename],
|
|
|
|
preferences: attachment[:preferences],
|
|
|
|
)
|
2017-10-01 12:25:52 +00:00
|
|
|
end
|
2017-03-10 05:34:51 +00:00
|
|
|
|
|
|
|
# add attachments as param
|
2017-09-08 08:28:34 +00:00
|
|
|
if params[:attachments].present?
|
2017-10-01 12:25:52 +00:00
|
|
|
params[:attachments].each_with_index do |attachment, index|
|
2017-03-10 05:34:51 +00:00
|
|
|
|
|
|
|
# validation
|
2017-10-01 12:25:52 +00:00
|
|
|
['mime-type', 'filename', 'data'].each do |key|
|
2017-03-10 05:34:51 +00:00
|
|
|
next if attachment[key]
|
|
|
|
raise Exceptions::UnprocessableEntity, "Attachment needs '#{key}' param for attachment with index '#{index}'"
|
2017-10-01 12:25:52 +00:00
|
|
|
end
|
2017-03-10 05:34:51 +00:00
|
|
|
|
|
|
|
preferences = {}
|
2017-10-01 12:25:52 +00:00
|
|
|
['charset', 'mime-type'].each do |key|
|
2017-03-10 05:34:51 +00:00
|
|
|
next if !attachment[key]
|
|
|
|
store_key = key.tr('-', '_').camelize.gsub(/(.+)([A-Z])/, '\1_\2').tr('_', '-')
|
|
|
|
preferences[store_key] = attachment[key]
|
2017-10-01 12:25:52 +00:00
|
|
|
end
|
2017-03-10 05:34:51 +00:00
|
|
|
|
2018-05-04 14:05:10 +00:00
|
|
|
if !attachment[:data].match?(%r{^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{4}|[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)$})
|
2017-03-10 05:34:51 +00:00
|
|
|
raise Exceptions::UnprocessableEntity, "Invalid base64 for attachment with index '#{index}'"
|
|
|
|
end
|
|
|
|
|
|
|
|
Store.add(
|
|
|
|
object: 'Ticket::Article',
|
|
|
|
o_id: article.id,
|
|
|
|
data: Base64.decode64(attachment[:data]),
|
|
|
|
filename: attachment[:filename],
|
|
|
|
preferences: preferences,
|
|
|
|
)
|
2017-10-01 12:25:52 +00:00
|
|
|
end
|
2017-03-10 05:34:51 +00:00
|
|
|
end
|
|
|
|
|
2017-03-09 11:44:51 +00:00
|
|
|
# account time
|
|
|
|
if time_unit.present?
|
|
|
|
Ticket::TimeAccounting.create!(
|
|
|
|
ticket_id: article.ticket_id,
|
|
|
|
ticket_article_id: article.id,
|
|
|
|
time_unit: time_unit
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
2017-09-08 08:28:34 +00:00
|
|
|
return article if form_id.blank?
|
2017-03-09 11:44:51 +00:00
|
|
|
|
2017-03-10 05:34:51 +00:00
|
|
|
# remove attachments from upload cache
|
2017-03-09 11:44:51 +00:00
|
|
|
Store.remove(
|
|
|
|
object: 'UploadCache',
|
|
|
|
o_id: form_id,
|
|
|
|
)
|
|
|
|
|
|
|
|
article
|
|
|
|
end
|
2017-03-10 05:34:51 +00:00
|
|
|
|
2017-03-09 11:44:51 +00:00
|
|
|
end
|