otwarchive-symphonyarchive/app/models/search/pseud_indexer.rb

129 lines
3 KiB
Ruby
Raw Normal View History

2026-03-11 22:22:11 +00:00
class PseudIndexer < Indexer
def self.klass
"Pseud"
end
def self.mapping
{
properties: {
name: {
type: "text",
analyzer: "simple"
},
# adding extra name field for sorting
sortable_name: {
type: "keyword"
},
byline: {
type: "text",
analyzer: "standard"
},
user_login: {
type: "text",
analyzer: "simple"
},
fandom: {
type: "nested"
}
}
}
end
def document(object)
object.as_json(
root: false,
only: [:id, :user_id, :name, :description, :created_at],
methods: [
:user_login,
:byline,
:collection_ids
]
).merge(extras(object).as_json)
end
def extras(pseud)
work_counts = work_counts(pseud)
{
sortable_name: pseud.name.downcase,
fandoms: fandoms(pseud),
general_bookmarks_count: general_bookmarks_count(pseud),
public_bookmarks_count: public_bookmarks_count(pseud),
general_works_count: work_counts.values.sum,
public_works_count: work_counts[false] || 0
}
end
private
def fandoms(pseud)
tag_info(pseud, "Fandom")
end
# Produces an array of hashes with the format
# [{id: 1, name: "Star Trek", count: 5}]
def tag_info(pseud, tag_type)
info = []
info +=
pseud.direct_filters.where(works: countable_works_conditions)
.by_type(tag_type).group_by(&:id)
.map do |id, tags|
{
id: id,
name: tags.first.name,
count: tags.length
}
end
info +=
pseud.direct_filters.where(works: countable_works_conditions.merge(restricted: false))
.by_type(tag_type).group_by(&:id)
.map do |id, tags|
{
id_for_public: id,
name: tags.first.name,
count: tags.length
}
end
info
end
# The relation containing all bookmarks that should be included in the count
# for logged-in users (when restricted to a particular pseud).
def general_bookmarks
@general_bookmarks ||=
Bookmark.with_missing_bookmarkable
.or(Bookmark.with_bookmarkable_visible_to_registered_user)
.is_public
end
# The relation containing all bookmarks that should be included in the count
# for logged-out users (when restricted to a particular pseud).
def public_bookmarks
@public_bookmarks ||=
Bookmark.with_missing_bookmarkable
.or(Bookmark.with_bookmarkable_visible_to_all)
.is_public
end
def general_bookmarks_count(pseud)
general_bookmarks.merge(pseud.bookmarks).count
end
def public_bookmarks_count(pseud)
public_bookmarks.merge(pseud.bookmarks).count
end
def work_counts(pseud)
pseud.works.where(countable_works_conditions).group(:restricted).count
end
def countable_works_conditions
{
posted: true,
hidden_by_admin: false,
in_anon_collection: false,
in_unrevealed_collection: false
}
end
end