microservice 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +28 -0
- data/Rakefile +37 -0
- data/app/assets/config/microservice_manifest.js +2 -0
- data/app/assets/images/microservice/favicon.ico +0 -0
- data/app/assets/images/microservice/logo.svg +51 -0
- data/app/assets/javascripts/microservice/application.js +21 -0
- data/app/assets/javascripts/microservice/microservice.js +0 -0
- data/app/assets/stylesheets/microservice/application.css +16 -0
- data/app/assets/stylesheets/microservice/microservice.css +0 -0
- data/app/controllers/microservice/application_controller.rb +58 -0
- data/app/controllers/microservice/entities_controller.rb +138 -0
- data/app/controllers/microservice/omniauth_callbacks_controller.rb +36 -0
- data/app/controllers/microservice/welcome_controller.rb +8 -0
- data/app/helpers/microservice/application_helper.rb +216 -0
- data/app/helpers/microservice/breadcrumbs_helper.rb +89 -0
- data/app/jobs/microservice/application_job.rb +5 -0
- data/app/mailers/microservice/application_mailer.rb +13 -0
- data/app/mailers/microservice/devise_mailer.rb +13 -0
- data/app/models/microservice/concerns/entity_cloneable.rb +40 -0
- data/app/models/microservice/concerns/entity_model.rb +118 -0
- data/app/models/microservice/concerns/entity_movable.rb +27 -0
- data/app/models/microservice/concerns/entity_naming.rb +95 -0
- data/app/models/microservice/concerns/user_model.rb +36 -0
- data/app/views/layouts/microservice/application.html.erb +26 -0
- data/app/views/layouts/microservice/mailer.html.erb +13 -0
- data/app/views/layouts/microservice/mailer.text.erb +1 -0
- data/app/views/microservice/common/_no_data.html.erb +6 -0
- data/app/views/microservice/common/error.html.erb +7 -0
- data/app/views/microservice/common/error.json.jbuilder +3 -0
- data/app/views/microservice/entities/_card.html.erb +17 -0
- data/app/views/microservice/entities/_form.html.erb +0 -0
- data/app/views/microservice/entities/edit.html.erb +16 -0
- data/app/views/microservice/entities/index.html.erb +7 -0
- data/app/views/microservice/entities/new.html.erb +19 -0
- data/app/views/microservice/entities/show.html.erb +3 -0
- data/app/views/microservice/welcome/index.html.erb +1 -0
- data/config/initializers/devise.rb +270 -0
- data/config/initializers/microservice.rb +5 -0
- data/config/initializers/sso.rb +78 -0
- data/config/locales/en.yml +55 -0
- data/config/routes.rb +5 -0
- data/db/migrate/20170618202500_create_users.rb +51 -0
- data/lib/microservice.rb +27 -0
- data/lib/microservice/engine.rb +16 -0
- data/lib/microservice/settings.rb +62 -0
- data/lib/microservice/version.rb +3 -0
- data/lib/tasks/microservice_tasks.rake +4 -0
- metadata +330 -0
@@ -0,0 +1,89 @@
|
|
1
|
+
module Microservice
|
2
|
+
module BreadcrumbsHelper
|
3
|
+
|
4
|
+
def render_breadcrumb(*args)
|
5
|
+
flatten_args = args.flatten.compact
|
6
|
+
content_tag :div, class: 'ui huge breadcrumb' do
|
7
|
+
flatten_args.map.with_index do |element, idx|
|
8
|
+
if flatten_args.size == idx + 1
|
9
|
+
content_tag(:span, element.html_safe, class: 'section active')
|
10
|
+
else
|
11
|
+
content_tag(:span, element.html_safe, class: 'section') +
|
12
|
+
content_tag(:i, '', class: 'right chevron icon divider')
|
13
|
+
end
|
14
|
+
end.join.html_safe
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def render_entity_breadcrumb
|
19
|
+
if @entity
|
20
|
+
case action_name
|
21
|
+
when 'show'
|
22
|
+
render_breadcrumb_show @entity
|
23
|
+
when 'new', 'create'
|
24
|
+
render_breadcrumb_new @entity
|
25
|
+
when 'edit', 'update'
|
26
|
+
render_breadcrumb_edit @entity
|
27
|
+
end
|
28
|
+
elsif controller.entity_class
|
29
|
+
render_breadcrumb_index controller.entity_class
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def render_breadcrumb_index(entity_class)
|
34
|
+
links = [home_link(entity_class.namespace)]
|
35
|
+
|
36
|
+
if @parent_entity
|
37
|
+
links << link_to_entity(@parent_entity.class, :index, no_icon: true)
|
38
|
+
links << link_to_entity(@parent_entity, :show, no_icon: true)
|
39
|
+
end
|
40
|
+
|
41
|
+
links << link_to_entity(entity_class, :index, no_icon: true)
|
42
|
+
|
43
|
+
render_breadcrumb links
|
44
|
+
end
|
45
|
+
|
46
|
+
def render_breadcrumb_show(entity)
|
47
|
+
links = [home_link(entity.namespace)]
|
48
|
+
|
49
|
+
if @parent_entity
|
50
|
+
links << link_to_entity(@parent_entity.class, :index, no_icon: true)
|
51
|
+
links << link_to_entity(@parent_entity, :show, no_icon: true)
|
52
|
+
end
|
53
|
+
|
54
|
+
links << link_to_entity(entity.class, :index, no_icon: true)
|
55
|
+
links << link_to_entity(entity, :show, no_icon: true)
|
56
|
+
|
57
|
+
render_breadcrumb links
|
58
|
+
end
|
59
|
+
|
60
|
+
def render_breadcrumb_new(entity)
|
61
|
+
links = [home_link(entity.namespace)]
|
62
|
+
|
63
|
+
if @parent_entity
|
64
|
+
links << link_to_entity(@parent_entity.class, :index, no_icon: true)
|
65
|
+
links << link_to_entity(@parent_entity, :show, no_icon: true)
|
66
|
+
end
|
67
|
+
|
68
|
+
links << link_to_entity(entity.class, :index, no_icon: true)
|
69
|
+
links << link_to_entity(entity.class, :new, no_icon: true)
|
70
|
+
|
71
|
+
render_breadcrumb links
|
72
|
+
end
|
73
|
+
|
74
|
+
def render_breadcrumb_edit(entity)
|
75
|
+
links = [home_link(entity.namespace)]
|
76
|
+
|
77
|
+
if @parent_entity
|
78
|
+
links << link_to_entity(@parent_entity.class, :index, no_icon: true)
|
79
|
+
links << link_to_entity(@parent_entity, :show, no_icon: true)
|
80
|
+
end
|
81
|
+
|
82
|
+
links << link_to_entity(entity.class, :index, no_icon: true)
|
83
|
+
links << link_to_entity(entity, :edit, no_icon: true)
|
84
|
+
|
85
|
+
render_breadcrumb links
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Microservice
|
2
|
+
class ApplicationMailer < ::ActionMailer::Base
|
3
|
+
|
4
|
+
default from: Microservice::Settings.email_default_from
|
5
|
+
|
6
|
+
layout 'microservice/mailer'
|
7
|
+
|
8
|
+
def self.default_url_options
|
9
|
+
{host: Microservice::Settings.host_name, protocol: Microservice::Settings.protocol}
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Microservice
|
2
|
+
class DeviseMailer < ::Devise::Mailer
|
3
|
+
|
4
|
+
default from: Microservice::Settings.email_default_from
|
5
|
+
|
6
|
+
layout 'microservice/mailer'
|
7
|
+
|
8
|
+
def self.default_url_options
|
9
|
+
{host: Microservice::Settings.host_name, protocol: Microservice::Settings.protocol}
|
10
|
+
end
|
11
|
+
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
module Microservice
|
2
|
+
module Concerns
|
3
|
+
module EntityCloneable
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
|
8
|
+
after_create :copy_associations, if: -> {self.copied_from.present?}
|
9
|
+
|
10
|
+
attr_accessor :copied_from, :copy_options
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
class_methods do
|
15
|
+
|
16
|
+
def copy_from(arg, options = {})
|
17
|
+
source = arg.is_a?(::ApplicationRecord) ? arg : self.class.find(arg)
|
18
|
+
|
19
|
+
copy = self.new
|
20
|
+
copy.attributes = source.attributes.dup.except(*copy_attributes_exceptions)
|
21
|
+
copy.copied_from = source
|
22
|
+
copy.copy_options = options
|
23
|
+
|
24
|
+
copy
|
25
|
+
end
|
26
|
+
|
27
|
+
def copy_attributes_exceptions
|
28
|
+
%w(id created_at updated_at)
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
|
35
|
+
def copy_associations
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module Microservice
|
2
|
+
module Concerns
|
3
|
+
|
4
|
+
# Example of migration:
|
5
|
+
#
|
6
|
+
# create_table :table_name, force: true do |t|
|
7
|
+
# t.string :name, null: false
|
8
|
+
# t.text :description, null: true
|
9
|
+
# t.boolean :active, null: false, default: true
|
10
|
+
#
|
11
|
+
# t.references :author, null: false
|
12
|
+
# t.references :updated_by, null: true
|
13
|
+
# t.timestamps null: false
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
|
17
|
+
module EntityModel
|
18
|
+
extend ActiveSupport::Concern
|
19
|
+
|
20
|
+
included do
|
21
|
+
|
22
|
+
class_attribute :namespace, :search_fields, :sort_field, :parent_entity_symbol
|
23
|
+
class_attribute :hide_top_menu_new, :hide_top_menu_search
|
24
|
+
|
25
|
+
scope :sorted, -> {order(sort_field || :name)}
|
26
|
+
scope :search, -> (text) {where(Array(search_fields || default_search_fields).map {|f| arel_table[f].matches("%#{text}%")}.inject(:or))}
|
27
|
+
scope :active, -> {where(active: true) if column_names.include?('active')}
|
28
|
+
|
29
|
+
belongs_to :author, optional: true, class_name: 'User'
|
30
|
+
belongs_to :updated_by, optional: true, class_name: 'User'
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
class_methods do
|
35
|
+
|
36
|
+
def belongs_to_parent(name, options={})
|
37
|
+
self.parent_entity_symbol = name
|
38
|
+
belongs_to(name, options={})
|
39
|
+
end
|
40
|
+
|
41
|
+
def default_search_fields
|
42
|
+
f = []
|
43
|
+
f << :name if self.column_names.include?('name')
|
44
|
+
f << :description if self.column_names.include?('description')
|
45
|
+
f
|
46
|
+
end
|
47
|
+
|
48
|
+
def css_class(_options = {})
|
49
|
+
''
|
50
|
+
end
|
51
|
+
|
52
|
+
def description
|
53
|
+
I18n.t(self.model_name.i18n_key, scope: [:text_entity_description])
|
54
|
+
end
|
55
|
+
|
56
|
+
def parent_entity_id_symbol
|
57
|
+
@parent_entity_id_symbol ||= (parent_entity_symbol.to_s + '_id').to_sym if parent_entity_symbol
|
58
|
+
end
|
59
|
+
|
60
|
+
def parent_entity_class
|
61
|
+
@parent_entity_class ||= self.reflect_on_association(parent_entity_symbol).klass if parent_entity_symbol
|
62
|
+
end
|
63
|
+
|
64
|
+
def class_route_array(parent_entity = nil)
|
65
|
+
if parent_entity_symbol
|
66
|
+
[parent_entity, self.namespace, self.base_class]
|
67
|
+
else
|
68
|
+
[self.namespace, self.base_class]
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def _to_form_path #:nodoc:
|
73
|
+
@_to_form_path ||= begin
|
74
|
+
n = ''
|
75
|
+
n = "#{self.namespace}/" if self.namespace
|
76
|
+
collection = ActiveSupport::Inflector.tableize(name)
|
77
|
+
|
78
|
+
"#{n}#{collection}/form".freeze
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
def css_class(options = {})
|
85
|
+
self.class.css_class(options)
|
86
|
+
end
|
87
|
+
|
88
|
+
def parent_entity
|
89
|
+
send(parent_entity_symbol) if parent_entity_symbol
|
90
|
+
end
|
91
|
+
|
92
|
+
def parent_entity=(value)
|
93
|
+
send(parent_entity_symbol.to_s + '=', value) if parent_entity_symbol
|
94
|
+
end
|
95
|
+
|
96
|
+
def polymorphic_class
|
97
|
+
self.becomes(self.class.base_class)
|
98
|
+
end
|
99
|
+
|
100
|
+
def model_route_array
|
101
|
+
[self.namespace, self.parent_entity, polymorphic_class]
|
102
|
+
end
|
103
|
+
|
104
|
+
def class_route_array
|
105
|
+
self.class.class_route_array
|
106
|
+
end
|
107
|
+
|
108
|
+
def to_form_path
|
109
|
+
self.class._to_form_path
|
110
|
+
end
|
111
|
+
|
112
|
+
def last_touch_by
|
113
|
+
updated_by || author
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module Microservice
|
2
|
+
module Concerns
|
3
|
+
module EntityMovable
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
|
8
|
+
after_save :do_move, if: -> {self.move_attributes.present?}
|
9
|
+
|
10
|
+
attr_accessor :move_attributes
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
def do_move
|
17
|
+
end
|
18
|
+
|
19
|
+
def create_target_entity_from(move_to_params)
|
20
|
+
return nil if move_to_params.blank?
|
21
|
+
|
22
|
+
move_to_params['target_class'].constantize.find(move_to_params['target_id'])
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Microservice
|
2
|
+
module Concerns
|
3
|
+
module EntityNaming
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
end
|
8
|
+
|
9
|
+
class_methods do
|
10
|
+
|
11
|
+
def heading_index
|
12
|
+
I18n.t(:heading_entity_index, entities: self.base_class.model_name.plural.humanize)
|
13
|
+
end
|
14
|
+
|
15
|
+
def button_index
|
16
|
+
I18n.t(:button_entity_index, entities: self.base_class.model_name.plural.humanize)
|
17
|
+
end
|
18
|
+
|
19
|
+
def title_index
|
20
|
+
I18n.t(:title_entity_index, entities: self.base_class.model_name.plural)
|
21
|
+
end
|
22
|
+
|
23
|
+
def heading_show
|
24
|
+
self.model_name.human
|
25
|
+
end
|
26
|
+
|
27
|
+
def heading_new
|
28
|
+
I18n.t(:heading_entity_new, entity: self.model_name.human)
|
29
|
+
end
|
30
|
+
|
31
|
+
def button_new
|
32
|
+
I18n.t(:button_entity_new, entity: self.model_name.human)
|
33
|
+
end
|
34
|
+
|
35
|
+
def title_new
|
36
|
+
I18n.t(:title_entity_new, entity: self.model_name.human)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
def heading_index
|
42
|
+
self.class.heading_index
|
43
|
+
end
|
44
|
+
|
45
|
+
def button_index
|
46
|
+
self.class.button_index
|
47
|
+
end
|
48
|
+
|
49
|
+
def title_index
|
50
|
+
self.class.title_index
|
51
|
+
end
|
52
|
+
|
53
|
+
def heading_show
|
54
|
+
I18n.t(:heading_entity_show, entity: self.name)
|
55
|
+
end
|
56
|
+
|
57
|
+
def button_show
|
58
|
+
name
|
59
|
+
end
|
60
|
+
|
61
|
+
def title_show
|
62
|
+
I18n.t(:title_entity_show, entity: self.name)
|
63
|
+
end
|
64
|
+
|
65
|
+
def heading_new
|
66
|
+
self.class.heading_new
|
67
|
+
end
|
68
|
+
|
69
|
+
def button_new
|
70
|
+
self.class.button_new
|
71
|
+
end
|
72
|
+
|
73
|
+
def title_new
|
74
|
+
self.class.title_new
|
75
|
+
end
|
76
|
+
|
77
|
+
def heading_edit
|
78
|
+
I18n.t(:heading_entity_edit, entity: self.class.model_name.human)
|
79
|
+
end
|
80
|
+
|
81
|
+
def button_edit
|
82
|
+
I18n.t(:button_entity_edit, entity: self.class.model_name.human)
|
83
|
+
end
|
84
|
+
|
85
|
+
def title_edit
|
86
|
+
I18n.t(:title_entity_edit, entity: self.name)
|
87
|
+
end
|
88
|
+
|
89
|
+
def title_delete
|
90
|
+
I18n.t(:title_entity_delete, entity: self.name)
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Microservice
|
2
|
+
module Concerns
|
3
|
+
module UserModel
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
|
8
|
+
enum status: [:active]
|
9
|
+
|
10
|
+
devise :database_authenticatable, :trackable, :validatable,
|
11
|
+
:registerable, :recoverable, :rememberable, :confirmable, :lockable, :timeoutable,
|
12
|
+
:token_authenticatable,
|
13
|
+
:omniauthable, omniauth_providers: Microservice::Settings.omniauth_providers_keys
|
14
|
+
|
15
|
+
scope :admins, -> {where(admin: true)}
|
16
|
+
|
17
|
+
store :preferences, coder: JSON
|
18
|
+
|
19
|
+
thread_mattr_accessor :current
|
20
|
+
|
21
|
+
before_save :ensure_name
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
class_methods do
|
26
|
+
end
|
27
|
+
|
28
|
+
protected
|
29
|
+
|
30
|
+
def ensure_name
|
31
|
+
self.name = "#{first_name} #{last_name}"
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|