biovision 0.0.200518.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +214 -0
- data/Rakefile +22 -0
- data/app/assets/config/biovision_manifest.js +1 -0
- data/app/assets/images/biovision/components/carousel/arrow-left.svg +4 -0
- data/app/assets/images/biovision/components/carousel/arrow-right.svg +4 -0
- data/app/assets/images/biovision/icons/breadcrumb-hover.svg +1 -0
- data/app/assets/images/biovision/icons/breadcrumb.svg +1 -0
- data/app/assets/images/biovision/icons/components/contact.svg +26 -0
- data/app/assets/images/biovision/icons/components/content.svg +20 -0
- data/app/assets/images/biovision/icons/components/users.svg +21 -0
- data/app/assets/images/biovision/icons/key.svg +16 -0
- data/app/assets/images/biovision/icons/log_in.svg +15 -0
- data/app/assets/images/biovision/icons/log_out.svg +15 -0
- data/app/assets/images/biovision/icons/messages/error.svg +14 -0
- data/app/assets/images/biovision/icons/messages/info.svg +8 -0
- data/app/assets/images/biovision/icons/messages/success.svg +12 -0
- data/app/assets/images/biovision/icons/messages/warning.svg +13 -0
- data/app/assets/images/biovision/icons/settings.svg +41 -0
- data/app/assets/images/biovision/placeholders/16x9.svg +11 -0
- data/app/assets/images/biovision/placeholders/1x1.svg +11 -0
- data/app/assets/images/biovision/placeholders/3x2.svg +11 -0
- data/app/assets/images/biovision/placeholders/user.svg +15 -0
- data/app/assets/stylesheets/biovision/admin.scss +6 -0
- data/app/assets/stylesheets/biovision/admin/components.scss +59 -0
- data/app/assets/stylesheets/biovision/admin/default.scss +57 -0
- data/app/assets/stylesheets/biovision/admin/layout.scss +95 -0
- data/app/assets/stylesheets/biovision/admin/vars.scss +56 -0
- data/app/assets/stylesheets/biovision/biovision.scss +134 -0
- data/app/assets/stylesheets/biovision/biovision/messages.scss +41 -0
- data/app/assets/stylesheets/biovision/components/carousel.scss +53 -0
- data/app/assets/stylesheets/biovision/components/forms.scss +85 -0
- data/app/assets/stylesheets/biovision/components/hamburger.scss +56 -0
- data/app/assets/stylesheets/biovision/components/lists.scss +91 -0
- data/app/assets/stylesheets/biovision/default.scss +57 -0
- data/app/assets/stylesheets/biovision/themes/default_theme.scss +2 -0
- data/app/assets/stylesheets/biovision/themes/default_theme/components.scss +3 -0
- data/app/assets/stylesheets/biovision/themes/default_theme/layout.scss +44 -0
- data/app/assets/stylesheets/biovision/themes/default_theme/layout/footer.scss +0 -0
- data/app/assets/stylesheets/biovision/themes/default_theme/layout/header.scss +39 -0
- data/app/assets/stylesheets/biovision/vars.scss +53 -0
- data/app/controllers/admin/agents_controller.rb +15 -0
- data/app/controllers/admin/components_controller.rb +174 -0
- data/app/controllers/admin/index_controller.rb +11 -0
- data/app/controllers/admin/ip_addresses_controller.rb +15 -0
- data/app/controllers/admin_controller.rb +14 -0
- data/app/controllers/authentication_controller.rb +79 -0
- data/app/controllers/concerns/authentication.rb +45 -0
- data/app/controllers/index_controller.rb +8 -0
- data/app/controllers/my/confirmations_controller.rb +2 -0
- data/app/controllers/my/index_controller.rb +8 -0
- data/app/controllers/my/profiles_controller.rb +128 -0
- data/app/controllers/my/recoveries_controller.rb +2 -0
- data/app/helpers/biovision_components_helper.rb +14 -0
- data/app/helpers/users_helper.rb +11 -0
- data/app/lib/biovision/components/base_component.rb +177 -0
- data/app/lib/biovision/components/component_settings.rb +30 -0
- data/app/lib/biovision/components/privilege_handler.rb +77 -0
- data/app/lib/biovision/components/track_component.rb +9 -0
- data/app/lib/biovision/components/users/authentication.rb +47 -0
- data/app/lib/biovision/components/users/code_handler.rb +23 -0
- data/app/lib/biovision/components/users/profile_handler.rb +12 -0
- data/app/lib/biovision/components/users/registration_handler.rb +99 -0
- data/app/lib/biovision/components/users_component.rb +47 -0
- data/app/lib/biovision/notifiers/base_notifier.rb +69 -0
- data/app/lib/biovision/notifiers/socialization_notifier.rb +31 -0
- data/app/lib/biovision/notifiers/users_notifier.rb +15 -0
- data/app/models/agent.rb +35 -0
- data/app/models/biovision_component.rb +45 -0
- data/app/models/biovision_component_user.rb +21 -0
- data/app/models/browser.rb +34 -0
- data/app/models/code.rb +71 -0
- data/app/models/concerns/checkable.rb +22 -0
- data/app/models/concerns/flat_priority.rb +50 -0
- data/app/models/concerns/has_language.rb +10 -0
- data/app/models/concerns/has_owner.rb +22 -0
- data/app/models/concerns/has_simple_image.rb +18 -0
- data/app/models/concerns/has_track.rb +10 -0
- data/app/models/concerns/has_uuid.rb +12 -0
- data/app/models/concerns/meta_texts.rb +16 -0
- data/app/models/concerns/nested_priority.rb +58 -0
- data/app/models/concerns/required_unique_name.rb +16 -0
- data/app/models/concerns/required_unique_slug.rb +15 -0
- data/app/models/concerns/toggleable.rb +33 -0
- data/app/models/foreign_site.rb +34 -0
- data/app/models/foreign_user.rb +21 -0
- data/app/models/ip_address.rb +31 -0
- data/app/models/language.rb +31 -0
- data/app/models/login_attempt.rb +35 -0
- data/app/models/metric.rb +48 -0
- data/app/models/metric_value.rb +11 -0
- data/app/models/notification.rb +37 -0
- data/app/models/simple_image.rb +47 -0
- data/app/models/simple_image_tag.rb +30 -0
- data/app/models/simple_image_tag_image.rb +13 -0
- data/app/models/token.rb +96 -0
- data/app/models/user.rb +136 -0
- data/app/models/user_language.rb +15 -0
- data/app/uploaders/simple_image_uploader.rb +96 -0
- data/app/uploaders/user_image_uploader.rb +58 -0
- data/app/views/admin/agents/_nav_item.html.erb +6 -0
- data/app/views/admin/agents/entity/_in_list.html.erb +6 -0
- data/app/views/admin/agents/index.html.erb +13 -0
- data/app/views/admin/components/_list.html.erb +12 -0
- data/app/views/admin/components/entity/_links.html.erb +35 -0
- data/app/views/admin/components/entity/_section.html.erb +12 -0
- data/app/views/admin/components/index.html.erb +12 -0
- data/app/views/admin/components/links/_track.html.erb +2 -0
- data/app/views/admin/components/links/_users.html.erb +11 -0
- data/app/views/admin/components/privileges.html.erb +20 -0
- data/app/views/admin/components/privileges/_component_user.html.erb +17 -0
- data/app/views/admin/components/privileges/_links.html.erb +35 -0
- data/app/views/admin/components/privileges/_privilege_flag.html.erb +28 -0
- data/app/views/admin/components/privileges/_users.html.erb +23 -0
- data/app/views/admin/components/settings.html.erb +39 -0
- data/app/views/admin/components/settings/_new_parameter.html.erb +46 -0
- data/app/views/admin/components/settings/_parameters.html.erb +20 -0
- data/app/views/admin/components/settings/_setting.html.erb +18 -0
- data/app/views/admin/components/settings/_settings.html.erb +31 -0
- data/app/views/admin/components/show.html.erb +14 -0
- data/app/views/admin/index/index.html.erb +14 -0
- data/app/views/admin/ip_addresses/_nav_item.html.erb +6 -0
- data/app/views/admin/ip_addresses/entity/_in_list.html.erb +6 -0
- data/app/views/admin/ip_addresses/index.html.erb +13 -0
- data/app/views/admin/unauthorized.html.erb +19 -0
- data/app/views/authentication/_form.html.erb +40 -0
- data/app/views/authentication/failed.js.erb +3 -0
- data/app/views/authentication/new.html.erb +21 -0
- data/app/views/index/index.html.erb +0 -0
- data/app/views/layouts/admin.html.erb +23 -0
- data/app/views/layouts/admin/_breadcrumbs.html.erb +8 -0
- data/app/views/layouts/admin/_footer.html.erb +10 -0
- data/app/views/layouts/admin/_header.html.erb +18 -0
- data/app/views/layouts/admin/header/_logo.html.erb +3 -0
- data/app/views/layouts/application/_footer.html.erb +8 -0
- data/app/views/layouts/application/_header.html.erb +9 -0
- data/app/views/layouts/application/header/_authentication.html.erb +13 -0
- data/app/views/my/index/index.html.erb +0 -0
- data/app/views/my/profiles/closed.html.erb +12 -0
- data/app/views/my/profiles/new.html.erb +17 -0
- data/app/views/my/profiles/new/_form.html.erb +147 -0
- data/app/views/shared/_breadcrumbs.html.erb +8 -0
- data/app/views/shared/_cookie_notification.html.erb +4 -0
- data/app/views/shared/_flash_messages.html.erb +7 -0
- data/app/views/shared/_meta_texts.html.erb +31 -0
- data/app/views/shared/_nothing_found.html.erb +1 -0
- data/app/views/shared/_pagination.jbuilder +15 -0
- data/app/views/shared/admin/_list.html.erb +19 -0
- data/app/views/shared/admin/_list_with_priority.html.erb +19 -0
- data/app/views/shared/admin/_toggleable.html.erb +8 -0
- data/app/views/shared/entity/_list_of_errors.html.erb +7 -0
- data/app/views/shared/forms/errors.js.erb +5 -0
- data/config/initializers/carrierwave.rb +27 -0
- data/config/initializers/pluralization.rb +2 -0
- data/config/locales/biovision-ru.yml +90 -0
- data/config/locales/components-ru.yml +81 -0
- data/config/locales/track-ru.yml +40 -0
- data/config/locales/users-ru.yml +130 -0
- data/config/routes.rb +75 -0
- data/db/migrate/20191228000000_create_biovision_components.rb +72 -0
- data/db/migrate/20200224000000_create_track_component.rb +59 -0
- data/db/migrate/20200224000010_create_users_component.rb +189 -0
- data/db/migrate/20200404000000_create_simple_images.rb +54 -0
- data/lib/biovision.rb +9 -0
- data/lib/biovision/base_methods.rb +167 -0
- data/lib/biovision/engine.rb +40 -0
- data/lib/biovision/version.rb +5 -0
- data/lib/tasks/biovision_tasks.rake +4 -0
- metadata +392 -0
data/config/routes.rb
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
Rails.application.routes.draw do
|
|
4
|
+
concern :check do
|
|
5
|
+
post :check, on: :collection, defaults: { format: :json }
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
concern :toggle do
|
|
9
|
+
post :toggle, on: :member, defaults: { format: :json }
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
concern :priority do
|
|
13
|
+
post :priority, on: :member, defaults: { format: :json }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
concern :removable_image do
|
|
17
|
+
delete :image, action: :destroy_image, on: :member, defaults: { format: :json }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
concern :lock do
|
|
21
|
+
member do
|
|
22
|
+
put :lock, defaults: { format: :json }
|
|
23
|
+
delete :lock, action: :unlock, defaults: { format: :json }
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
scope '(:locale)', constraints: { locale: /ru|en/ } do
|
|
28
|
+
# Handling errors
|
|
29
|
+
match '/400' => 'errors#bad_request', via: :all
|
|
30
|
+
match '/401' => 'errors#unauthorized', via: :all
|
|
31
|
+
match '/403' => 'errors#forbidden', via: :all
|
|
32
|
+
match '/404' => 'errors#not_found', via: :all
|
|
33
|
+
match '/422' => 'errors#unprocessable_entity', via: :all
|
|
34
|
+
match '/500' => 'errors#internal_server_error', via: :all
|
|
35
|
+
|
|
36
|
+
controller :authentication do
|
|
37
|
+
get 'login' => :new
|
|
38
|
+
post 'login' => :create
|
|
39
|
+
delete 'logout' => :destroy
|
|
40
|
+
get 'auth/:provider/callback' => :auth_callback, as: :auth_callback
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
namespace :admin do
|
|
44
|
+
get '/' => 'index#index'
|
|
45
|
+
|
|
46
|
+
scope :components, controller: :components do
|
|
47
|
+
get '/' => :index, as: :components
|
|
48
|
+
scope ':slug' do
|
|
49
|
+
get '/' => :show, as: :component
|
|
50
|
+
get 'settings' => :settings, as: :component_settings
|
|
51
|
+
patch 'settings' => :update_settings, as: nil
|
|
52
|
+
patch 'parameters' => :update_parameter, as: :component_parameters
|
|
53
|
+
get 'privileges' => :privileges, as: :component_privileges
|
|
54
|
+
patch 'privileges' => :update_privileges, as: nil
|
|
55
|
+
put 'administrators/:user_id' => :add_administrator, as: :component_administrators
|
|
56
|
+
delete 'administrators/:user_id' => :remove_administrator, as: nil
|
|
57
|
+
put 'users/:user_id/privileges/:privilege_slug' => :add_privilege, as: :component_privilege
|
|
58
|
+
delete 'users/:user_id/privileges/:privilege_slug' => :remove_privilege, as: nil
|
|
59
|
+
get 'images' => :images, as: :component_images
|
|
60
|
+
post 'images' => :create_image, as: nil
|
|
61
|
+
post 'ckeditor'
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
resources :agents, :ip_addresses, only: :index
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
namespace :my do
|
|
69
|
+
get '/' => 'index#index'
|
|
70
|
+
|
|
71
|
+
resource :profile, except: :destroy, concerns: :check
|
|
72
|
+
resource :confirmation, :recovery, only: %i[show create update]
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Create tables for Biovision components and metrics
|
|
4
|
+
class CreateBiovisionComponents < ActiveRecord::Migration[6.0]
|
|
5
|
+
def up
|
|
6
|
+
create_components unless BiovisionComponent.table_exists?
|
|
7
|
+
create_metrics unless Metric.table_exists?
|
|
8
|
+
create_metric_values unless MetricValue.table_exists?
|
|
9
|
+
create_languages unless Language.table_exists?
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def down
|
|
13
|
+
drop_table :languages if Language.table_exists?
|
|
14
|
+
drop_table :metric_values if MetricValue.table_exists?
|
|
15
|
+
drop_table :metrics if Metric.table_exists?
|
|
16
|
+
drop_table :biovision_components if BiovisionComponent.table_exists?
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def create_components
|
|
22
|
+
create_table :biovision_components, comment: 'Biovision CMS components' do |t|
|
|
23
|
+
t.integer :priority, limit: 2, default: 1, null: false
|
|
24
|
+
t.boolean :active, default: true, null: false
|
|
25
|
+
t.timestamps
|
|
26
|
+
t.string :slug, null: false
|
|
27
|
+
t.jsonb :settings, default: {}, null: false
|
|
28
|
+
t.jsonb :parameters, default: {}, null: false
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
add_index :biovision_components, :slug, unique: true
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def create_metrics
|
|
35
|
+
create_table :metrics, comment: 'Component metrics' do |t|
|
|
36
|
+
t.references :biovision_component, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
37
|
+
t.timestamps
|
|
38
|
+
t.boolean :incremental, default: false, null: false
|
|
39
|
+
t.boolean :start_with_zero, default: true, null: false
|
|
40
|
+
t.boolean :show_on_dashboard, default: true, null: false
|
|
41
|
+
t.integer :default_period, limit: 2, default: 7, null: false
|
|
42
|
+
t.integer :value, default: 0, null: false
|
|
43
|
+
t.integer :previous_value, default: 0, null: false
|
|
44
|
+
t.string :name, null: false
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
add_index :metrics, %i[biovision_component_id name]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def create_metric_values
|
|
51
|
+
create_table :metric_values, comment: 'Component metric values' do |t|
|
|
52
|
+
t.references :metric, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
53
|
+
t.timestamp :time, null: false
|
|
54
|
+
t.integer :quantity, default: 1, null: false
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
execute "create index metric_values_day_idx on metric_values using btree (date_trunc('day', time));"
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def create_languages
|
|
61
|
+
create_table :languages, comment: 'Interface languages' do |t|
|
|
62
|
+
t.integer :priority, limit: 2, default: 1, null: false
|
|
63
|
+
t.boolean :active, default: true, null: false
|
|
64
|
+
t.integer :object_count, default: 0, null: false
|
|
65
|
+
t.string :slug, null: false
|
|
66
|
+
t.string :code, null: false
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
Language.create!(code: 'ru', slug: 'russian')
|
|
70
|
+
Language.create!(code: 'en', slug: 'english', active: false)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Create entry and tables for track component
|
|
4
|
+
class CreateTrackComponent < ActiveRecord::Migration[6.0]
|
|
5
|
+
def up
|
|
6
|
+
create_component
|
|
7
|
+
create_browsers unless Browser.table_exists?
|
|
8
|
+
create_agents unless Agent.table_exists?
|
|
9
|
+
create_ip_addresses unless IpAddress.table_exists?
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def down
|
|
13
|
+
drop_table :ip_addresses if IpAddress.table_exists?
|
|
14
|
+
drop_table :agents if Agent.table_exists?
|
|
15
|
+
drop_table :browsers if Browser.table_exists?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
private
|
|
19
|
+
|
|
20
|
+
def create_component
|
|
21
|
+
BiovisionComponent.create(slug: Biovision::Components::TrackComponent.slug)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def create_browsers
|
|
25
|
+
create_table :browsers, comment: 'Browsers' do |t|
|
|
26
|
+
t.boolean :mobile, default: false, null: false
|
|
27
|
+
t.boolean :banned, default: false, null: false
|
|
28
|
+
t.timestamps
|
|
29
|
+
t.integer :agents_count, default: 0, null: false
|
|
30
|
+
t.string :name, null: false
|
|
31
|
+
t.string :version, null: false
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
add_index :browsers, %i[name version], unique: true
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def create_agents
|
|
38
|
+
create_table :agents, comment: 'User agents' do |t|
|
|
39
|
+
t.references :browser, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
40
|
+
t.integer :object_count, default: 0, index: true, null: false
|
|
41
|
+
t.boolean :banned, default: false, null: false
|
|
42
|
+
t.timestamps
|
|
43
|
+
t.string :name, null: false
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
add_index :agents, :name, unique: true
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def create_ip_addresses
|
|
50
|
+
create_table :ip_addresses, comment: 'IP addresses' do |t|
|
|
51
|
+
t.inet :ip, null: false
|
|
52
|
+
t.integer :object_count, default: 0, index: true, null: false
|
|
53
|
+
t.boolean :banned, default: false, null: false
|
|
54
|
+
t.timestamps
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
add_index :ip_addresses, :ip, unique: true
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Create tables for Users component
|
|
4
|
+
class CreateUsersComponent < ActiveRecord::Migration[6.0]
|
|
5
|
+
def up
|
|
6
|
+
create_component
|
|
7
|
+
create_users unless User.table_exists?
|
|
8
|
+
create_tokens unless Token.table_exists?
|
|
9
|
+
create_login_attempts unless LoginAttempt.table_exists?
|
|
10
|
+
create_user_languages unless UserLanguage.table_exists?
|
|
11
|
+
create_foreign_sites unless ForeignSite.table_exists?
|
|
12
|
+
create_foreign_users unless ForeignUser.table_exists?
|
|
13
|
+
create_component_links unless BiovisionComponentUser.table_exists?
|
|
14
|
+
create_codes unless Code.table_exists?
|
|
15
|
+
create_notifications unless Notification.table_exists?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def down
|
|
19
|
+
drop_table :notifications if Notification.table_exists?
|
|
20
|
+
drop_table :codes if Code.table_exists?
|
|
21
|
+
drop_table :biovision_component_users if BiovisionComponentUser.table_exists?
|
|
22
|
+
drop_table :foreign_users if ForeignUser.table_exists?
|
|
23
|
+
drop_table :foreign_sites if ForeignSite.table_exists?
|
|
24
|
+
drop_table :user_languages if UserLanguage.table_exists?
|
|
25
|
+
drop_table :login_attempts if LoginAttempt.table_exists?
|
|
26
|
+
drop_table :tokens if Token.table_exists?
|
|
27
|
+
drop_table :users if User.table_exists?
|
|
28
|
+
BiovisionComponent[Biovision::Components::UsersComponent.slug]&.destroy
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def create_component
|
|
34
|
+
slug = Biovision::Components::UsersComponent.slug
|
|
35
|
+
|
|
36
|
+
settings = {
|
|
37
|
+
registration_open: true,
|
|
38
|
+
email_as_login: false,
|
|
39
|
+
confirm_email: false,
|
|
40
|
+
require_email: false,
|
|
41
|
+
invite_only: false,
|
|
42
|
+
use_invites: false,
|
|
43
|
+
invite_count: 5,
|
|
44
|
+
bounce_count: 10,
|
|
45
|
+
bounce_timeout: 15
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
BiovisionComponent.create(slug: slug, settings: settings)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def create_users
|
|
52
|
+
create_table :users, comment: 'Users' do |t|
|
|
53
|
+
t.uuid :uuid, null: false
|
|
54
|
+
t.references :language, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
55
|
+
t.references :agent, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
56
|
+
t.references :ip_address, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
57
|
+
t.timestamps
|
|
58
|
+
t.integer :primary_id, index: true
|
|
59
|
+
t.integer :inviter_id, index: true
|
|
60
|
+
t.integer :balance, default: 0, null: false
|
|
61
|
+
t.boolean :super_user, default: false, null: false
|
|
62
|
+
t.boolean :banned, default: false, null: false
|
|
63
|
+
t.boolean :bot, default: false, null: false
|
|
64
|
+
t.boolean :deleted, default: false, null: false
|
|
65
|
+
t.boolean :consent, default: false, null: false
|
|
66
|
+
t.boolean :email_confirmed, default: false, null: false
|
|
67
|
+
t.boolean :phone_confirmed, default: false, null: false
|
|
68
|
+
t.boolean :allow_mail, default: true, null: false
|
|
69
|
+
t.datetime :last_seen
|
|
70
|
+
t.date :birthday
|
|
71
|
+
t.string :slug, null: false
|
|
72
|
+
t.string :screen_name, null: false
|
|
73
|
+
t.string :password_digest, null: false
|
|
74
|
+
t.string :email, index: true
|
|
75
|
+
t.string :phone, index: true
|
|
76
|
+
t.string :image
|
|
77
|
+
t.string :notice
|
|
78
|
+
t.string :referral_link
|
|
79
|
+
t.jsonb :data, default: { profile: {} }, null: false
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
add_foreign_key :users, :users, column: :inviter_id, on_update: :cascade, on_delete: :nullify
|
|
83
|
+
add_foreign_key :users, :users, column: :primary_id, on_update: :cascade, on_delete: :nullify
|
|
84
|
+
|
|
85
|
+
add_index :users, :uuid, unique: true
|
|
86
|
+
add_index :users, :slug, unique: true
|
|
87
|
+
add_index :users, :data, using: :gin
|
|
88
|
+
add_index :users, :referral_link, unique: true
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def create_tokens
|
|
92
|
+
create_table :tokens, comment: 'Authentication tokens' do |t|
|
|
93
|
+
t.references :user, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
94
|
+
t.references :agent, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
95
|
+
t.references :ip_address, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
96
|
+
t.timestamps
|
|
97
|
+
t.datetime :last_used, index: true
|
|
98
|
+
t.boolean :active, default: true, null: false
|
|
99
|
+
t.string :token, null: false
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
add_index :tokens, :token, unique: true
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def create_login_attempts
|
|
106
|
+
create_table :login_attempts, comment: 'Failed login attempts' do |t|
|
|
107
|
+
t.references :user, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
108
|
+
t.references :agent, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
109
|
+
t.references :ip_address, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
110
|
+
t.timestamps
|
|
111
|
+
t.string :password, default: '', null: false
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def create_user_languages
|
|
116
|
+
create_table :user_languages, comment: 'Languages for users' do |t|
|
|
117
|
+
t.references :user, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
118
|
+
t.references :language, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
119
|
+
t.timestamps
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def create_foreign_sites
|
|
124
|
+
create_table :foreign_sites, comment: 'Sites for external authentication' do |t|
|
|
125
|
+
t.string :slug, null: false
|
|
126
|
+
t.string :name, null: false
|
|
127
|
+
t.integer :foreign_users_count, default: 0, null: false
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
add_index :foreign_sites, :slug, unique: true
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def create_foreign_users
|
|
134
|
+
create_table :foreign_users, comment: 'Users from external sites' do |t|
|
|
135
|
+
t.references :foreign_site, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
136
|
+
t.references :user, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
137
|
+
t.references :agent, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
138
|
+
t.references :ip_address, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
139
|
+
t.string :slug, null: false
|
|
140
|
+
t.timestamps
|
|
141
|
+
t.jsonb :data, default: {}, null: false
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
add_index :foreign_users, :data, using: :gin
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def create_component_links
|
|
148
|
+
create_table :biovision_component_users, comment: 'Privileges and settings for users in components' do |t|
|
|
149
|
+
t.references :biovision_component, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
150
|
+
t.references :user, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
151
|
+
t.boolean :administrator, default: false, null: false
|
|
152
|
+
t.timestamps
|
|
153
|
+
t.jsonb :data, default: {}, null: false
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
add_index :biovision_component_users, :data, using: :gin
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def create_codes
|
|
160
|
+
create_table :codes, comment: 'Codes for different purposes' do |t|
|
|
161
|
+
t.references :biovision_component, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
162
|
+
t.references :user, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
163
|
+
t.references :agent, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
164
|
+
t.references :ip_address, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
165
|
+
t.integer :quantity, default: 1, null: false
|
|
166
|
+
t.string :body, null: false
|
|
167
|
+
t.timestamps
|
|
168
|
+
t.jsonb :data, default: {}, null: false
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
add_index :codes, :body, unique: true
|
|
172
|
+
add_index :codes, :data, using: :gin
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def create_notifications
|
|
176
|
+
create_table :notifications, comment: 'Component notifications for users' do |t|
|
|
177
|
+
t.uuid :uuid, null: false
|
|
178
|
+
t.references :biovision_component, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
179
|
+
t.references :user, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
180
|
+
t.boolean :email_sent, default: false, null: false
|
|
181
|
+
t.boolean :read, default: false, null: false
|
|
182
|
+
t.timestamps
|
|
183
|
+
t.jsonb :data, default: {}, null: false
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
add_index :notifications, :uuid, unique: true
|
|
187
|
+
add_index :notifications, :data, using: :gin
|
|
188
|
+
end
|
|
189
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Create tables for simple images
|
|
4
|
+
class CreateSimpleImages < ActiveRecord::Migration[6.0]
|
|
5
|
+
def up
|
|
6
|
+
create_simple_images unless SimpleImage.table_exists?
|
|
7
|
+
create_tags unless SimpleImageTag.table_exists?
|
|
8
|
+
create_tag_links unless SimpleImageTagImage.table_exists?
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def down
|
|
12
|
+
drop_table :simple_image_tag_images if SimpleImageTagImage.table_exists?
|
|
13
|
+
drop_table :simple_image_tags if SimpleImageTag.table_exists?
|
|
14
|
+
drop_table :simple_images if SimpleImage.table_exists?
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
private
|
|
18
|
+
|
|
19
|
+
def create_simple_images
|
|
20
|
+
create_table :simple_images, comment: 'Universal simple images' do |t|
|
|
21
|
+
t.references :biovision_component, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
22
|
+
t.references :user, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
23
|
+
t.references :agent, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
24
|
+
t.references :ip_address, foreign_key: { on_update: :cascade, on_delete: :nullify }
|
|
25
|
+
t.uuid :uuid, null: false
|
|
26
|
+
t.timestamps
|
|
27
|
+
t.integer :object_count, default: 0, null: false
|
|
28
|
+
t.string :image
|
|
29
|
+
t.string :image_alt_text, default: '', null: false
|
|
30
|
+
t.string :caption
|
|
31
|
+
t.string :source_name
|
|
32
|
+
t.string :source_link
|
|
33
|
+
t.jsonb :data, default: {}, null: false
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
add_index :simple_images, :uuid, unique: true
|
|
37
|
+
add_index :simple_images, :data, using: :gin
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def create_tags
|
|
41
|
+
create_table :simple_image_tags, comment: 'Tags for simple images' do |t|
|
|
42
|
+
t.string :name, null: false, index: true
|
|
43
|
+
t.timestamps
|
|
44
|
+
t.integer :simple_images_count, default: 0, null: false
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def create_tag_links
|
|
49
|
+
create_table :simple_image_tag_images, comment: 'Links between simple images and tags' do |t|
|
|
50
|
+
t.references :simple_image, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
51
|
+
t.references :simple_image_tag, null: false, foreign_key: { on_update: :cascade, on_delete: :cascade }
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|