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

79 lines
1.6 KiB
Ruby

class UserIndexer < Indexer
def self.klass
"User"
end
def self.klass_with_includes
User.includes(:pseuds, :roles, :audits)
end
def self.index_all(options = {})
unless options[:skip_delete]
delete_index
create_index(shards: ArchiveConfig.USER_SHARDS)
end
options[:skip_delete] = true
super(options)
end
def self.mapping
{
properties: {
login: {
type: "keyword",
normalizer: "keyword_normalizer"
},
email: {
type: "keyword",
normalizer: "keyword_normalizer"
},
names: {
type: "keyword",
normalizer: "keyword_normalizer"
},
all_names: {
type: "keyword",
normalizer: "keyword_normalizer"
},
all_emails: {
type: "keyword",
normalizer: "keyword_normalizer"
}
}
}
end
def self.settings
{
analysis: {
normalizer: {
keyword_normalizer: {
type: "custom",
filter: %w[lowercase asciifolding]
}
}
}
}
end
def document(object)
object.as_json(
root: false,
only: [:id, :login, :email, :created_at],
methods: [:role_ids]
).merge(extra_info(object))
end
def extra_info(object)
names = ([object.login] + object.pseuds.map(&:name)).uniq
past_names = object.historic_values("login")
past_emails = object.historic_values("email")
{
active: object.active?,
names: names,
all_names: (names + past_names).uniq,
all_emails: ([object.email] + past_emails).uniq
}
end
end