otwarchive-symphonyarchive/app/models/search/bookmark_indexer.rb
2026-03-11 22:22:11 +00:00

113 lines
2.5 KiB
Ruby

class BookmarkIndexer < Indexer
def self.klass
"Bookmark"
end
# Create the bookmarkable index/mapping first
# Skip delete on the subclasses so it doesn't delete the ones we've just
# reindexed
def self.index_all(options = {})
unless options[:skip_delete]
options[:skip_delete] = true
BookmarkableIndexer.delete_index
BookmarkableIndexer.create_index(shards: ArchiveConfig.BOOKMARKABLE_SHARDS)
create_mapping
end
BookmarkedExternalWorkIndexer.index_all(skip_delete: true)
BookmarkedSeriesIndexer.index_all(skip_delete: true)
BookmarkedWorkIndexer.index_all(skip_delete: true)
super
end
def self.mapping
{
properties: {
bookmarkable_join: {
type: "join",
relations: {
bookmarkable: "bookmark"
}
},
title: {
type: "text",
analyzer: "simple"
},
creators: {
type: "text",
analyzer: "standard"
},
work_types: {
type: "keyword"
},
bookmarkable_type: {
type: "keyword"
},
bookmarker: {
type: "text",
analyzer: "standard"
},
tag: {
type: "text",
analyzer: "simple"
},
sort_id: {
type: "keyword"
}
}
}
end
####################
# INSTANCE METHODS
####################
def routing_info(id)
object = objects[id.to_i]
{
"_index" => index_name,
"_id" => id,
"routing" => parent_id(id, object)
}
end
def parent_id(id, object)
if object.nil?
deleted_bookmark_info(id)
else
"#{object.bookmarkable_id}-#{object.bookmarkable_type.underscore}"
end
end
def document(object)
tags = object.tags
json_object = object.as_json(
root: false,
only: [
:id, :created_at, :bookmarkable_type, :bookmarkable_id,
:private, :updated_at, :hidden_by_admin, :pseud_id, :rec
],
methods: [:bookmarker, :collection_ids, :with_notes, :bookmarkable_date]
).merge(
user_id: object.pseud&.user_id,
tag: tags.map(&:name),
tag_ids: tags.map(&:id),
notes: object.bookmarker_notes
)
unless parent_id(object.id, object).match("deleted")
json_object.merge!(
bookmarkable_join: {
name: "bookmark",
parent: parent_id(object.id, object)
}
)
end
json_object
end
def deleted_bookmark_info(id)
REDIS_GENERAL.get("deleted_bookmark_parent_#{id}")
end
end