Class: LcpRuby::SavedFilters::Resolver

Inherits:
Object
  • Object
show all
Defined in:
lib/lcp_ruby/saved_filters/resolver.rb

Class Method Summary collapse

Class Method Details

.clear_cache!Object

Clear any cached data (called from ChangeHandler after_commit)



84
85
86
87
# File 'lib/lcp_ruby/saved_filters/resolver.rb', line 84

def clear_cache!
  # Currently no cache to clear — filters are loaded fresh each request.
  # This hook exists for future caching optimization.
end

.default_filter_for(presenter_name:, user:, evaluator:) ⇒ ActiveRecord::Base?

Returns the default filter for the given context, following priority: personal > group > role > global

Parameters:

Returns:

  • (ActiveRecord::Base, nil)


68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/lcp_ruby/saved_filters/resolver.rb', line 68

def default_filter_for(presenter_name:, user:, evaluator:)
  filters = visible_filters(presenter_name: presenter_name, user: user, evaluator: evaluator)
  defaults = filters.select { |f| f.respond_to?(:default_filter) && f.default_filter }
  return nil if defaults.empty?

  # Priority: personal > group > role > global
  priority_order = %w[personal group role global]
  priority_order.each do |vis|
    match = defaults.find { |f| f.visibility == vis }
    return match if match
  end

  defaults.first
end

.visible_filters(presenter_name:, user:, evaluator:) ⇒ Array<ActiveRecord::Base>

Returns visible saved filters for the current user on the given presenter.

Union of:

- personal filters (owner_id = user.id)
- role filters (target_role matches user's role)
- group filters (target_group in user's groups)
- global filters

Parameters:

Returns:

  • (Array<ActiveRecord::Base>)


17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/lcp_ruby/saved_filters/resolver.rb', line 17

def visible_filters(presenter_name:, user:, evaluator:)
  return [] unless Registry.available?

  model_class = Registry.model_class
  return [] unless model_class

  scope = model_class.where(target_presenter: presenter_name)

  # Build OR conditions for visibility
  conditions = []
  bind_values = {}

  # Personal: owned by user
  if user&.id
    conditions << "visibility = 'personal' AND owner_id = :user_id"
    bind_values[:user_id] = user.id
  end

  # Role: matching user's role(s)
  user_roles = resolve_user_roles(user)
  if user_roles.any?
    conditions << "visibility = 'role' AND target_role IN (:roles)"
    bind_values[:roles] = user_roles
  end

  # Group: matching user's group memberships
  user_groups = resolve_user_groups(user)
  if user_groups.any?
    conditions << "visibility = 'group' AND target_group IN (:groups)"
    bind_values[:groups] = user_groups
  end

  # Global: visible to everyone
  conditions << "visibility = 'global'"

  return [] if conditions.empty?

  combined = conditions.map { |c| "(#{c})" }.join(" OR ")
  scope = scope.where(combined, **bind_values)

  # Order: pinned first, then by position, then by name
  scope.order(pinned: :desc, position: :asc, name: :asc).to_a
end