beyond_canvas 0.15.1.pre → 0.16.2.pre
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 +4 -4
- data/README.md +0 -6
- data/Rakefile +3 -3
- data/app/assets/javascripts/beyond_canvas/base.js +248 -99
- data/app/assets/stylesheets/beyond_canvas/settings/_breakpoints.scss +6 -6
- data/app/assets/stylesheets/beyond_canvas/settings/_variables.scss +13 -13
- data/app/controllers/beyond_canvas/authentications_controller.rb +62 -0
- data/app/controllers/concerns/beyond_canvas/authentication.rb +24 -0
- data/app/controllers/concerns/beyond_canvas/request_validation.rb +1 -1
- data/app/controllers/concerns/beyond_canvas/resource_management.rb +33 -0
- data/app/javascript/beyond_canvas/base.js +0 -2
- data/app/javascript/beyond_canvas/initializers/buttons.js +7 -40
- data/app/javascript/beyond_canvas/initializers/flash.js +5 -13
- data/app/javascript/beyond_canvas/initializers/functions.js +41 -0
- data/app/javascript/beyond_canvas/initializers/inputs.js +3 -7
- data/app/views/beyond_canvas/authentications/new.html.erb +18 -0
- data/app/views/layouts/beyond_canvas/public.html.erb +3 -1
- data/config/locales/en.yml +4 -0
- data/config/routes.rb +6 -0
- data/lib/beyond_canvas.rb +18 -2
- data/lib/beyond_canvas/configuration.rb +4 -1
- data/lib/beyond_canvas/engine.rb +4 -0
- data/lib/beyond_canvas/models/authentication.rb +66 -0
- data/lib/beyond_canvas/models/shop.rb +28 -0
- data/lib/beyond_canvas/models/utils.rb +55 -0
- data/lib/beyond_canvas/parameter_sanitizer.rb +43 -0
- data/lib/beyond_canvas/rails/routes.rb +21 -0
- data/lib/beyond_canvas/version.rb +1 -1
- data/lib/generators/beyond_canvas/auth_model/auth_model_generator.rb +50 -0
- data/lib/generators/beyond_canvas/auth_model/templates/migration.erb +20 -0
- data/lib/generators/beyond_canvas/auth_model/templates/model.erb +5 -0
- data/lib/generators/beyond_canvas/controller/controller_generator.rb +20 -0
- data/lib/generators/beyond_canvas/controller/templates/controller.erb +37 -0
- data/lib/generators/beyond_canvas/custom_styles/templates/beyond_canvas_custom_styles.scss +153 -0
- data/lib/generators/beyond_canvas/install/install_generator.rb +15 -5
- data/lib/generators/beyond_canvas/install/templates/beyond_canvas.rb.erb +11 -0
- data/lib/generators/beyond_canvas/views/views_generator.rb +19 -0
- metadata +50 -5
- data/lib/generators/beyond_canvas/custom_styles/templates/beyond_canvas_custom_styles.sass +0 -123
@@ -0,0 +1,28 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
module Models
|
5
|
+
module Shop # :nodoc:
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
include BeyondCanvas::Models::Authentication
|
8
|
+
include BeyondCanvas::Models::Utils
|
9
|
+
|
10
|
+
included do
|
11
|
+
attr_accessor :api_url, :return_url
|
12
|
+
|
13
|
+
##############################################################################
|
14
|
+
# Validations
|
15
|
+
##############################################################################
|
16
|
+
|
17
|
+
# Callback url params
|
18
|
+
|
19
|
+
validates :api_url,
|
20
|
+
presence: true,
|
21
|
+
on: :create
|
22
|
+
validates :return_url,
|
23
|
+
presence: true,
|
24
|
+
on: :create
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
module Models
|
5
|
+
module Utils # :nodoc:
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
##############################################################################
|
10
|
+
# Instance methods
|
11
|
+
##############################################################################
|
12
|
+
|
13
|
+
#
|
14
|
+
# Generates a new access_token and refresh_token
|
15
|
+
#
|
16
|
+
def refresh_token
|
17
|
+
beyond_session = BeyondApi::Session.new(api_url: beyond_api_url, refresh_token: beyond_refresh_token)
|
18
|
+
beyond_session.token.refresh
|
19
|
+
|
20
|
+
update(beyond_access_token: beyond_session.access_token,
|
21
|
+
beyond_refresh_token: beyond_session.refresh_token)
|
22
|
+
end
|
23
|
+
|
24
|
+
#
|
25
|
+
# Generates a new access_token and refresh_token if they have expired
|
26
|
+
#
|
27
|
+
def refresh_token_if_needed
|
28
|
+
token_timestamp = JWT.decode(beyond_access_token, nil, false).first['exp']
|
29
|
+
current_timestamp = DateTime.now.to_i
|
30
|
+
return unless token_timestamp - current_timestamp <= 3600
|
31
|
+
|
32
|
+
refresh_token
|
33
|
+
end
|
34
|
+
|
35
|
+
#
|
36
|
+
# Returns a BeyondApi::Session object with api_url, access_token and refresh_token attributes
|
37
|
+
#
|
38
|
+
def to_session
|
39
|
+
BeyondApi::Session.new(api_url: beyond_api_url,
|
40
|
+
access_token: beyond_access_token,
|
41
|
+
refresh_token: beyond_refresh_token)
|
42
|
+
end
|
43
|
+
|
44
|
+
##############################################################################
|
45
|
+
# Class methods
|
46
|
+
##############################################################################
|
47
|
+
|
48
|
+
def self.find_session(id)
|
49
|
+
shop = find(id)
|
50
|
+
shop.to_session
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
class ParameterSanitizer # :nodoc:
|
5
|
+
DEFAULT_PERMITTED_ATTRIBUTES = %i[code signature return_url api_url access_token_url].freeze
|
6
|
+
|
7
|
+
def initialize(resource_name, params)
|
8
|
+
@params = params
|
9
|
+
@resource_name = resource_name
|
10
|
+
@permitted = DEFAULT_PERMITTED_ATTRIBUTES
|
11
|
+
end
|
12
|
+
|
13
|
+
def sanitize
|
14
|
+
permit_keys(default_params)
|
15
|
+
end
|
16
|
+
|
17
|
+
def permit(*keys)
|
18
|
+
@permitted.concat(keys)
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def default_params
|
24
|
+
if hashable_resource_params?
|
25
|
+
@params.fetch(@resource_name)
|
26
|
+
else
|
27
|
+
empty_params
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def hashable_resource_params?
|
32
|
+
@params[@resource_name].respond_to?(:permit)
|
33
|
+
end
|
34
|
+
|
35
|
+
def empty_params
|
36
|
+
ActionController::Parameters.new({})
|
37
|
+
end
|
38
|
+
|
39
|
+
def permit_keys(parameters)
|
40
|
+
parameters.permit(*@permitted)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ActionDispatch
|
4
|
+
module Routing
|
5
|
+
class Mapper # :nodoc:
|
6
|
+
def beyond_canvas_for(*resources)
|
7
|
+
mount BeyondCanvas::Engine => BeyondCanvas.configuration.namespace
|
8
|
+
|
9
|
+
resource_name, options = resources
|
10
|
+
BeyondCanvas.auth_model = resource_name.to_s.singularize
|
11
|
+
BeyondCanvas.use_rails_app_controller = options.present? && options[:controller].present?
|
12
|
+
|
13
|
+
set_routes(resource_name, options[:controller]) if BeyondCanvas.use_rails_app_controller
|
14
|
+
end
|
15
|
+
|
16
|
+
def set_routes(resource_name, controller)
|
17
|
+
resources resource_name, controller: controller
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/active_record'
|
4
|
+
|
5
|
+
module BeyondCanvas
|
6
|
+
module Generators
|
7
|
+
class AuthModelGenerator < ActiveRecord::Generators::Base # :nodoc:
|
8
|
+
desc 'Generates a model with the given name and provides a method to authenticate in Beyond Backend'
|
9
|
+
|
10
|
+
argument :attributes, type: :array, default: [], banner: 'field:type field:type'
|
11
|
+
|
12
|
+
source_root File.expand_path('templates', __dir__)
|
13
|
+
|
14
|
+
def copy_beyond_canvas_migration
|
15
|
+
migration_path = File.join('db', 'migrate')
|
16
|
+
migration_template 'migration.erb',
|
17
|
+
"#{migration_path}/beyond_canvas_create_#{table_name}.rb",
|
18
|
+
migration_version: migration_version
|
19
|
+
end
|
20
|
+
|
21
|
+
def generate_model
|
22
|
+
template 'model.erb', File.join('app', 'models', "#{file_path}.rb")
|
23
|
+
end
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def rails5_and_up?
|
28
|
+
Rails::VERSION::MAJOR >= 5
|
29
|
+
end
|
30
|
+
|
31
|
+
def migration_version
|
32
|
+
"[#{Rails::VERSION::MAJOR}.#{Rails::VERSION::MINOR}]" if rails5_and_up?
|
33
|
+
end
|
34
|
+
|
35
|
+
def migration_data
|
36
|
+
<<RUBY
|
37
|
+
t.string :encrypted_beyond_api_url, null: false
|
38
|
+
t.string :encrypted_beyond_api_url_iv, null: false
|
39
|
+
t.string :beyond_api_url_bidx, null: false
|
40
|
+
|
41
|
+
t.text :encrypted_beyond_access_token, null: true
|
42
|
+
t.text :encrypted_beyond_access_token_iv, null: true
|
43
|
+
|
44
|
+
t.text :encrypted_beyond_refresh_token, null: true
|
45
|
+
t.text :encrypted_beyond_refresh_token_iv, null: true
|
46
|
+
RUBY
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class BeyondCanvasCreate<%= table_name.camelize %> < ActiveRecord::Migration<%= migration_version %>
|
4
|
+
def change
|
5
|
+
create_table :<%= table_name %><%= primary_key_type %> do |t|
|
6
|
+
<%= migration_data -%>
|
7
|
+
|
8
|
+
<% attributes.each do |attribute| -%>
|
9
|
+
t.<%= attribute.type %> :<%= attribute.name %>
|
10
|
+
<% end -%>
|
11
|
+
|
12
|
+
t.timestamps null: false
|
13
|
+
end
|
14
|
+
|
15
|
+
add_index :<%= table_name %>, :encrypted_beyond_api_url_iv, unique: true
|
16
|
+
add_index :<%= table_name %>, :beyond_api_url_bidx, unique: true
|
17
|
+
add_index :<%= table_name %>, :encrypted_beyond_access_token_iv, unique: true
|
18
|
+
add_index :<%= table_name %>, :encrypted_beyond_refresh_token_iv, unique: true
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails/generators/active_record'
|
4
|
+
|
5
|
+
module BeyondCanvas
|
6
|
+
module Generators
|
7
|
+
class ControllerGenerator < Rails::Generators::Base # :nodoc:
|
8
|
+
desc 'Creates an inherited Beyond Canvas controller in the app/controllers folder'
|
9
|
+
|
10
|
+
argument :scope, required: true, desc: 'The scope to create the controller, e.g. shops, users'
|
11
|
+
|
12
|
+
source_root File.expand_path('templates', __dir__)
|
13
|
+
|
14
|
+
def create_controller
|
15
|
+
template 'controller.erb',
|
16
|
+
"app/controllers/#{scope}_controller.rb"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class <%= scope.camelize %>Controller < BeyondCanvas::AuthenticationsController
|
4
|
+
# before_action :configure_params, only: [:create]
|
5
|
+
|
6
|
+
# def new
|
7
|
+
# super
|
8
|
+
# end
|
9
|
+
|
10
|
+
# def create
|
11
|
+
# super
|
12
|
+
# end
|
13
|
+
|
14
|
+
# private
|
15
|
+
|
16
|
+
# If you have extra params to permit, append them to the sanitizer.
|
17
|
+
# def configure_params
|
18
|
+
# beyond_canvas_parameter_sanitizer.permit(:attribute1, :attribute2)
|
19
|
+
# end
|
20
|
+
|
21
|
+
# The path used after creating the shop in the database
|
22
|
+
# def after_create_path
|
23
|
+
# resource.return_url
|
24
|
+
# end
|
25
|
+
|
26
|
+
# def handle_active_record_exception(exception)
|
27
|
+
# super
|
28
|
+
# end
|
29
|
+
|
30
|
+
# def handle_beyond_api_exception(exception)
|
31
|
+
# super
|
32
|
+
# end
|
33
|
+
|
34
|
+
# def handle_standard_error_exception(exception)
|
35
|
+
# super
|
36
|
+
# end
|
37
|
+
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
// ************************************************************
|
2
|
+
// Colors
|
3
|
+
// ************************************************************
|
4
|
+
|
5
|
+
// $palette-primary: rgb(78, 183, 168);
|
6
|
+
// $palette-secondary: rgb(28, 53, 69);
|
7
|
+
// $palette-cancel: rgb(153, 153, 153);
|
8
|
+
// $palette-danger: rgb(218, 60, 60);
|
9
|
+
|
10
|
+
// ************************************************************
|
11
|
+
// General styles
|
12
|
+
// ************************************************************
|
13
|
+
|
14
|
+
// $main-background: rgb(233, 232, 220);
|
15
|
+
|
16
|
+
// ************************************************************
|
17
|
+
// Typography
|
18
|
+
// ************************************************************
|
19
|
+
|
20
|
+
// $main-color: rgb(62, 62, 62);
|
21
|
+
|
22
|
+
// ************************************************************
|
23
|
+
// Headlines
|
24
|
+
// ************************************************************
|
25
|
+
|
26
|
+
// $headline-color: rgb(122, 118, 76);
|
27
|
+
|
28
|
+
// ************************************************************
|
29
|
+
// Links
|
30
|
+
// ************************************************************
|
31
|
+
|
32
|
+
// $link-primary-color: darken($palette-primary, 10%);
|
33
|
+
// $link-secondary-color: darken($palette-cancel, 10%);
|
34
|
+
// $link-danger-color: darken($palette-danger, 10%);
|
35
|
+
|
36
|
+
// ************************************************************
|
37
|
+
// Buttons
|
38
|
+
// ************************************************************
|
39
|
+
|
40
|
+
// $button-primary-background: $palette-primary;
|
41
|
+
// $button-primary-color: $white;
|
42
|
+
|
43
|
+
// $button-secondary-background: $palette-cancel;
|
44
|
+
// $button-secondary-color: $white;
|
45
|
+
|
46
|
+
// $button-danger-background: $palette-danger;
|
47
|
+
// $button-danger-color: $white;
|
48
|
+
|
49
|
+
// $button-border-radius: 3px;
|
50
|
+
// $button-box-shadow: true;
|
51
|
+
|
52
|
+
// ************************************************************
|
53
|
+
// Cards
|
54
|
+
// ************************************************************
|
55
|
+
|
56
|
+
// $card-border-radius: 3px;
|
57
|
+
// $card-box-shadow: 0 2px 7px rgba($black, 0.2);
|
58
|
+
// $card-separator-color: rgb(222, 222, 222);
|
59
|
+
// $card-title-color: rgb(247, 133, 96);
|
60
|
+
|
61
|
+
// ************************************************************
|
62
|
+
// Containers
|
63
|
+
// ************************************************************
|
64
|
+
|
65
|
+
|
66
|
+
// ************************************************************
|
67
|
+
// Labels
|
68
|
+
// ************************************************************
|
69
|
+
|
70
|
+
// $label-color: rgb(128, 128, 128);
|
71
|
+
|
72
|
+
// ************************************************************
|
73
|
+
// Inputs
|
74
|
+
// ************************************************************
|
75
|
+
|
76
|
+
// $input-border-color: rgb(217, 216, 195);
|
77
|
+
// $input-border-color-focus: $palette-primary;
|
78
|
+
// $input-errors-color: $palette-danger;
|
79
|
+
|
80
|
+
// ************************************************************
|
81
|
+
// Checkboxes
|
82
|
+
// ************************************************************
|
83
|
+
|
84
|
+
// $checkbox-checked-color: #97C344;
|
85
|
+
// $checkbox-checked-background: #ffffff;
|
86
|
+
// $checkbox-unchecked-color: #C2BF9D;
|
87
|
+
// $checkbox-unchecked-background: #ffffff;
|
88
|
+
|
89
|
+
// ************************************************************
|
90
|
+
// Radiobuttons
|
91
|
+
// ************************************************************
|
92
|
+
|
93
|
+
// $radio-checked-color: #97C344;
|
94
|
+
// $radio-checked-background: #ffffff;
|
95
|
+
// $radio-unchecked-color: #C2BF9D;
|
96
|
+
// $radio-unchecked-background: #ffffff;
|
97
|
+
|
98
|
+
// ************************************************************
|
99
|
+
// Hints
|
100
|
+
// ************************************************************
|
101
|
+
|
102
|
+
// $hint-color: rgb(158, 158, 158);
|
103
|
+
|
104
|
+
// ************************************************************
|
105
|
+
// Logo
|
106
|
+
// ************************************************************
|
107
|
+
|
108
|
+
// $logo-margin-top-public: 0;
|
109
|
+
// $logo-margin-bottom-public: 34px;
|
110
|
+
|
111
|
+
// ************************************************************
|
112
|
+
// Flash
|
113
|
+
// ************************************************************
|
114
|
+
|
115
|
+
// $flash-success: rgb(123, 170, 81);
|
116
|
+
// $flash-notice: rgb(123, 170, 81);
|
117
|
+
// $flash-info: rgb(153, 153, 153);
|
118
|
+
// $flash-warning: rgb(243, 181, 71);
|
119
|
+
// $flash-error: rgb(218, 60, 60);
|
120
|
+
// $flash-border-radius: 4px;
|
121
|
+
// $flash-box-shadow: 0 1px 2px 0 rgba($black, 0.2);
|
122
|
+
// $flash-color: rgb(128, 128, 128);
|
123
|
+
|
124
|
+
// ************************************************************
|
125
|
+
// Tables
|
126
|
+
// ************************************************************
|
127
|
+
|
128
|
+
// $table-header-background: rgb(243, 242, 236);
|
129
|
+
// $table-border-color: rgb(233, 232, 220);
|
130
|
+
|
131
|
+
// ************************************************************
|
132
|
+
// Comments
|
133
|
+
// ************************************************************
|
134
|
+
|
135
|
+
// $comment-background: rgb(246, 246, 243);
|
136
|
+
// $comment-color: rgb(170, 169, 156);
|
137
|
+
|
138
|
+
// ************************************************************
|
139
|
+
// Notices
|
140
|
+
// ************************************************************
|
141
|
+
|
142
|
+
// $notice-success-background: rgb(123, 170, 81);
|
143
|
+
// $notice-notice-background: rgb(123, 170, 81);
|
144
|
+
// $notice-info-background: rgb(153, 153, 153);
|
145
|
+
// $notice-warning-background: rgb(243, 181, 71);
|
146
|
+
// $notice-error-background: rgb(218, 60, 60);
|
147
|
+
// $notice-border-radius: 4px;
|
148
|
+
// $notice-color: rgb(153, 153, 153);
|
149
|
+
|
150
|
+
// ************************************************************
|
151
|
+
// Markdown
|
152
|
+
// ************************************************************
|
153
|
+
|