motor-admin 0.1.49 → 0.1.50

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 11b39999a22bc50fe6e3dbcd11765207acaf301b61c0e914afe3a7e553216446
4
- data.tar.gz: 4d39e9ae7ce4df7661008d1db9346f99daaeb3143ae22076ba26032a42bece36
3
+ metadata.gz: 9e5a06d8a42714fbc30464ef704366dc9f3b851df80bd8c9a206a2ed75a6fd23
4
+ data.tar.gz: 13d46e2d091be7a9b6e9832ab1e036c08734bbe70b0b92b64f1b41dd0f355a17
5
5
  SHA512:
6
- metadata.gz: 784ae2079cafceacf3ec1a8cf8b8796e515afe5411dd065f6b976ed25d7f0041de3603aa3ca1ad768e7a4c5d1259fc25e2bdd459db5003edb46db5911f2d07dc
7
- data.tar.gz: cf5177b94de2da402d9122c339d379a95a9b71d52bcdbb4c807710243dc80c0d5b4d05673d4ed5c5385f3c42e5f6e6c39553df12c1de35e27876c7b69d872542
6
+ metadata.gz: 544edcef7fd6e97e1285fff69f1984a0991dc72a1768ebace132faad1a1b6609e68dd7c0ae4e6d573036c171a1b364a65fc52a9f63e653f51e4f33b8b86281ec
7
+ data.tar.gz: 2cb5fb5c3c47710cfea97550e0f0ac67c2463eb3d71a5a62a8ce6fbff62763e04274d92b6c4c6bc51e2f14e2a4fd84a6d9f290b7586fca407b85a1aa254fa47d
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Motor
4
4
  class AssetsController < ActionController::Metal
5
- CACHE_STORE = ActiveSupport::Cache::MemoryStore.new
5
+ CACHE_STORE = ActiveSupport::Cache::MemoryStore.new(coder: ActiveSupport::Cache::NullCoder)
6
6
 
7
7
  GZIP_TYPES = [
8
8
  'application/javascript',
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Motor
4
4
  class IconsController < ApiBaseController
5
- CACHE_STORE = ActiveSupport::Cache::MemoryStore.new
5
+ CACHE_STORE = ActiveSupport::Cache::MemoryStore.new(coder: ActiveSupport::Cache::NullCoder)
6
6
 
7
7
  def index
8
8
  data = CACHE_STORE.fetch('icons') do
@@ -7,14 +7,20 @@ module Motor
7
7
  helper_method :current_user
8
8
 
9
9
  def index
10
- Motor.reload! if Motor.development?
11
-
12
- Motor::Configs::SyncFromFile.call
10
+ render_ui
11
+ end
13
12
 
14
- render :show
13
+ def new
14
+ render_ui
15
15
  end
16
16
 
17
17
  def show
18
+ render_ui
19
+ end
20
+
21
+ private
22
+
23
+ def render_ui
18
24
  Motor.reload! if Motor.development?
19
25
 
20
26
  Motor::Configs::SyncFromFile.call
@@ -11,6 +11,7 @@ module Motor
11
11
  has_many :taggable_tags, as: :taggable, dependent: :destroy
12
12
  has_many :tags, through: :taggable_tags, class_name: 'Motor::Tag'
13
13
 
14
+ attribute :preferences, default: -> { HashWithIndifferentAccess.new }
14
15
  serialize :preferences, HashSerializer
15
16
 
16
17
  scope :active, -> { where(deleted_at: nil) }
@@ -9,6 +9,7 @@ module Motor
9
9
  has_many :taggable_tags, as: :taggable, dependent: :destroy
10
10
  has_many :tags, through: :taggable_tags, class_name: 'Motor::Tag'
11
11
 
12
+ attribute :preferences, default: -> { HashWithIndifferentAccess.new }
12
13
  serialize :preferences, HashSerializer
13
14
 
14
15
  scope :active, -> { where(deleted_at: nil) }
@@ -9,6 +9,7 @@ module Motor
9
9
  has_many :taggable_tags, as: :taggable, dependent: :destroy
10
10
  has_many :tags, through: :taggable_tags, class_name: 'Motor::Tag'
11
11
 
12
+ attribute :preferences, default: -> { HashWithIndifferentAccess.new }
12
13
  serialize :preferences, HashSerializer
13
14
 
14
15
  scope :active, -> { where(deleted_at: nil) }
@@ -10,6 +10,7 @@ module Motor
10
10
  has_many :tags, through: :taggable_tags, class_name: 'Motor::Tag'
11
11
  has_many :alerts, dependent: :destroy
12
12
 
13
+ attribute :preferences, default: -> { HashWithIndifferentAccess.new }
13
14
  serialize :preferences, HashSerializer
14
15
 
15
16
  scope :active, -> { where(deleted_at: nil) }
@@ -4,6 +4,7 @@ module Motor
4
4
  class Resource < ::Motor::ApplicationRecord
5
5
  audited
6
6
 
7
+ attribute :preferences, default: -> { HashWithIndifferentAccess.new }
7
8
  serialize :preferences, HashSerializer
8
9
  end
9
10
  end
data/config/routes.rb CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Motor::Admin.routes.draw do
4
4
  namespace :motor, path: '' do
5
- scope 'api', as: 'api' do
5
+ scope 'api', as: :api do
6
6
  resources :run_queries, only: %i[show create]
7
7
  resources :send_alerts, only: %i[create]
8
8
  resources :queries, only: %i[index show create update destroy]
@@ -34,16 +34,15 @@ Motor::Admin.routes.draw do
34
34
 
35
35
  get '/', to: 'ui#show'
36
36
 
37
- scope as: 'ui' do
37
+ scope as: :ui do
38
+ get '/data(/*path)', to: 'ui#index', as: :data
39
+
38
40
  with_options controller: 'ui' do
39
- resources :data, only: %i[index show],
40
- param: 'path',
41
- constraints: { path: /.+/ }
42
41
  resources :reports, only: %i[index show]
43
- resources :queries, only: %i[index show]
44
- resources :dashboards, only: %i[index show]
45
- resources :alerts, only: %i[index show]
46
- resources :forms, only: %i[index show]
42
+ resources :queries, only: %i[index show new]
43
+ resources :dashboards, only: %i[index show new]
44
+ resources :alerts, only: %i[index show new]
45
+ resources :forms, only: %i[index show new]
47
46
  end
48
47
  end
49
48
  end
@@ -1,62 +1,65 @@
1
1
  class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
2
2
  def self.up
3
3
  create_table :motor_queries do |t|
4
- t.column :name, :string, null: false
5
- t.column :description, :string
6
- t.column :sql_body, :string, null: false
7
- t.column :preferences, :string, null: false, default: '{}'
8
- t.column :author_id, :integer
9
- t.column :author_type, :string
4
+ t.column :name, :text, null: false
5
+ t.column :description, :text
6
+ t.column :sql_body, :text, null: false
7
+ t.column :preferences, :text, null: false
8
+ t.column :author_id, :bigint
9
+ t.column :author_type, :text
10
10
  t.column :deleted_at, :datetime
11
11
 
12
12
  t.timestamps
13
13
 
14
14
  t.index :updated_at
15
- t.index 'lower(name)',
16
- name: 'motor_queries_lower_name_unique_index',
15
+ t.index 'name',
16
+ name: 'motor_queries_name_unique_index',
17
17
  unique: true,
18
- where: 'deleted_at IS NULL'
18
+ where: 'deleted_at IS NULL',
19
+ length: { name: 255 }
19
20
  end
20
21
 
21
22
  create_table :motor_dashboards do |t|
22
- t.column :title, :string, null: false
23
- t.column :description, :string
24
- t.column :preferences, :string, null: false, default: '{}'
25
- t.column :author_id, :integer
26
- t.column :author_type, :string
23
+ t.column :title, :text, null: false
24
+ t.column :description, :text
25
+ t.column :preferences, :text, null: false
26
+ t.column :author_id, :bigint
27
+ t.column :author_type, :text
27
28
  t.column :deleted_at, :datetime
28
29
 
29
30
  t.timestamps
30
31
 
31
32
  t.index :updated_at
32
- t.index 'lower(title)',
33
- name: 'motor_dashboards_lower_title_unique_index',
33
+ t.index 'title',
34
+ name: 'motor_dashboards_title_unique_index',
34
35
  unique: true,
35
- where: 'deleted_at IS NULL'
36
+ where: 'deleted_at IS NULL',
37
+ length: { title: 255 }
36
38
  end
37
39
 
38
40
  create_table :motor_forms do |t|
39
- t.column :name, :string, null: false
40
- t.column :description, :string
41
- t.column :api_path, :string, null: false
42
- t.column :http_method, :string, null: false
43
- t.column :preferences, :string, null: false, default: '{}'
44
- t.column :author_id, :integer
45
- t.column :author_type, :string
41
+ t.column :name, :text, null: false
42
+ t.column :description, :text
43
+ t.column :api_path, :text, null: false
44
+ t.column :http_method, :text, null: false
45
+ t.column :preferences, :text, null: false
46
+ t.column :author_id, :bigint
47
+ t.column :author_type, :text
46
48
  t.column :deleted_at, :datetime
47
49
 
48
50
  t.timestamps
49
51
 
50
52
  t.index :updated_at
51
- t.index 'lower(name)',
52
- name: 'motor_forms_lower_name_unique_index',
53
+ t.index 'name',
54
+ name: 'motor_forms_name_unique_index',
53
55
  unique: true,
54
- where: 'deleted_at IS NULL'
56
+ where: 'deleted_at IS NULL',
57
+ length: { name: 255 }
55
58
  end
56
59
 
57
60
  create_table :motor_resources do |t|
58
- t.column :name, :string, null: false, index: { unique: true }
59
- t.column :preferences, :string, null: false, default: '{}'
61
+ t.column :name, :text, null: false, index: { unique: true, length: 255 }
62
+ t.column :preferences, :text, null: false
60
63
 
61
64
  t.timestamps
62
65
 
@@ -64,8 +67,8 @@ class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Mi
64
67
  end
65
68
 
66
69
  create_table :motor_configs do |t|
67
- t.column :key, :string, null: false, index: { unique: true }
68
- t.column :value, :string, null: false, default: '{}'
70
+ t.column :key, :text, null: false, index: { unique: true, length: 255 }
71
+ t.column :value, :text, null: false
69
72
 
70
73
  t.timestamps
71
74
 
@@ -74,74 +77,80 @@ class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Mi
74
77
 
75
78
  create_table :motor_alerts do |t|
76
79
  t.references :query, null: false, foreign_key: { to_table: :motor_queries }, index: true
77
- t.column :name, :string, null: false
78
- t.column :description, :string
79
- t.column :to_emails, :string, null: false
80
+ t.column :name, :text, null: false
81
+ t.column :description, :text
82
+ t.column :to_emails, :text, null: false
80
83
  t.column :is_enabled, :boolean, null: false, default: true
81
- t.column :preferences, :string, null: false, default: '{}'
82
- t.column :author_id, :integer
83
- t.column :author_type, :string
84
+ t.column :preferences, :text, null: false
85
+ t.column :author_id, :bigint
86
+ t.column :author_type, :text
84
87
  t.column :deleted_at, :datetime
85
88
 
86
89
  t.timestamps
87
90
 
88
91
  t.index :updated_at
89
- t.index 'lower(name)',
90
- name: 'motor_alerts_lower_name_unique_index',
92
+ t.index 'name',
93
+ name: 'motor_alerts_name_unique_index',
91
94
  unique: true,
92
- where: 'deleted_at IS NULL'
95
+ where: 'deleted_at IS NULL',
96
+ length: { name: 255 }
93
97
  end
94
98
 
95
99
  create_table :motor_alert_locks do |t|
96
100
  t.references :alert, null: false, foreign_key: { to_table: :motor_alerts }
97
- t.column :lock_timestamp, :string, null: false
101
+ t.column :lock_timestamp, :text, null: false
98
102
 
99
103
  t.timestamps
100
104
 
101
- t.index %i[alert_id lock_timestamp], unique: true
105
+ t.index %i[alert_id lock_timestamp], unique: true, length: { lock_timestamp: 255 }
102
106
  end
103
107
 
104
108
  create_table :motor_tags do |t|
105
- t.column :name, :string, null: false
109
+ t.column :name, :text, null: false
106
110
 
107
111
  t.timestamps
108
112
 
109
- t.index 'lower(name)',
110
- name: 'motor_tags_lower_name_unique_index',
111
- unique: true
113
+ t.index 'name',
114
+ name: 'motor_tags_name_unique_index',
115
+ unique: true,
116
+ length: { name: 255 }
112
117
  end
113
118
 
114
119
  create_table :motor_taggable_tags do |t|
115
120
  t.references :tag, null: false, foreign_key: { to_table: :motor_tags }, index: true
116
- t.column :taggable_id, :integer, null: false
117
- t.column :taggable_type, :string, null: false
121
+ t.column :taggable_id, :bigint, null: false
122
+ t.column :taggable_type, :text, null: false
118
123
 
119
124
  t.index %i[taggable_id taggable_type tag_id],
120
125
  name: 'motor_polymorphic_association_tag_index',
121
- unique: true
126
+ unique: true,
127
+ length: { taggable_type: 255 }
122
128
  end
123
129
 
124
130
  create_table :motor_audits do |t|
125
- t.column :auditable_id, :integer
126
- t.column :auditable_type, :string
127
- t.column :associated_id, :integer
128
- t.column :associated_type, :string
129
- t.column :user_id, :integer
130
- t.column :user_type, :string
131
- t.column :username, :string
132
- t.column :action, :string
131
+ t.column :auditable_id, :bigint
132
+ t.column :auditable_type, :text
133
+ t.column :associated_id, :bigint
134
+ t.column :associated_type, :text
135
+ t.column :user_id, :bigint
136
+ t.column :user_type, :text
137
+ t.column :username, :text
138
+ t.column :action, :text
133
139
  t.column :audited_changes, :text
134
- t.column :version, :integer, default: 0
135
- t.column :comment, :string
136
- t.column :remote_address, :string
137
- t.column :request_uuid, :string
140
+ t.column :version, :bigint, default: 0
141
+ t.column :comment, :text
142
+ t.column :remote_address, :text
143
+ t.column :request_uuid, :text
138
144
  t.column :created_at, :datetime
139
145
  end
140
146
 
141
- add_index :motor_audits, %i[auditable_type auditable_id version], name: 'motor_auditable_index'
142
- add_index :motor_audits, %i[associated_type associated_id], name: 'motor_auditable_associated_index'
143
- add_index :motor_audits, %i[user_id user_type], name: 'motor_auditable_user_index'
144
- add_index :motor_audits, :request_uuid
147
+ add_index :motor_audits, %i[auditable_type auditable_id version], name: 'motor_auditable_index',
148
+ length: { auditable_type: 255 }
149
+ add_index :motor_audits, %i[associated_type associated_id], name: 'motor_auditable_associated_index',
150
+ length: { associated_type: 255 }
151
+ add_index :motor_audits, %i[user_id user_type], name: 'motor_auditable_user_index',
152
+ length: { user_type: 255 }
153
+ add_index :motor_audits, :request_uuid, length: { request_uuid: 255 }
145
154
  add_index :motor_audits, :created_at
146
155
  end
147
156
 
data/lib/motor.rb CHANGED
@@ -40,7 +40,6 @@ module Motor
40
40
  (defined?(::Puma) && File.basename($PROGRAM_NAME) == 'puma') ||
41
41
  defined?(::Unicorn::HttpServer) ||
42
42
  defined?(::Mongrel::HttpServer) ||
43
- defined?(::WEBrick::VERSION) ||
44
43
  defined?(JRuby::Rack::VERSION) ||
45
44
  defined?(::Trinidad::Server)
46
45
  end
@@ -1,6 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ActiveRecordUtils
3
+ module Motor
4
+ module ActiveRecordUtils
5
+ module_function
6
+
7
+ def reset_id_sequence!(model)
8
+ case ActiveRecord::Base.connection.class.name
9
+ when 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter'
10
+ ActiveRecord::Base.connection.reset_pk_sequence!(model.table_name)
11
+ else
12
+ ActiveRecord::Base.connection.reset_sequence!(model.table_name, 'id')
13
+ end
14
+ end
15
+ end
4
16
  end
5
17
 
6
18
  require_relative './active_record_utils/types'
@@ -28,7 +28,7 @@ module Motor
28
28
  end
29
29
 
30
30
  def create_from_params!(params, current_user = nil)
31
- raise NameAlreadyExists if Alert.exists?(['lower(name) = ?', params[:name].to_s.downcase])
31
+ raise NameAlreadyExists if Alert.exists?(name: params[:name])
32
32
 
33
33
  alert = build_from_params(params, current_user)
34
34
 
@@ -77,7 +77,7 @@ module Motor
77
77
  end
78
78
 
79
79
  def archive_with_existing_name(alert)
80
- Motor::Alert.where(['lower(name) = ? AND id != ?', alert.name.to_s.downcase, alert.id])
80
+ Motor::Alert.where(['name = ? AND id != ?', alert.name, alert.id])
81
81
  .update_all(deleted_at: Time.current)
82
82
  end
83
83
 
@@ -87,9 +87,9 @@ module Motor
87
87
 
88
88
  def name_already_exists?(alert)
89
89
  if alert.new_record?
90
- Alert.exists?(['lower(name) = ?', alert.name.to_s.downcase])
90
+ Alert.exists?(name: alert.name)
91
91
  else
92
- Alert.exists?(['lower(name) = ? AND id != ?', alert.name.to_s.downcase, alert.id])
92
+ Alert.exists?(['name = ? AND id != ?', alert.name, alert.id])
93
93
  end
94
94
  end
95
95
  end
@@ -3,7 +3,8 @@
3
3
  module Motor
4
4
  module Alerts
5
5
  module ScheduledAlertsCache
6
- CACHE_STORE = ActiveSupport::Cache::MemoryStore.new(size: 5.megabytes)
6
+ CACHE_STORE = ActiveSupport::Cache::MemoryStore.new(size: 5.megabytes,
7
+ coder: ActiveSupport::Cache::NullCoder)
7
8
 
8
9
  module_function
9
10
 
@@ -3,7 +3,7 @@
3
3
  module Motor
4
4
  module Alerts
5
5
  module Scheduler
6
- SCHEDULER_INTERVAL = 10.seconds
6
+ SCHEDULER_INTERVAL = 1.minute
7
7
  CHECK_BEHIND_DURATION = 15.minutes
8
8
 
9
9
  SCHEDULER_TASK = Concurrent::TimerTask.new(
@@ -10,12 +10,12 @@ module Motor
10
10
 
11
11
  rel = rel.preload_associations_lazily if rel.is_a?(ActiveRecord::Relation)
12
12
 
13
- json_params = {}
13
+ json_params = {}.with_indifferent_access
14
14
 
15
15
  assign_include_params(json_params, rel, params)
16
16
  assign_fields_params(json_params, rel, params)
17
17
 
18
- rel.as_json(json_params.with_indifferent_access)
18
+ rel.as_json(json_params)
19
19
  end
20
20
 
21
21
  def assign_include_params(json_params, _rel, api_params)
@@ -51,11 +51,11 @@ module Motor
51
51
  params[:fields].each do |key, fields|
52
52
  fields = fields.split(',') if fields.is_a?(String)
53
53
 
54
- merge_fields_params!(key, fields, json_params, model)
54
+ merge_fields_params!(json_params, key, fields, model)
55
55
  end
56
56
  end
57
57
 
58
- def merge_fields_params!(key, fields, json_params, model)
58
+ def merge_fields_params!(json_params, key, fields, model)
59
59
  model_name = model.name.underscore
60
60
 
61
61
  if key == model_name || model_name.split('/').last == key
@@ -11,6 +11,7 @@ module Motor
11
11
  params ||= {}
12
12
 
13
13
  rel = rel.limit([MAX_PER_PAGE, (params[:limit] || MAX_PER_PAGE).to_i].min)
14
+
14
15
  rel.offset(params[:offset].to_i)
15
16
  end
16
17
  end
@@ -12,6 +12,8 @@ module Motor
12
12
  models.map do |model|
13
13
  Object.const_get(model.name)
14
14
 
15
+ next unless ActiveRecord::Base.connection.table_exists?(model.table_name)
16
+
15
17
  schema = build_model_schema(model)
16
18
 
17
19
  if model.respond_to?(:devise_modules)
@@ -20,7 +22,7 @@ module Motor
20
22
 
21
23
  schema
22
24
  rescue StandardError, NotImplementedError => e
23
- Rails.logger.error(e) if model.name != 'Audited::Audit'
25
+ Rails.logger.error(e)
24
26
 
25
27
  next
26
28
  end.compact
@@ -34,6 +36,7 @@ module Motor
34
36
  models -= Motor::ApplicationRecord.descendants
35
37
  models -= [Motor::Audit]
36
38
  models -= [ActiveRecord::SchemaMigration] if defined?(ActiveRecord::SchemaMigration)
39
+ models -= [ActiveRecord::InternalMetadata] if defined?(ActiveRecord::InternalMetadata)
37
40
  models -= [ActiveStorage::Blob] if defined?(ActiveStorage::Blob)
38
41
  models -= [ActiveStorage::VariantRecord] if defined?(ActiveStorage::VariantRecord)
39
42
 
@@ -101,7 +104,7 @@ module Motor
101
104
  name: column.name,
102
105
  display_name: Utils.humanize_column_name(column.name),
103
106
  column_type: is_enum ? 'string' : UNIFIED_TYPES[column.type.to_s] || column.type.to_s,
104
- is_array: column.array?,
107
+ is_array: column.respond_to?(:array?) && column.array?,
105
108
  access_type: COLUMN_NAME_ACCESS_TYPES.fetch(column.name, ColumnAccessTypes::READ_WRITE),
106
109
  default_value: default_attrs[column.name],
107
110
  validators: fetch_validators(model, column.name),
@@ -7,7 +7,8 @@ module Motor
7
7
  if Motor.development?
8
8
  ActiveSupport::Cache::NullStore.new
9
9
  else
10
- ActiveSupport::Cache::MemoryStore.new(size: 5.megabytes)
10
+ ActiveSupport::Cache::MemoryStore.new(size: 5.megabytes,
11
+ coder: ActiveSupport::Cache::NullCoder)
11
12
  end
12
13
 
13
14
  module_function
@@ -3,7 +3,8 @@
3
3
  module Motor
4
4
  module Configs
5
5
  module LoadFromCache
6
- CACHE_STORE = ActiveSupport::Cache::MemoryStore.new(size: 10.megabytes)
6
+ CACHE_STORE = ActiveSupport::Cache::MemoryStore.new(size: 10.megabytes,
7
+ coder: ActiveSupport::Cache::NullCoder)
7
8
 
8
9
  module_function
9
10
 
@@ -63,18 +64,22 @@ module Motor
63
64
  end
64
65
 
65
66
  def load_cache_keys
66
- ActiveRecord::Base.connection.execute(
67
- "(#{
68
- [
69
- Motor::Config.select("'configs', MAX(updated_at)").to_sql,
70
- Motor::Resource.select("'resources', MAX(updated_at)").to_sql,
71
- Motor::Dashboard.select("'dashboards', MAX(updated_at)").to_sql,
72
- Motor::Alert.select("'alerts', MAX(updated_at)").to_sql,
73
- Motor::Query.select("'queries', MAX(updated_at)").to_sql,
74
- Motor::Form.select("'forms', MAX(updated_at)").to_sql
75
- ].join(') UNION (')
76
- })"
77
- ).to_a.map(&:values).to_h.with_indifferent_access
67
+ result = ActiveRecord::Base.connection.execute(cache_keys_sql).to_a
68
+
69
+ result = result.map(&:values) if result.first.is_a?(Hash)
70
+
71
+ result.to_h.with_indifferent_access
72
+ end
73
+
74
+ def cache_keys_sql
75
+ [
76
+ Motor::Config.select("'configs', MAX(updated_at)").to_sql,
77
+ Motor::Resource.select("'resources', MAX(updated_at)").to_sql,
78
+ Motor::Dashboard.select("'dashboards', MAX(updated_at)").to_sql,
79
+ Motor::Alert.select("'alerts', MAX(updated_at)").to_sql,
80
+ Motor::Query.select("'queries', MAX(updated_at)").to_sql,
81
+ Motor::Form.select("'forms', MAX(updated_at)").to_sql
82
+ ].join(' UNION ')
78
83
  end
79
84
  end
80
85
  end
@@ -87,7 +87,7 @@ module Motor
87
87
 
88
88
  archive_taggable_items(records - processed_records, configs_timestamp)
89
89
 
90
- ActiveRecord::Base.connection.reset_pk_sequence!(records.klass.table_name)
90
+ ActiveRecordUtils.reset_id_sequence!(records.klass)
91
91
  end
92
92
 
93
93
  def update_taggable_items(records, config_items, update_proc)
@@ -9,6 +9,7 @@ module Motor
9
9
  module_function
10
10
 
11
11
  def call
12
+ return if Rails.env.test?
12
13
  return if THREAD_POOL.queue_length.positive?
13
14
 
14
15
  THREAD_POOL.post do
@@ -16,7 +16,7 @@ module Motor
16
16
  end
17
17
 
18
18
  def create_from_params!(params, current_user = nil)
19
- raise TitleAlreadyExists if Dashboard.exists?(['lower(title) = ?', params[:title].to_s.downcase])
19
+ raise TitleAlreadyExists if Dashboard.exists?(title: params[:title])
20
20
 
21
21
  dashboard = build_from_params(params, current_user)
22
22
 
@@ -57,15 +57,15 @@ module Motor
57
57
  end
58
58
 
59
59
  def archive_with_existing_name(dashboard)
60
- Motor::Dashboard.where(['lower(title) = ? AND id != ?', dashboard.title.to_s.downcase, dashboard.id])
60
+ Motor::Dashboard.where(['title = ? AND id != ?', dashboard.title, dashboard.id])
61
61
  .update_all(deleted_at: Time.current)
62
62
  end
63
63
 
64
64
  def title_already_exists?(dashboard)
65
65
  if dashboard.new_record?
66
- Motor::Dashboard.exists?(['lower(title) = ?', dashboard.title.to_s.downcase])
66
+ Motor::Dashboard.exists?(title: dashboard.title)
67
67
  else
68
- Motor::Dashboard.exists?(['lower(title) = ? AND id != ?', dashboard.title.to_s.downcase, dashboard.id])
68
+ Motor::Dashboard.exists?(['title = ? AND id != ?', dashboard.title, dashboard.id])
69
69
  end
70
70
  end
71
71
  end
@@ -16,7 +16,7 @@ module Motor
16
16
  end
17
17
 
18
18
  def create_from_params!(params, current_user = nil)
19
- raise NameAlreadyExists if Form.exists?(['lower(name) = ?', params[:name].to_s.downcase])
19
+ raise NameAlreadyExists if Form.exists?(name: params[:name])
20
20
 
21
21
  form = build_from_params(params, current_user)
22
22
 
@@ -57,15 +57,15 @@ module Motor
57
57
  end
58
58
 
59
59
  def archive_with_existing_name(form)
60
- Motor::Form.where(['lower(name) = ? AND id != ?', form.name.to_s.downcase, form.id])
60
+ Motor::Form.where(['name = ? AND id != ?', form.name, form.id])
61
61
  .update_all(deleted_at: Time.current)
62
62
  end
63
63
 
64
64
  def name_already_exists?(form)
65
65
  if form.new_record?
66
- Motor::Form.exists?(['lower(name) = ?', form.name.to_s.downcase])
66
+ Motor::Form.exists?(['name = ?', form.name])
67
67
  else
68
- Motor::Form.exists?(['lower(name) = ? AND id != ?', form.name.to_s.downcase, form.id])
68
+ Motor::Form.exists?(['name = ? AND id != ?', form.name, form.id])
69
69
  end
70
70
  end
71
71
  end
@@ -16,7 +16,7 @@ module Motor
16
16
  end
17
17
 
18
18
  def create_from_params!(params, current_user = nil)
19
- raise NameAlreadyExists if Query.exists?(['lower(name) = ?', params[:name].to_s.downcase])
19
+ raise NameAlreadyExists if Query.exists?(name: params[:name])
20
20
 
21
21
  query = build_from_params(params, current_user)
22
22
 
@@ -57,15 +57,15 @@ module Motor
57
57
  end
58
58
 
59
59
  def archive_with_existing_name(query)
60
- Motor::Query.where(['lower(name) = ? AND id != ?', query.name.to_s.downcase, query.id])
60
+ Motor::Query.where(['name = ? AND id != ?', query.name, query.id])
61
61
  .update_all(deleted_at: Time.current)
62
62
  end
63
63
 
64
64
  def name_already_exists?(query)
65
65
  if query.new_record?
66
- Query.exists?(['lower(name) = ?', query.name.to_s.downcase])
66
+ Query.exists?(name: query.name)
67
67
  else
68
- Query.exists?(['lower(name) = ? AND id != ?', query.name.to_s.downcase, query.id])
68
+ Query.exists?(['name = ? AND id != ?', query.name, query.id])
69
69
  end
70
70
  end
71
71
  end
@@ -35,8 +35,8 @@ module Motor
35
35
 
36
36
  ActiveRecord::Base.transaction do
37
37
  result =
38
- case ActiveRecord::Base.connection
39
- when ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
38
+ case ActiveRecord::Base.connection.class.name
39
+ when 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter'
40
40
  PostgresqlExecQuery.call(ActiveRecord::Base.connection, statement)
41
41
  else
42
42
  ActiveRecord::Base.connection.exec_query(*statement)
data/lib/motor/tags.rb CHANGED
@@ -10,7 +10,7 @@ module Motor
10
10
  tags.each do |tag_name|
11
11
  next if taggable.taggable_tags.find { |tt| tt.tag.name.casecmp(tag_name).zero? }
12
12
 
13
- tag = Tag.where('lower(name) = ?', tag_name.downcase).take || Tag.new(name: tag_name)
13
+ tag = Tag.find_or_initialize_by(name: tag_name)
14
14
 
15
15
  taggable.taggable_tags.new(tag: tag)
16
16
  end
data/lib/motor/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Motor
4
- VERSION = '0.1.49'
4
+ VERSION = '0.1.50'
5
5
  end
@@ -2068,11 +2068,11 @@
2068
2068
  "mail-opened.svg": "icons/mail-opened.svg",
2069
2069
  "mail.svg": "icons/mail.svg",
2070
2070
  "mailbox.svg": "icons/mailbox.svg",
2071
- "main-918b506ecd64910a5845.css.gz": "main-918b506ecd64910a5845.css.gz",
2072
- "main-918b506ecd64910a5845.js.LICENSE.txt": "main-918b506ecd64910a5845.js.LICENSE.txt",
2073
- "main-918b506ecd64910a5845.js.gz": "main-918b506ecd64910a5845.js.gz",
2074
- "main.css": "main-918b506ecd64910a5845.css",
2075
- "main.js": "main-918b506ecd64910a5845.js",
2071
+ "main-55914a490baf8f7eba59.css.gz": "main-55914a490baf8f7eba59.css.gz",
2072
+ "main-55914a490baf8f7eba59.js.LICENSE.txt": "main-55914a490baf8f7eba59.js.LICENSE.txt",
2073
+ "main-55914a490baf8f7eba59.js.gz": "main-55914a490baf8f7eba59.js.gz",
2074
+ "main.css": "main-55914a490baf8f7eba59.css",
2075
+ "main.js": "main-55914a490baf8f7eba59.js",
2076
2076
  "man.svg": "icons/man.svg",
2077
2077
  "manual-gearbox.svg": "icons/manual-gearbox.svg",
2078
2078
  "map-2.svg": "icons/map-2.svg",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: motor-admin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.49
4
+ version: 0.1.50
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pete Matsyburka
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-25 00:00:00.000000000 Z
11
+ date: 2021-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord-filter
@@ -1481,8 +1481,8 @@ files:
1481
1481
  - ui/dist/icons/zoom-money.svg.gz
1482
1482
  - ui/dist/icons/zoom-out.svg.gz
1483
1483
  - ui/dist/icons/zoom-question.svg.gz
1484
- - ui/dist/main-918b506ecd64910a5845.css.gz
1485
- - ui/dist/main-918b506ecd64910a5845.js.gz
1484
+ - ui/dist/main-55914a490baf8f7eba59.css.gz
1485
+ - ui/dist/main-55914a490baf8f7eba59.js.gz
1486
1486
  - ui/dist/manifest.json
1487
1487
  homepage:
1488
1488
  licenses: