notebook/app/models/serializers/api_content_serializer.rb
2020-09-11 17:00:39 -07:00

75 lines
2.6 KiB
Ruby

# This is an implementation of ContentSerializer that only exposes public columns in the
# standard API format and should be preferred when possible.
class ApiContentSerializer
attr_accessor :id, :name, :user, :universe
attr_accessor :categories
attr_accessor :fields
attr_accessor :attribute_values
attr_accessor :page_tags
attr_accessor :documents
attr_accessor :raw_model
attr_accessor :class_name, :class_color, :class_icon
attr_accessor :data
def initialize(content, include_blank_fields: false)
self.categories = content.class.attribute_categories(content.user).where(hidden: false).eager_load(attribute_fields: :attribute_values)
self.fields = AttributeField.where(attribute_category_id: self.categories.map(&:id), hidden: false)
self.attribute_values = Attribute.where(attribute_field_id: self.fields.map(&:id), entity_type: content.page_type, entity_id: content.id).order('created_at desc')
self.universe = (content.class.name == Universe.name) ? nil : content.universe
self.raw_model = content
self.page_tags = content.page_tags.pluck(:tag) || []
self.documents = content.documents || []
self.data = {
name: content.try(:name),
description: content.try(:description),
universe: self.universe.nil? ? nil : {
id: self.universe.id,
name: self.universe.try(:name)
},
meta: {
created_at: content.created_at,
updated_at: content.updated_at
},
categories: self.categories.map { |category|
{
id: category.id,
label: category.label,
fields: category.attribute_fields.order(:position).map { |field|
{
id: field.id,
label: field.label,
type: field.field_type,
value: value_for(field, content)
}
}.reject { |field| !include_blank_fields && field[:value].empty? }
}
}.reject { |category| !include_blank_fields && category[:fields].empty? },
references: []
}
end
def value_for(attribute_field, content)
case attribute_field.field_type
when 'link'
self.raw_model.send(attribute_field.old_column_source)
when 'tags'
self.page_tags
else # text_area, name, universe, etc
self.attribute_values.detect { |value|
value.entity_type == content.page_type &&
value.entity_id == content.id &&
value.attribute_field_id == attribute_field.id
}.try(:value) || ""
end
end
end