scinote-web/app/services/activities/create_activity_service.rb
2024-09-11 14:36:14 +02:00

95 lines
2.5 KiB
Ruby

# frozen_string_literal: true
module Activities
class CreateActivityService
extend Service
attr_reader :errors, :activity
def initialize(activity_type:,
owner:,
team:,
project: nil,
subject:,
message_items: {})
@activity = Activity.new
@activity.type_of = activity_type
@activity.owner = owner
@activity.team = team
@activity.subject = subject
@activity.project = project if project
@message_items = message_items
@errors = {}
end
def call
enrich_message_items
@activity.generate_breadcrumbs
@activity.save!
self
end
def succeed?
@errors.none?
end
private
def enrich_message_items
@message_items.each do |k, v|
if v.is_a? Time
@activity.message_items[k] = {
type: 'Time',
value: v.to_i
}
next
end
const = try_to_constantize k
k = k.to_s.sub('tiny_mce_asset', 'asset').to_sym if k.to_s.include? 'tiny_mce_asset'
if const && (v.is_a?(Hash) || v.to_i != 0 || v.nil?)
if v.is_a?(Hash) # Value is Hash, so you have getter specified
id = v[:id]
getter_method = v[:value_for]
value_type = v[:value_type]
else
id = v
getter_method = 'name'
end
if id
obj = if const.respond_to?(:with_discarded)
const.with_discarded.find id
else
const.find id
end
@activity.message_items[k] = { type: const.to_s, value: obj.public_send(getter_method).to_s, id: id }
@activity.message_items[k][:value_for] = getter_method
@activity.message_items[k][:value_type] = value_type unless value_type.nil?
else
@activity.message_items[k] = { type: const.to_s, value: nil, value_for: 'name', id: nil }
end
else
@activity.message_items[k] = v.to_s
end
end
end
def try_to_constantize(key)
const_name = key.to_s.camelize
# Remove last part from and with '_xxx..x'
const_name_short = key.to_s.sub(/_[^_]*\z/, '').camelize
if Extends::ACTIVITY_MESSAGE_ITEMS_TYPES.include? const_name
const_name.constantize
elsif Extends::ACTIVITY_MESSAGE_ITEMS_TYPES.include? const_name_short
const_name_short.constantize
else
false
end
end
end
end