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



181
182
183
# File 'lib/plugin_routes.rb', line 181

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



146
147
148
149
# File 'lib/plugin_routes.rb', line 146

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



403
404
405
# File 'lib/plugin_routes.rb', line 403

def self.all_apps
  all_plugins + all_themes
end

.all_enabled_appsObject

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



211
212
213
# File 'lib/plugin_routes.rb', line 211

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)



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

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)



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

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



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

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 |



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

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



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

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



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
367
368
# File 'lib/plugin_routes.rb', line 340

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



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
399
400
# File 'lib/plugin_routes.rb', line 371

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’, ‘.…’]



316
317
318
319
# File 'lib/plugin_routes.rb', line 316

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



335
336
337
# File 'lib/plugin_routes.rb', line 335

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

.cache_variable(var_name, value = nil) ⇒ Object



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

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)


299
300
301
# File 'lib/plugin_routes.rb', line 299

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



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

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



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

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



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

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 []



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

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



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

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



154
155
156
# File 'lib/plugin_routes.rb', line 154

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



459
460
461
462
463
464
465
# File 'lib/plugin_routes.rb', line 459

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



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

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



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

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



292
293
294
295
296
# File 'lib/plugin_routes.rb', line 292

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



167
168
169
# File 'lib/plugin_routes.rb', line 167

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



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
47
48
# File 'lib/plugin_routes.rb', line 9

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



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
88
89
# File 'lib/plugin_routes.rb', line 50

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



478
479
480
# File 'lib/plugin_routes.rb', line 478

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

.plugin_info(plugin_key) ⇒ Object

return plugin information



93
94
95
96
# File 'lib/plugin_routes.rb', line 93

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



173
174
175
176
177
178
# File 'lib/plugin_routes.rb', line 173

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



162
163
164
# File 'lib/plugin_routes.rb', line 162

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



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

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)



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

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



100
101
102
103
# File 'lib/plugin_routes.rb', line 100

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