Class: Avo::App

Inherits:
Object
  • Object
show all
Includes:
Concerns::FetchesThings
Defined in:
lib/avo/app.rb

Class Method Summary collapse

Class Method Details

.bootObject



20
21
22
23
24
25
26
27
28
# File 'lib/avo/app.rb', line 20

def boot
  init_fields

  if Rails.cache.instance_of?(ActiveSupport::Cache::NullStore)
    self.cache_store ||= ActiveSupport::Cache::MemoryStore.new
  else
    self.cache_store = Rails.cache
  end
end

.check_bad_resourcesObject



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/avo/app.rb', line 89

def check_bad_resources
  resources.each do |resource|
    has_model = resource.model_class.present?

    unless has_model
      possible_model = resource.class.to_s.gsub 'Resource', ''

      Avo::App.error_messages.push({
        url: "https://docs.avohq.io/2.0/resources.html#custom-model-class",
        target: "_blank",
        message: "#{resource.class.to_s} does not have a valid model assigned. It failed to find the #{possible_model} model. \n\r Please create that model or assign one using self.model_class = YOUR_MODEL"
      })
    end
  end
end

.debug_report(request = nil) ⇒ Object



159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'lib/avo/app.rb', line 159

def debug_report(request = nil)
  payload = {}

  hq = Avo::Licensing::HQ.new(request)

  payload[:thread_count] = get_thread_count
  payload[:hq_payload] = hq&.payload
  payload[:license_id] = Avo::App&.license&.id
  payload[:license_valid] = Avo::App&.license&.valid?
  payload[:license_payload] = Avo::App&.license&.payload
  payload[:license_response] = Avo::App&.license&.response
  payload[:license_abilities] = Avo::App&.license&.abilities
  payload[:cache_store] = self.cache_store&.class&.to_s
  payload[:avo_metadata] = hq&.
  payload[:app_timezone] = Time.current.zone
  payload[:cache_key] = Avo::Licensing::HQ.cache_key
  payload[:cache_key_contents] = hq&.cached_response

  payload
rescue => e
  e
end

.get_thread_countObject



182
183
184
185
186
# File 'lib/avo/app.rb', line 182

def get_thread_count
  Thread.list.select {|thread| thread.status == "run"}.count
rescue => e
  e
end

.has_main_menu?Boolean

Returns:

  • (Boolean)


131
132
133
134
135
136
# File 'lib/avo/app.rb', line 131

def has_main_menu?
  return false if Avo::App.license.lacks_with_trial(:menu_editor)
  return false if Avo.configuration.main_menu.nil?

  true
end

.has_profile_menu?Boolean

Returns:

  • (Boolean)


138
139
140
141
142
143
# File 'lib/avo/app.rb', line 138

def has_profile_menu?
  return false if Avo::App.license.lacks_with_trial(:menu_editor)
  return false if Avo.configuration.profile_menu.nil?

  true
end

.init(request:, context:, current_user:, view_context:, params:) ⇒ Object



38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/avo/app.rb', line 38

def init(request:, context:, current_user:, view_context:, params:)
  self.error_messages = []
  self.context = context
  self.current_user = current_user
  self.params = params
  self.request = request
  self.view_context = view_context

  self.license = Licensing::LicenseManager.new(Licensing::HQ.new(request).response).license
  self.translation_enabled = license.has(:localization)

  # Set the current host for ActiveStorage
  begin
    if Rails::VERSION::MAJOR === 6
      ActiveStorage::Current.host = request.base_url
    elsif Rails::VERSION::MAJOR === 7
      ActiveStorage::Current.url_options = request.base_url
    end
  rescue => exception
    Rails.logger.debug "[Avo] Failed to set ActiveStorage::Current.url_options, #{exception.inspect}"
  end

  check_bad_resources
  init_resources
  init_dashboards if license.has_with_trial(:dashboards)
end

.init_dashboardsObject



121
122
123
124
125
126
127
128
129
# File 'lib/avo/app.rb', line 121

def init_dashboards
  self.dashboards = Dashboards::BaseDashboard.descendants
    .select do |dashboard|
      dashboard != Dashboards::BaseDashboard
    end
    .uniq do |dashboard|
      dashboard.id
    end
end

.init_fieldsObject

This method will find all fields available in the Avo::Fields namespace and add them to the fields class_variable array so later we can instantiate them on our resources.

If the field has their `def_method` set up it will follow that convention, if not it will snake_case the name:

Avo::Fields::TextField -> text Avo::Fields::DateTimeField -> date_time



72
73
74
75
76
77
78
79
80
# File 'lib/avo/app.rb', line 72

def init_fields
  Avo::Fields::BaseField.descendants.each do |class_name|
    next if class_name.to_s == "BaseField"

    if class_name.to_s.end_with? "Field"
      load_field class_name.get_field_name, class_name
    end
  end
end

.init_resourcesObject



105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/avo/app.rb', line 105

def init_resources
  self.resources = BaseResource.descendants
    .select do |resource|
      # Remove the BaseResource. We only need the descendants
      resource != BaseResource
    end
    .uniq do |klass|
      # On invalid resource configuration the resource classes get duplicated in `ObjectSpace`
      # We need to de-duplicate them
      klass.name
    end
    .map do |resource|
      resource.new if resource.is_a? Class
    end
end

.load_field(method_name, klass) ⇒ Object



82
83
84
85
86
87
# File 'lib/avo/app.rb', line 82

def load_field(method_name, klass)
  fields.push(
    name: method_name,
    class: klass
  )
end


145
146
147
148
149
150
# File 'lib/avo/app.rb', line 145

def main_menu
  # Return empty menu if the app doesn't have the profile menu configured
  return Avo::Menu::Builder.new.build unless has_main_menu?

  Avo::Menu::Builder.parse_menu(&Avo.configuration.main_menu)
end

.profile_menuObject



152
153
154
155
156
157
# File 'lib/avo/app.rb', line 152

def profile_menu
  # Return empty menu if the app doesn't have the profile menu configured
  return Avo::Menu::Builder.new.build unless has_profile_menu?

  Avo::Menu::Builder.parse_menu(&Avo.configuration.profile_menu)
end

.root_path(paths: [], query: {}, **args) ⇒ Object

Renerate a dynamic root path using the URIService



31
32
33
34
35
36
# File 'lib/avo/app.rb', line 31

def root_path(paths: [], query: {}, **args)
  Avo::Services::URIService.parse(view_context.avo.root_url.to_s)
    .append_paths(paths)
    .append_query(query)
    .to_s
end