# frozen_string_literal: true class Post # Vuelve indexables a los Posts module Indexable extend ActiveSupport::Concern included do # Indexa o reindexa el Post after_save :index! # Devuelve una versión indexable del Post # # @return [IndexedPost] def to_index IndexedPost.find_or_create_by(id: uuid.value).tap do |indexed_post| indexed_post.layout = layout.name indexed_post.site_id = site.id indexed_post.path = path.basename indexed_post.locale = IndexedPost.to_dictionary(locale: locale.value) indexed_post.title = title.value indexed_post.front_matter = indexable_front_matter indexed_post.content = indexable_content indexed_post.created_at = date.value indexed_post.order = attribute?(:order) ? order.value : 0 end end private # Indexa o reindexa el Post # # @return [Boolean] def index! to_index.save end # Los metadatos que se almacenan como objetos JSON. Empezamos con # las categorías porque se usan para filtrar en el listado de # artículos. # # @return [Hash] def indexable_front_matter {}.tap do |indexable_front_matter| indexable_front_matter = { usuaries: usuaries.map(&:id), draft: attribute?(:draft) ? draft.value : false } if attribute? :categories indexable_front_matter[:categories] = categories.indexable_values end end end # Devuelve un documento indexable en texto plano # # XXX: No memoizamos para permitir actualizaciones, aunque # probablemente se indexe una sola vez. # # @return [String] def indexable_content indexable_attributes.map do |attr| self[attr].to_s.remove("\n") end.join("\n").squeeze("\n") end def indexable_attributes @indexable_attributes ||= attributes.select do |attr| self[attr].indexable? end end end end end