Implemented issue #2261 - Make stats store and cti log searchable via elastichsearch & destroy stats store if user got deleted.
This commit is contained in:
parent
8fb46b0448
commit
f5c588be0b
7 changed files with 112 additions and 9 deletions
|
@ -1,5 +1,7 @@
|
||||||
module Cti
|
module Cti
|
||||||
class Log < ApplicationModel
|
class Log < ApplicationModel
|
||||||
|
include HasSearchIndexBackend
|
||||||
|
|
||||||
self.table_name = 'cti_logs'
|
self.table_name = 'cti_logs'
|
||||||
|
|
||||||
store :preferences
|
store :preferences
|
||||||
|
|
|
@ -1,6 +1,14 @@
|
||||||
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
|
||||||
class StatsStore < ApplicationModel
|
class StatsStore < ApplicationModel
|
||||||
|
include HasSearchIndexBackend
|
||||||
|
include StatsStore::SearchIndex
|
||||||
|
|
||||||
|
# rubocop:disable Rails/InverseOf
|
||||||
|
belongs_to :stats_store_object, class_name: 'ObjectLookup', foreign_key: 'stats_store_object_id'
|
||||||
|
belongs_to :related_stats_store_object, class_name: 'ObjectLookup', foreign_key: 'related_stats_store_object_id'
|
||||||
|
# rubocop:enable Rails/InverseOf
|
||||||
|
|
||||||
store :data
|
store :data
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
@ -19,7 +27,7 @@ class StatsStore < ApplicationModel
|
||||||
|
|
||||||
# lookups
|
# lookups
|
||||||
if data[:object]
|
if data[:object]
|
||||||
object_id = ObjectLookup.by_name( data[:object] )
|
object_id = ObjectLookup.by_name(data[:object])
|
||||||
end
|
end
|
||||||
|
|
||||||
StatsStore.where(stats_store_object_id: object_id, o_id: data[:o_id], key: data[:key])
|
StatsStore.where(stats_store_object_id: object_id, o_id: data[:o_id], key: data[:key])
|
||||||
|
@ -40,7 +48,7 @@ class StatsStore < ApplicationModel
|
||||||
|
|
||||||
# lookups
|
# lookups
|
||||||
if data[:object]
|
if data[:object]
|
||||||
data[:stats_store_object_id] = ObjectLookup.by_name( data[:object] )
|
data[:stats_store_object_id] = ObjectLookup.by_name(data[:object])
|
||||||
data.delete(:object)
|
data.delete(:object)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -73,7 +81,7 @@ class StatsStore < ApplicationModel
|
||||||
|
|
||||||
# lookups
|
# lookups
|
||||||
if data[:object]
|
if data[:object]
|
||||||
data[:stats_store_object_id] = ObjectLookup.by_name( data[:object] )
|
data[:stats_store_object_id] = ObjectLookup.by_name(data[:object])
|
||||||
data.delete(:object)
|
data.delete(:object)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -98,7 +106,7 @@ class StatsStore < ApplicationModel
|
||||||
|
|
||||||
# lookups
|
# lookups
|
||||||
if data[:object]
|
if data[:object]
|
||||||
object_id = ObjectLookup.by_name( data[:object] )
|
object_id = ObjectLookup.by_name(data[:object])
|
||||||
end
|
end
|
||||||
|
|
||||||
# create history
|
# create history
|
||||||
|
@ -114,6 +122,31 @@ class StatsStore < ApplicationModel
|
||||||
StatsStore.create(record)
|
StatsStore.create(record)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
=begin
|
||||||
|
|
||||||
|
StatsStore.remove(
|
||||||
|
object: 'User',
|
||||||
|
o_id: ticket.owner_id,
|
||||||
|
)
|
||||||
|
|
||||||
|
=end
|
||||||
|
|
||||||
|
def self.remove(data)
|
||||||
|
|
||||||
|
# lookups
|
||||||
|
if data[:object]
|
||||||
|
object_id = ObjectLookup.by_name(data[:object])
|
||||||
|
end
|
||||||
|
|
||||||
|
# create history
|
||||||
|
record = {
|
||||||
|
stats_store_object_id: object_id,
|
||||||
|
o_id: data[:o_id],
|
||||||
|
}
|
||||||
|
|
||||||
|
StatsStore.where(record).destroy_all
|
||||||
|
end
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
cleanup old stats store
|
cleanup old stats store
|
||||||
|
@ -122,11 +155,11 @@ cleanup old stats store
|
||||||
|
|
||||||
optional you can put the max oldest stats store entries as argument
|
optional you can put the max oldest stats store entries as argument
|
||||||
|
|
||||||
StatsStore.cleanup(3.months)
|
StatsStore.cleanup(12.months)
|
||||||
|
|
||||||
=end
|
=end
|
||||||
|
|
||||||
def self.cleanup(diff = 3.months)
|
def self.cleanup(diff = 12.months)
|
||||||
StatsStore.where('updated_at < ?', Time.zone.now - diff).delete_all
|
StatsStore.where('updated_at < ?', Time.zone.now - diff).delete_all
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
20
app/models/stats_store/search_index.rb
Normal file
20
app/models/stats_store/search_index.rb
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# Copyright (C) 2012-2016 Zammad Foundation, http://zammad-foundation.org/
|
||||||
|
module StatsStore::SearchIndex
|
||||||
|
|
||||||
|
def search_index_attribute_lookup
|
||||||
|
attributes = super
|
||||||
|
return if !attributes
|
||||||
|
|
||||||
|
begin
|
||||||
|
return if !Kernel.const_get(attributes['stats_store_object'])
|
||||||
|
record = Kernel.const_get(attributes['stats_store_object']).lookup(id: o_id)
|
||||||
|
return if !record
|
||||||
|
attributes['stats_store_object_ref'] = record.search_index_attribute_lookup
|
||||||
|
rescue
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
attributes
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
|
@ -1167,6 +1167,10 @@ raise 'Minimum one user need to have admin permissions'
|
||||||
::RecentView.where(created_by_id: id).destroy_all
|
::RecentView.where(created_by_id: id).destroy_all
|
||||||
::UserDevice.remove(id)
|
::UserDevice.remove(id)
|
||||||
::Token.where(user_id: id).destroy_all
|
::Token.where(user_id: id).destroy_all
|
||||||
|
::StatsStore.remove(
|
||||||
|
object: 'User',
|
||||||
|
o_id: id,
|
||||||
|
)
|
||||||
true
|
true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ returns
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
get list of searchable models
|
get list of searchable models for UI
|
||||||
|
|
||||||
result = Models.searchable
|
result = Models.searchable
|
||||||
|
|
||||||
|
@ -82,6 +82,28 @@ returns
|
||||||
|
|
||||||
=begin
|
=begin
|
||||||
|
|
||||||
|
get list of indexable models
|
||||||
|
|
||||||
|
result = Models.indexable
|
||||||
|
|
||||||
|
returns
|
||||||
|
|
||||||
|
[Model1, Model2, Model3]
|
||||||
|
|
||||||
|
=end
|
||||||
|
|
||||||
|
def self.indexable
|
||||||
|
models = []
|
||||||
|
all.each_key do |model_class|
|
||||||
|
next if !model_class
|
||||||
|
next if !model_class.new.respond_to? :search_index_update_backend
|
||||||
|
models.push model_class
|
||||||
|
end
|
||||||
|
models
|
||||||
|
end
|
||||||
|
|
||||||
|
=begin
|
||||||
|
|
||||||
get reference list of a models
|
get reference list of a models
|
||||||
|
|
||||||
result = Models.references('User', 2)
|
result = Models.references('User', 2)
|
||||||
|
|
|
@ -25,7 +25,7 @@ namespace :searchindex do
|
||||||
end
|
end
|
||||||
|
|
||||||
mapping = {}
|
mapping = {}
|
||||||
Models.searchable.each do |local_object|
|
Models.indexable.each do |local_object|
|
||||||
mapping.merge!(get_mapping_properties_object(local_object))
|
mapping.merge!(get_mapping_properties_object(local_object))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -125,7 +125,7 @@ namespace :searchindex do
|
||||||
task :reload, [:opts] => :environment do |_t, _args|
|
task :reload, [:opts] => :environment do |_t, _args|
|
||||||
|
|
||||||
puts 'reload data...'
|
puts 'reload data...'
|
||||||
Models.searchable.each do |model_class|
|
Models.indexable.each do |model_class|
|
||||||
puts " reload #{model_class}"
|
puts " reload #{model_class}"
|
||||||
started_at = Time.zone.now
|
started_at = Time.zone.now
|
||||||
puts " - started at #{started_at}"
|
puts " - started at #{started_at}"
|
||||||
|
|
|
@ -1260,6 +1260,21 @@ class UserTest < ActiveSupport::TestCase
|
||||||
|
|
||||||
Token.create!(action: 'api', user_id: agent1_id)
|
Token.create!(action: 'api', user_id: agent1_id)
|
||||||
|
|
||||||
|
StatsStore.add(
|
||||||
|
object: 'User',
|
||||||
|
o_id: agent1_id,
|
||||||
|
key: 'some_key',
|
||||||
|
data: { A: 1, B: 2 },
|
||||||
|
created_at: Time.zone.now,
|
||||||
|
created_by_id: 1,
|
||||||
|
)
|
||||||
|
item = StatsStore.search(
|
||||||
|
object: 'User',
|
||||||
|
o_id: agent1_id,
|
||||||
|
key: 'some_key',
|
||||||
|
)
|
||||||
|
assert(item)
|
||||||
|
|
||||||
agent1.destroy!
|
agent1.destroy!
|
||||||
|
|
||||||
assert_equal(0, UserDevice.where(user_id: agent1_id).count)
|
assert_equal(0, UserDevice.where(user_id: agent1_id).count)
|
||||||
|
@ -1271,6 +1286,13 @@ class UserTest < ActiveSupport::TestCase
|
||||||
assert_equal(0, Taskbar.where(user_id: agent1_id).count)
|
assert_equal(0, Taskbar.where(user_id: agent1_id).count)
|
||||||
assert_equal(0, RecentView.where(created_by_id: agent1_id).count)
|
assert_equal(0, RecentView.where(created_by_id: agent1_id).count)
|
||||||
assert_equal(0, Token.where(user_id: agent1_id).count)
|
assert_equal(0, Token.where(user_id: agent1_id).count)
|
||||||
|
assert_equal(0, Token.where(user_id: agent1_id).count)
|
||||||
|
item = StatsStore.search(
|
||||||
|
object: 'User',
|
||||||
|
o_id: agent1_id,
|
||||||
|
key: 'some_key',
|
||||||
|
)
|
||||||
|
assert_nil(item)
|
||||||
end
|
end
|
||||||
|
|
||||||
test 'adding group drops cache' do
|
test 'adding group drops cache' do
|
||||||
|
|
Loading…
Reference in a new issue