Class: PluginRoutes

Inherits:
Object
  • Object
show all
Defined in:
lib/plugin_routes.rb,
lib/generators/camaleon_cms/install_template/plugin_routes.rb

Constant Summary collapse

@@_vars =
[]
@@_after_reload =
[]
@@anonymous_hooks =
{}

Class Method Summary collapse

Class Method Details

.add_after_reload_routes(command) ⇒ Object

permit to add extra actions for reload routes



179
180
181
# File 'lib/plugin_routes.rb', line 179

def self.add_after_reload_routes(command)
  @@_after_reload << command
end

.add_anonymous_hook(hook_key, callback, hook_id = '') ⇒ Object

add a new anonymous hook sample: PluginRoutes.add_anonymous_hook(‘before_admin’, lambda{|params| puts params })

Parameters:

  • hook_key (String)

    , key of hook

  • hook_id (String) (defaults to: '')

    , identifier for the anonymous hook

  • callback (Lambda)

    , anonymous function to be called when the hook was called

Returns:

  • nil



144
145
146
147
# File 'lib/plugin_routes.rb', line 144

def add_anonymous_hook(hook_key, callback, hook_id = '')
  @@anonymous_hooks[hook_key] ||= []
  @@anonymous_hooks[hook_key] << { id: hook_id, callback: callback }
end

.all_appsObject

return all apps loaded



401
402
403
# File 'lib/plugin_routes.rb', line 401

def self.all_apps
  all_plugins + all_themes
end

.all_enabled_appsObject

return all enabled apps as []: system, themes, plugins



209
210
211
# File 'lib/plugin_routes.rb', line 209

def self.all_enabled_apps
  [system_info] + all_enabled_themes + all_enabled_plugins
end

.all_enabled_pluginsObject

return all enabled plugins (a theme is enabled if at least one site has installed)



227
228
229
230
231
232
233
234
235
236
237
238
# File 'lib/plugin_routes.rb', line 227

def self.all_enabled_plugins
  r = cache_variable('all_enabled_plugins')
  return r unless r.nil?

  res = []
  enabled_ps = []
  get_sites.each { |site| enabled_ps += site.plugins.active.pluck(:slug) }
  all_plugins.each do |plugin|
    res << plugin if enabled_ps.include?(plugin['key'])
  end
  cache_variable('all_enabled_plugins', res)
end

.all_enabled_themesObject

return all enabled themes (a theme is enabled if at least one site is assigned)



214
215
216
217
218
219
220
221
222
223
224
# File 'lib/plugin_routes.rb', line 214

def self.all_enabled_themes
  r = cache_variable('all_enabled_themes')
  return r unless r.nil?

  res = []
  get_sites.each do |site|
    i = theme_info(site.get_theme_slug)
    res << i if i.present?
  end
  cache_variable('all_enabled_themes', res)
end

.all_helpersObject

all helpers of enabled plugins



253
254
255
256
257
258
259
260
261
262
# File 'lib/plugin_routes.rb', line 253

def self.all_helpers
  r = cache_variable('plugins_helper')
  return r unless r.nil?

  res = []
  all_apps.each do |settings|
    res += settings['helpers'] if settings['helpers'].present?
  end
  cache_variable('plugins_helper', res.uniq)
end

.all_localesObject

return all locales for all sites joined by |



302
303
304
305
306
307
308
309
310
311
# File 'lib/plugin_routes.rb', line 302

def self.all_locales
  r = cache_variable('site_all_locales')
  return r unless r.nil?

  res = []
  get_sites.each do |s|
    res += s.get_languages
  end
  cache_variable('site_all_locales', res.uniq.join('|'))
end

.all_locales_for_routesObject

return all locales for translated routes



320
321
322
323
324
325
326
327
328
329
330
# File 'lib/plugin_routes.rb', line 320

def self.all_locales_for_routes
  r = cache_variable('all_locales_for_routes')
  return r unless r.nil?

  res = {}
  all_locales.split('|').each do |l|
    res[l] = "_#{l}"
  end
  res[false] = ''
  cache_variable('all_locales_for_routes', res)
end

.all_pluginsObject

return all plugins located in cms and in this project



338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
# File 'lib/plugin_routes.rb', line 338

def self.all_plugins
  camaleon_gem = get_gem('camaleon_cms')
  return [] unless camaleon_gem

  r = cache_variable('all_plugins')
  return r unless r.nil? || r == []

  res = get_gem_plugins
  entries = ['.', '..']
  res.each { |plugin| entries << plugin['key'] }
  (Dir["#{apps_dir}/plugins/*"] + Dir["#{camaleon_gem.gem_dir}/app/apps/plugins/*"]).each do |path|
    entry = path.split('/').last
    config = File.join(path, 'config', 'config.json')
    next if entries.include?(entry) || !File.directory?(path) || !File.exist?(config)

    p = JSON.parse(File.read(config))
    p = begin
      p.with_indifferent_access
    rescue StandardError
      p
    end
    p['key'] = entry
    p['path'] = path
    p['kind'] = 'plugin'
    res << p
    entries << entry
  end
  cache_variable('all_plugins', res)
end

.all_themesObject

return an array of all themes installed for all sites



369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
# File 'lib/plugin_routes.rb', line 369

def self.all_themes
  camaleon_gem = get_gem('camaleon_cms')
  return [] unless camaleon_gem

  r = cache_variable('all_themes')
  return r unless r.nil? || r == []

  res = get_gem_themes
  entries = ['.', '..']
  res.each { |theme| entries << theme['key'] }
  (Dir["#{apps_dir}/themes/*"]).each do |path|
    entry = path.split('/').last
    config = File.join(path, 'config', 'config.json')
    next if entries.include?(entry) || !File.directory?(path) || !File.exist?(config)

    p = JSON.parse(File.read(config))
    p = begin
      p.with_indifferent_access
    rescue StandardError
      p
    end
    p['key'] = entry
    p['path'] = path
    p['kind'] = 'theme'
    p['title'] = p['name']
    res << p
    entries << entry
  end
  cache_variable('all_themes', res)
end

.all_translations(key, *args) ⇒ Object

return all translations for all languages, sample: [‘Sample’, ‘Ejemplo’, ‘.…’]



314
315
316
317
# File 'lib/plugin_routes.rb', line 314

def self.all_translations(key, *args)
  args = args.extract_options!
  all_locales.split('|').map { |_l| I18n.t(key, **args.merge({ locale: _l })) }.uniq
end

.apps_dirObject

return apps directory path



333
334
335
# File 'lib/plugin_routes.rb', line 333

def self.apps_dir
  Rails.root.join('app', 'apps').to_s
end

.cache_variable(var_name, value = nil) ⇒ Object



274
275
276
277
278
279
280
281
282
283
284
285
286
287
# File 'lib/plugin_routes.rb', line 274

def self.cache_variable(var_name, value = nil)
  @@_vars.push(var_name).uniq!
  # if Rails.env != "development" # disable cache plugin routes for develoment mode
  cache = begin
    class_variable_get("@@cache_#{var_name}")
  rescue StandardError
    nil
  end
  return cache if value.nil?

  # end
  class_variable_set("@@cache_#{var_name}", value)
  value
end

.db_installed?Boolean

check if db migrate already done

Returns:

  • (Boolean)


297
298
299
# File 'lib/plugin_routes.rb', line 297

def self.db_installed?
  @@is_db_installed ||= ActiveRecord::Base.connection.table_exists?(CamaleonCms::Site.table_name)
end

.default_url_optionsObject

return the default url options for Camaleon CMS



466
467
468
469
470
471
472
473
474
# File 'lib/plugin_routes.rb', line 466

def self.default_url_options
  options = { host: begin
    CamaleonCms::Site.main_site.slug
  rescue StandardError
    ''
  end }
  options.merge!({ protocol: 'https' }) if Rails.application.config.force_ssl
  options
end

.destroy_plugin(plugin_key) ⇒ Object

destroy plugin



265
266
267
268
269
270
271
272
# File 'lib/plugin_routes.rb', line 265

def self.destroy_plugin(plugin_key)
  begin
    FileUtils.rm_r(Rails.root.join('app', 'apps', 'plugins', plugin_key))
  rescue StandardError
    ''
  end
  PluginRoutes.reload
end

.draw_gemsObject

draw “all” gems registered for the plugins or themes and camaleon gems



4
5
6
7
8
9
10
11
12
13
14
15
# File 'lib/generators/camaleon_cms/install_template/plugin_routes.rb', line 4

def self.draw_gems
  res = []
  dirs = [] + Dir["#{apps_dir}/plugins/*"] + Dir["#{apps_dir}/themes/*"]

  dirs.each do |path|
    next if ['.', '..'].include?(path)

    g = File.join(path, 'config', 'Gemfile')
    res << File.read(g) if File.exist?(g)
  end
  res.join("\n")
end

.enabled_apps(site, theme_slug = nil) ⇒ Object

return all enabled apps for site (themes + system + plugins) [] theme_slug: current theme slug



199
200
201
202
203
204
205
206
# File 'lib/plugin_routes.rb', line 199

def self.enabled_apps(site, theme_slug = nil)
  theme_slug ||= site.get_theme_slug
  r = cache_variable("enabled_apps_#{site.id}_#{theme_slug}")
  return r unless r.nil?

  res = [system_info] + enabled_plugins(site) + [theme_info(theme_slug)]
  cache_variable("enabled_apps_#{site.id}_#{theme_slug}", res)
end

.enabled_plugins(site) ⇒ Object

return all enabled plugins []



184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/plugin_routes.rb', line 184

def self.enabled_plugins(site)
  r = cache_variable("enable_plugins_site_#{site.id}")
  return r unless r.nil?

  res = []
  enabled_ps = site.plugins.active.pluck(:slug)
  all_plugins.each do |plugin|
    res << plugin if enabled_ps.include?(plugin['key'])
  end
  res = res.sort_by { |e| e['position'] || 10 }
  cache_variable("enable_plugins_site_#{site.id}", res)
end

.fixActionParameter(h) ⇒ Object

convert action parameter into hash



126
127
128
129
130
131
132
133
134
135
136
# File 'lib/plugin_routes.rb', line 126

def fixActionParameter(h)
  (if h.is_a?(ActionController::Parameters)
     begin
       h.permit!.to_h
     rescue StandardError
       h.to_hash
     end
   else
     h
   end)
end

.get_anonymous_hooks(hook_key) ⇒ Array

return all registered anonymous hooks for hook_key

Parameters:

  • hook_key (String)

    name of the hook

Returns:

  • (Array)

    array of hooks for hook_key



152
153
154
# File 'lib/plugin_routes.rb', line 152

def get_anonymous_hooks(hook_key)
  (@@anonymous_hooks[hook_key.to_s] || []).map { |item| item[:callback] }
end

.get_gem(name) ⇒ Object

check if a gem is available or not Arguemnts: name: name of the gem return (Boolean) true/false



457
458
459
460
461
462
463
# File 'lib/plugin_routes.rb', line 457

def self.get_gem(name)
  Gem::Specification.find_by_name(name)
rescue Gem::LoadError
  false
rescue StandardError
  Gem.available?(name)
end

.get_gem_pluginsObject

return all plugins registered as gems



406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
# File 'lib/plugin_routes.rb', line 406

def self.get_gem_plugins
  entries = []
  Gem::Specification.each do |gem|
    path = gem.gem_dir
    config = File.join(path, 'config', 'camaleon_plugin.json')
    next unless File.exist?(config)

    p = JSON.parse(File.read(config))
    p = begin
      p.with_indifferent_access
    rescue StandardError
      p
    end
    p['key'] = gem.name if p['key'].nil? # TODO: REVIEW ERROR FOR conflict plugin keys
    p['version'] = gem.version.to_s
    p['path'] = path
    p['kind'] = 'plugin'
    p['descr'] = gem.description unless p['descr'].present?
    p['gem_mode'] = true
    entries << p
  end
  entries
end

.get_gem_themesObject

return all themes registered as gems



431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
# File 'lib/plugin_routes.rb', line 431

def self.get_gem_themes
  entries = []
  Gem::Specification.each do |gem|
    path = gem.gem_dir
    config = File.join(path, 'config', 'camaleon_theme.json')
    next unless File.exist?(config)

    p = JSON.parse(File.read(config))
    p = begin
      p.with_indifferent_access
    rescue StandardError
      p
    end
    p['key'] = gem.name if p['key'].nil? # TODO: REVIEW ERROR FOR conflict plugin keys
    p['path'] = path
    p['kind'] = 'theme'
    p['gem_mode'] = true
    entries << p
  end
  entries
end

.get_sitesObject

return all sites registered for Plugin routes



290
291
292
293
294
# File 'lib/plugin_routes.rb', line 290

def self.get_sites
  @@all_sites ||= CamaleonCms::Site.order(id: :asc).all.to_a
rescue StandardError
  []
end

.get_user_class_nameObject

return the class name for user model



165
166
167
# File 'lib/plugin_routes.rb', line 165

def get_user_class_name
  static_system_info['user_model'].presence || 'CamaleonCms::User'
end

.load(env = 'admin') ⇒ Object

load plugin routes if it is enabled



7
8
9
10
11
12
13
14
15
16
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
# File 'lib/plugin_routes.rb', line 7

def self.load(env = 'admin')
  plugins = all_enabled_plugins
  res = ''
  case env
  when 'front'
    res << "namespace :plugins do \n"
    plugins.each do |plugin|
      res << "namespace '#{plugin['key']}' do \n"
      begin
        res << "#{File.open(File.join(plugin['path'], 'config', "routes_#{env}.txt")).read}\n"
      rescue StandardError
        ''
      end
      res << "end\n"
    end
    res << "end\n"

  when 'admin' # admin
    res << "scope 'admin', as: 'admin' do \n"
    res << "namespace :plugins do \n"
    plugins.each do |plugin|
      res << "namespace '#{plugin['key']}' do \n"
      begin
        res << "#{File.open(File.join(plugin['path'], 'config', "routes_#{env}.txt")).read}\n"
      rescue StandardError
        ''
      end
      res << "end\n"
    end
    res << "end\n"
    res << "end\n"
  else # main
    plugins.each do |plugin|
      res << "#{File.open(File.join(plugin['path'], 'config', "routes_#{env}.txt")).read}\n"
    rescue StandardError
      ''
    end
  end
  res + load_themes(env)
end

.load_themes(env = 'admin') ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/plugin_routes.rb', line 48

def self.load_themes(env = 'admin')
  plugins = all_enabled_themes
  res = ''
  case env
  when 'front'
    res << "namespace :themes do \n"
    plugins.each do |plugin|
      res << "namespace '#{plugin['key']}' do \n"
      begin
        res << "#{File.open(File.join(plugin['path'], 'config', "routes_#{env}.txt")).read}\n"
      rescue StandardError
        ''
      end
      res << "end\n"
    end
    res << "end\n"

  when 'admin' # admin
    res << "scope 'admin', as: 'admin' do \n"
    res << "namespace :themes do \n"
    plugins.each do |plugin|
      res << "namespace '#{plugin['key']}' do \n"
      begin
        res << "#{File.open(File.join(plugin['path'], 'config', "routes_#{env}.txt")).read}\n"
      rescue StandardError
        ''
      end
      res << "end\n"
    end
    res << "end\n"
    res << "end\n"
  else # main
    plugins.each do |plugin|
      res << "#{File.open(File.join(plugin['path'], 'config', "routes_#{env}.txt")).read}\n"
    rescue StandardError
      ''
    end
  end
  res
end

.migration_classObject



476
477
478
# File 'lib/plugin_routes.rb', line 476

def self.migration_class
  ActiveRecord::Migration[4.2]
end

.plugin_info(plugin_key) ⇒ Object

return plugin information



91
92
93
94
# File 'lib/plugin_routes.rb', line 91

def plugin_info(plugin_key)
  all_plugins.each { |p| return p if p['key'] == plugin_key || p['path'].split('/').last == plugin_key }
  nil
end

.reloadObject

reload routes



171
172
173
174
175
176
# File 'lib/plugin_routes.rb', line 171

def self.reload
  @@all_sites = nil
  @@_vars.each { |v| class_variable_set("@@cache_#{v}", nil) }
  Rails.application.reload_routes!
  @@_after_reload.uniq.each { |r| eval(r) }
end

.remove_anonymous_hook(hook_key, hook_id) ⇒ Array

return all registered anonymous hooks for hook_key

Parameters:

  • hook_key (String)

    name of the hook

  • hook_id (String)

    identifier of the anonymous hooks

Returns:

  • (Array)

    array of hooks for hook_key



160
161
162
# File 'lib/plugin_routes.rb', line 160

def remove_anonymous_hook(hook_key, hook_id)
  (@@anonymous_hooks[hook_key.to_s] || []).delete_if { |item| item[:id] == hook_id }
end

.site_plugin_helpers(site) ⇒ Object

all helpers of enabled plugins for site



241
242
243
244
245
246
247
248
249
250
# File 'lib/plugin_routes.rb', line 241

def self.site_plugin_helpers(site)
  r = cache_variable('site_plugin_helpers')
  return r unless r.nil?

  res = []
  enabled_apps(site).each do |settings|
    res += settings['helpers'] if settings['helpers'].present?
  end
  cache_variable('site_plugin_helpers', res)
end

.static_system_infoObject Also known as: system_info

return system static settings (config.json values)



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/plugin_routes.rb', line 104

def static_system_info
  r = cache_variable('statis_system_info')
  return r unless r.nil?

  settings = {}

  gem_settings = File.join($camaleon_engine_dir, 'config', 'system.json')
  app_settings = Rails.root.join('config', 'system.json')

  settings = settings.merge(JSON.parse(File.read(gem_settings))) if File.exist?(gem_settings)
  settings = settings.merge(JSON.parse(File.read(app_settings))) if File.exist?(app_settings)

  # custom settings
  settings['key'] = 'system'
  settings['path'] = ''
  settings['kind'] = 'system'
  settings['hooks']['on_notification'] ||= []
  cache_variable('statis_system_info', settings)
end

.theme_info(theme_name) ⇒ Object

return theme information if theme_name is nil, the use current site theme



98
99
100
101
# File 'lib/plugin_routes.rb', line 98

def theme_info(theme_name)
  all_themes.each { |p| return p if p['key'] == theme_name }
  nil
end