app/models/concerns/promethee_data.rb
module PrometheeData
extend ActiveSupport::Concern
# Setter to serialize data as JSON
def data=(value)
value = JSON.parse value if value.is_a? String
if value.has_key? 'components'
# For translations, contents are in components, not children
value['components'].map { |component| promethee_sanitize(component) }
else
# For masters, contents are in children
value = promethee_sanitize(value)
end
super(value)
end
# Getters and setters to get PAGE Title, Description & Thumbnail
def promethee_data_page_title
data['attributes']['title']['value']
rescue
''
end
def promethee_data_page_title=(value)
self.data['attributes']['title']['value'] = value
end
def promethee_data_page_description
data['attributes']['description']['value']
rescue
''
end
def promethee_data_page_description=(value)
self.data['attributes']['description']['value'] = value
end
def promethee_data_page_thumbnail
blob_find_method = ActiveStorage::Blob.respond_to?(:find_signed!) ? :find_signed! : :find_signed
ActiveStorage::Blob.public_send blob_find_method, data['attributes']['thumbnail']['value']['id']
rescue
nil
end
# Getters to get TRANSLATION Title & Description
def promethee_data_translation_title
data['components'].first['attributes']['title']['value']
rescue
''
end
def promethee_data_translation_description
data['components'].first['attributes']['description']['value']
rescue
''
end
def promethee_data_searchable
promethee_extract_searchable data
end
protected
include ActionView::Helpers::SanitizeHelper
def promethee_extract_searchable(component)
return '' if component.blank?
searchable = ' '
searchable += promethee_extract_searchable_attributes component['attributes'] if component.include?('attributes')
# For masters, contents are in children
searchable += promethee_extract_searchable_children component['children'] if component.include?('children')
# For translations, contents are in components, not children
searchable += promethee_extract_searchable_children component['components'] if component.include?('components')
searchable
end
def promethee_extract_searchable_attributes(attributes)
searchable = ' '
attributes.each do |key, value_object|
if value_object['searchable']
clean_value = strip_tags value_object['value']
searchable += "#{clean_value} "
end
if value_object['type'] == 'array'
value_object['value'].each do |object|
searchable += promethee_extract_searchable_attributes(object)
end
elsif value_object['type'] == 'hash'
searchable += promethee_extract_searchable_attributes(value_object['value'])
end
end
searchable
end
def promethee_extract_searchable_children(components)
searchable = ' '
components.each do |child|
searchable += promethee_extract_searchable child
end
searchable
end
def promethee_sanitize(component)
attributes = component['attributes']
attributes = promethee_sanitize_attributes(attributes)
children = component['children']
children.each do |child|
child = promethee_sanitize(child)
end unless children.nil?
component
end
def promethee_sanitize_attributes(attributes)
attributes.each do |key, value_object|
case value_object['type']
when 'string'
while value_object['value'] != Loofah.fragment(value_object['value']).text(encode_special_chars: false)
value_object['value'] = Loofah.fragment(value_object['value']).text(encode_special_chars: false)
end
when 'text'
value_object['value'] = sanitize(value_object['value'])
when 'hash'
value_object['value'] = promethee_sanitize_attributes(value_object['value'])
when 'array'
value_object['value'].each do |object|
object = promethee_sanitize_attributes(object)
end
end if value_object.has_key?('type')
attributes[key] = value_object
end unless attributes.nil?
attributes
end
end