129 lines
3 KiB
Ruby
129 lines
3 KiB
Ruby
|
|
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
|