beyond_canvas 0.15.1.pre → 0.16.2.pre
Sign up to get free protection for your applications and to get access to all the features.
- 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,62 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_dependency 'beyond_canvas/application_controller'
|
4
|
+
|
5
|
+
module BeyondCanvas
|
6
|
+
class AuthenticationsController < ApplicationController # :nodoc:
|
7
|
+
layout 'beyond_canvas/public'
|
8
|
+
|
9
|
+
include ::BeyondCanvas::Authentication
|
10
|
+
include ::BeyondCanvas::ResourceManagement
|
11
|
+
|
12
|
+
before_action :validate_app_installation_request!, only: :new
|
13
|
+
|
14
|
+
def new
|
15
|
+
self.resource = resource_class.new
|
16
|
+
end
|
17
|
+
|
18
|
+
def create
|
19
|
+
# Search for the api url. If there is no record it creates a new record.
|
20
|
+
resource_params = new_resource_params
|
21
|
+
self.resource = resource_class.find_or_create_by(beyond_api_url: resource_params[:api_url])
|
22
|
+
# Assign the attributes to the record
|
23
|
+
raise ActiveRecord::RecordNotSaved unless resource.update(resource_params)
|
24
|
+
# Get and save access_token and refresh_token using the authentication code
|
25
|
+
raise BeyondApi::Error if resource.authenticate.is_a?(BeyondApi::Error)
|
26
|
+
|
27
|
+
redirect_to after_create_path
|
28
|
+
rescue ActiveRecord::RecordNotSaved, BeyondApi::Error, StandardError => e
|
29
|
+
logger.error "[BeyondCanvas] #{e.message}".red
|
30
|
+
send "handle_#{e.class.name.split('::').first.underscore}_exception", e
|
31
|
+
end
|
32
|
+
|
33
|
+
def update
|
34
|
+
create
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def new_resource_params
|
40
|
+
send "new_#{resource_name}_params"
|
41
|
+
end
|
42
|
+
|
43
|
+
def after_create_path
|
44
|
+
new_resource_params[:return_url]
|
45
|
+
end
|
46
|
+
|
47
|
+
def handle_active_record_exception(_exception)
|
48
|
+
flash[:error] = t('beyond_canvas.authentications.failure')
|
49
|
+
render :new
|
50
|
+
end
|
51
|
+
|
52
|
+
def handle_beyond_api_exception(_exception)
|
53
|
+
flash[:error] = t('beyond_canvas.authentications.failure')
|
54
|
+
render :new
|
55
|
+
end
|
56
|
+
|
57
|
+
def handle_standard_error_exception(_exception)
|
58
|
+
flash[:error] = t('beyond_canvas.authentications.failure')
|
59
|
+
render :new
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
module Authentication # :nodoc:
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
AUTH_RESOURCE = BeyondCanvas.auth_model
|
7
|
+
|
8
|
+
class_eval <<-METHODS, __FILE__, __LINE__ + 1
|
9
|
+
def current_#{AUTH_RESOURCE}
|
10
|
+
instance_variable_get("@#{AUTH_RESOURCE}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def new_#{AUTH_RESOURCE}_params
|
14
|
+
beyond_canvas_parameter_sanitizer.sanitize
|
15
|
+
end
|
16
|
+
METHODS
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def beyond_canvas_parameter_sanitizer
|
21
|
+
@beyond_canvas_parameter_sanitizer ||= BeyondCanvas::ParameterSanitizer.new(AUTH_RESOURCE, params)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -31,7 +31,7 @@ module BeyondCanvas
|
|
31
31
|
def valid_signature?(signature, data, secret)
|
32
32
|
digest = OpenSSL::Digest.new('SHA1')
|
33
33
|
hmac = OpenSSL::HMAC.digest(digest, secret, data)
|
34
|
-
signature == Base64.encode64(hmac).chop
|
34
|
+
URI.decode(signature) == Base64.encode64(hmac).chop
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
module ResourceManagement # :nodoc:
|
5
|
+
extend ActiveSupport::Concern
|
6
|
+
|
7
|
+
included do
|
8
|
+
# Share some methods defined in the controller to make them available for the view
|
9
|
+
if respond_to?(:helper_method)
|
10
|
+
helpers = %w[resource resource_name resource_class]
|
11
|
+
helper_method(*helpers)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
protected
|
16
|
+
|
17
|
+
def resource_name
|
18
|
+
BeyondCanvas.auth_model
|
19
|
+
end
|
20
|
+
|
21
|
+
def resource
|
22
|
+
instance_variable_get(:"@#{resource_name}")
|
23
|
+
end
|
24
|
+
|
25
|
+
def resource=(new_resource)
|
26
|
+
instance_variable_set(:"@#{resource_name}", new_resource)
|
27
|
+
end
|
28
|
+
|
29
|
+
def resource_class
|
30
|
+
resource_name.classify.constantize
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
import { disableActionElements, enableActionElements, hideSpinner, showSpinner } from './functions';
|
2
2
|
|
3
|
-
(function($) {
|
3
|
+
(function ($) {
|
4
4
|
const onDOMReady = function () {
|
5
5
|
const inputs = $('input, textarea, select').not(':input[type=button], :input[type=submit], :input[type=reset]');
|
6
6
|
|
@@ -11,9 +11,7 @@ const SPINNER_ANIMATION_TIMEOUT = 125;
|
|
11
11
|
if ($(input).is(':hidden')) {
|
12
12
|
e.preventDefault();
|
13
13
|
}
|
14
|
-
|
15
|
-
hideSpinner($(this));
|
16
|
-
});
|
14
|
+
hideSpinner();
|
17
15
|
enableActionElements();
|
18
16
|
});
|
19
17
|
});
|
@@ -31,18 +29,17 @@ const SPINNER_ANIMATION_TIMEOUT = 125;
|
|
31
29
|
<div class="bounce1"></div>
|
32
30
|
<div class="bounce2"></div>
|
33
31
|
<div class="bounce3"></div>
|
34
|
-
</div>`
|
35
|
-
);
|
32
|
+
</div>`);
|
36
33
|
|
37
34
|
// Bind ajax:success and ajax:error to the form the button belongs to
|
38
35
|
button
|
39
36
|
.closest('form')
|
40
37
|
.on('ajax:success', function () {
|
41
|
-
hideSpinner(
|
38
|
+
hideSpinner();
|
42
39
|
enableActionElements();
|
43
40
|
})
|
44
41
|
.on('ajax:error', function () {
|
45
|
-
hideSpinner(
|
42
|
+
hideSpinner();
|
46
43
|
enableActionElements();
|
47
44
|
});
|
48
45
|
});
|
@@ -53,35 +50,5 @@ const SPINNER_ANIMATION_TIMEOUT = 125;
|
|
53
50
|
showSpinner($(this));
|
54
51
|
});
|
55
52
|
|
56
|
-
$(document)
|
57
|
-
.on('ready page:load turbolinks:load', onDOMReady);
|
53
|
+
$(document).on('ready page:load turbolinks:load', onDOMReady);
|
58
54
|
})(jQuery);
|
59
|
-
|
60
|
-
function showSpinner(button) {
|
61
|
-
// Adjust the width of the button
|
62
|
-
button.width(button.width() + $('.spinner').outerWidth(true));
|
63
|
-
// Show the spinner
|
64
|
-
setTimeout(function() {
|
65
|
-
button.find('.spinner').css('display', 'flex');
|
66
|
-
}, SPINNER_ANIMATION_TIMEOUT);
|
67
|
-
}
|
68
|
-
|
69
|
-
function hideSpinner(button) {
|
70
|
-
setTimeout(function () {
|
71
|
-
// Hide the spinner
|
72
|
-
button.find('.spinner').hide();
|
73
|
-
// Adjust the width of the button
|
74
|
-
button.width(button.data('oldWidth'));
|
75
|
-
}, SPINNER_ANIMATION_TIMEOUT);
|
76
|
-
}
|
77
|
-
|
78
|
-
function disableActionElements() {
|
79
|
-
$('a, input[type="submit"], input[type="button"], input[type="reset"], button').each(function() {
|
80
|
-
$(this).addClass('actions--disabled');
|
81
|
-
});
|
82
|
-
}
|
83
|
-
function enableActionElements() {
|
84
|
-
$('a, input[type="submit"], input[type="button"], input[type="reset"], button').each(function() {
|
85
|
-
$(this).removeClass('actions--disabled');
|
86
|
-
});
|
87
|
-
}
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
import { closeAlert } from './functions';
|
2
|
+
|
3
|
+
(function ($) {
|
2
4
|
const onDOMReady = function () {
|
3
5
|
$('.flash').each(function () {
|
4
6
|
$(this).css('right', -$(this).width() + 'px');
|
@@ -9,19 +11,9 @@
|
|
9
11
|
}, 100);
|
10
12
|
};
|
11
13
|
|
12
|
-
$(document).on('click', '.flash', function() {
|
14
|
+
$(document).on('click', '.flash', function () {
|
13
15
|
closeAlert();
|
14
16
|
});
|
15
17
|
|
16
|
-
$(document)
|
17
|
-
.on('ready page:load turbolinks:load', onDOMReady);
|
18
|
+
$(document).on('ready page:load turbolinks:load', onDOMReady);
|
18
19
|
})(jQuery);
|
19
|
-
|
20
|
-
function closeAlert() {
|
21
|
-
$('.flash')
|
22
|
-
.removeClass('flash--shown')
|
23
|
-
.delay(700)
|
24
|
-
.queue(function() {
|
25
|
-
$(this).remove();
|
26
|
-
});
|
27
|
-
}
|
@@ -0,0 +1,41 @@
|
|
1
|
+
const SPINNER_ANIMATION_TIMEOUT = 125;
|
2
|
+
|
3
|
+
export function showSpinner(button) {
|
4
|
+
// Adjust the width of the button
|
5
|
+
button.width(button.width() + $('.spinner').outerWidth(true));
|
6
|
+
// Show the spinner
|
7
|
+
setTimeout(function () {
|
8
|
+
button.find('.spinner').css('display', 'flex');
|
9
|
+
}, SPINNER_ANIMATION_TIMEOUT);
|
10
|
+
}
|
11
|
+
|
12
|
+
export function hideSpinner() {
|
13
|
+
$('button[class^="button"]').each(function (_, button) {
|
14
|
+
setTimeout(function () {
|
15
|
+
// Hide the spinner
|
16
|
+
$(button).find('.spinner').hide();
|
17
|
+
// Adjust the width of the button
|
18
|
+
$(button).width($(button).data('oldWidth'));
|
19
|
+
}, SPINNER_ANIMATION_TIMEOUT);
|
20
|
+
});
|
21
|
+
}
|
22
|
+
|
23
|
+
export function disableActionElements() {
|
24
|
+
$('a, input[type="submit"], input[type="button"], input[type="reset"], button').each(function (_, button) {
|
25
|
+
$(button).addClass('actions--disabled');
|
26
|
+
});
|
27
|
+
}
|
28
|
+
export function enableActionElements() {
|
29
|
+
$('a, input[type="submit"], input[type="button"], input[type="reset"], button').each(function (_, button) {
|
30
|
+
$(button).removeClass('actions--disabled');
|
31
|
+
});
|
32
|
+
}
|
33
|
+
|
34
|
+
export function closeAlert() {
|
35
|
+
$('.flash')
|
36
|
+
.removeClass('flash--shown')
|
37
|
+
.delay(700)
|
38
|
+
.queue(function () {
|
39
|
+
$(this).remove();
|
40
|
+
});
|
41
|
+
}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
(function($) {
|
1
|
+
(function ($) {
|
2
2
|
const onDOMReady = function () {
|
3
3
|
$('input[type="file"]').each(function () {
|
4
4
|
var $input = $(this),
|
@@ -9,10 +9,7 @@
|
|
9
9
|
var fileName = '';
|
10
10
|
|
11
11
|
if (this.files && this.files.length > 1)
|
12
|
-
fileName = (this.getAttribute('data-multiple-caption') || '').replace(
|
13
|
-
'{count}',
|
14
|
-
this.files.length
|
15
|
-
);
|
12
|
+
fileName = (this.getAttribute('data-multiple-caption') || '').replace('{count}', this.files.length);
|
16
13
|
else if (e.target.value) fileName = e.target.value.split('\\').pop();
|
17
14
|
|
18
15
|
if (fileName)
|
@@ -33,6 +30,5 @@
|
|
33
30
|
});
|
34
31
|
};
|
35
32
|
|
36
|
-
$(document)
|
37
|
-
.on('ready page:load turbolinks:load', onDOMReady);
|
33
|
+
$(document).on('ready page:load turbolinks:load', onDOMReady);
|
38
34
|
})(jQuery);
|
@@ -0,0 +1,18 @@
|
|
1
|
+
<div class='card card--padding'>
|
2
|
+
|
3
|
+
<%= form_for(resource, as: resource_name) do |f| %>
|
4
|
+
|
5
|
+
<h2 class='card__headline'>Install <%= BeyondCanvas.configuration.site_title %> in your shop</h2>
|
6
|
+
|
7
|
+
<%= f.hidden_field :code, value: params[:code] || resource.code %>
|
8
|
+
<%= f.hidden_field :signature, value: params[:signature] || resource.signature %>
|
9
|
+
<%= f.hidden_field :return_url, value: params[:return_url] || resource.return_url %>
|
10
|
+
<%= f.hidden_field :api_url, value: params[:api_url] || resource.api_url %>
|
11
|
+
<%= f.hidden_field :access_token_url, value: params[:access_token_url] || resource.access_token_url %>
|
12
|
+
|
13
|
+
<div class='form__actions--spaced'>
|
14
|
+
<%= f.button 'Save', type: :submit, class: 'button__solid--primary' %>
|
15
|
+
</div>
|
16
|
+
|
17
|
+
<% end %>
|
18
|
+
</div>
|
@@ -5,7 +5,9 @@
|
|
5
5
|
|
6
6
|
<body class="body--public">
|
7
7
|
<main class="main <%= params[:controller].gsub(/[\/_]/, "-") %>--<%= params[:action] %>">
|
8
|
-
|
8
|
+
<div id="flash">
|
9
|
+
<%= render 'beyond_canvas/shared/flash' %>
|
10
|
+
</div>
|
9
11
|
<%= render 'beyond_canvas/locales/edit' %>
|
10
12
|
<div class="main-wrapper">
|
11
13
|
<%= render 'beyond_canvas/shared/logo' %>
|
data/config/routes.rb
CHANGED
@@ -2,4 +2,10 @@
|
|
2
2
|
|
3
3
|
BeyondCanvas::Engine.routes.draw do
|
4
4
|
put '/locale', to: 'system#update_locale', as: :update_locale
|
5
|
+
|
6
|
+
def create_default_routes(resource_name)
|
7
|
+
resources resource_name, controller: 'authentications', except: :destroy
|
8
|
+
end
|
9
|
+
|
10
|
+
create_default_routes(BeyondCanvas.auth_model.pluralize.to_sym) unless BeyondCanvas.use_rails_app_controller
|
5
11
|
end
|
data/lib/beyond_canvas.rb
CHANGED
@@ -12,10 +12,26 @@ require 'http/accept'
|
|
12
12
|
require 'premailer/rails'
|
13
13
|
|
14
14
|
require 'beyond_api'
|
15
|
+
require 'attr_encrypted'
|
16
|
+
require 'blind_index'
|
15
17
|
|
16
18
|
module BeyondCanvas # :nodoc:
|
17
|
-
autoload :AssetRegistration,
|
18
|
-
autoload :Configuration,
|
19
|
+
autoload :AssetRegistration, 'beyond_canvas/asset_registration'
|
20
|
+
autoload :Configuration, 'beyond_canvas/configuration'
|
21
|
+
|
22
|
+
module Models # :nodoc:
|
23
|
+
autoload :Authentication, 'beyond_canvas/models/authentication'
|
24
|
+
autoload :Shop, 'beyond_canvas/models/shop'
|
25
|
+
autoload :Utils, 'beyond_canvas/models/utils'
|
26
|
+
end
|
27
|
+
|
28
|
+
autoload :ParameterSanitizer, 'beyond_canvas/parameter_sanitizer'
|
29
|
+
|
30
|
+
mattr_accessor :use_rails_app_controller
|
31
|
+
@@use_rails_app_controller = false # rubocop:disable Style/ClassVars
|
32
|
+
|
33
|
+
mattr_accessor :auth_model
|
34
|
+
@@auth_model = 'shop' # rubocop:disable Style/ClassVars
|
19
35
|
|
20
36
|
class << self
|
21
37
|
def configuration
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module BeyondCanvas
|
4
4
|
class Configuration # :nodoc:
|
5
|
-
attr_accessor :site_title, :site_logo, :favicon, :skip_webpacker
|
5
|
+
attr_accessor :site_title, :site_logo, :favicon, :skip_webpacker, :encryption_key, :blind_index_key, :namespace
|
6
6
|
|
7
7
|
include AssetRegistration
|
8
8
|
|
@@ -11,6 +11,9 @@ module BeyondCanvas
|
|
11
11
|
@site_logo = nil
|
12
12
|
@favicon = nil
|
13
13
|
@skip_webpacker = false
|
14
|
+
@encryption_key = nil
|
15
|
+
@blind_index_key = nil
|
16
|
+
@namespace = '/'
|
14
17
|
end
|
15
18
|
|
16
19
|
def setup!
|
data/lib/beyond_canvas/engine.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'beyond_canvas/rails/routes'
|
4
|
+
|
3
5
|
module BeyondCanvas
|
4
6
|
class Engine < ::Rails::Engine # :nodoc:
|
5
7
|
isolate_namespace BeyondCanvas
|
@@ -15,7 +17,9 @@ module BeyondCanvas
|
|
15
17
|
|
16
18
|
config.before_initialize do
|
17
19
|
ActiveSupport.on_load :action_controller do
|
20
|
+
include ::BeyondCanvas::Authentication
|
18
21
|
include ::BeyondCanvas::LocaleManagement
|
22
|
+
include ::BeyondCanvas::ResourceManagement
|
19
23
|
include ::BeyondCanvas::RequestValidation
|
20
24
|
include ::BeyondCanvas::StatusCodes
|
21
25
|
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module BeyondCanvas
|
4
|
+
module Models
|
5
|
+
module Authentication # :nodoc:
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
included do
|
9
|
+
attr_accessor :code, :signature, :access_token_url
|
10
|
+
|
11
|
+
##############################################################################
|
12
|
+
# Encrypted attribute configuration
|
13
|
+
##############################################################################
|
14
|
+
|
15
|
+
attr_encrypted :beyond_api_url, key: [BeyondCanvas.configuration.encryption_key].pack('H*')
|
16
|
+
attr_encrypted :beyond_access_token, key: [BeyondCanvas.configuration.encryption_key].pack('H*')
|
17
|
+
attr_encrypted :beyond_refresh_token, key: [BeyondCanvas.configuration.encryption_key].pack('H*')
|
18
|
+
|
19
|
+
blind_index :beyond_api_url, key: [BeyondCanvas.configuration.blind_index_key].pack('H*')
|
20
|
+
|
21
|
+
##############################################################################
|
22
|
+
# Validations
|
23
|
+
##############################################################################
|
24
|
+
|
25
|
+
# Callback url params
|
26
|
+
|
27
|
+
validates :code,
|
28
|
+
presence: true,
|
29
|
+
on: :create
|
30
|
+
validates :signature,
|
31
|
+
presence: true,
|
32
|
+
on: :create
|
33
|
+
validates :access_token_url,
|
34
|
+
presence: true,
|
35
|
+
on: :create
|
36
|
+
|
37
|
+
# Database fields
|
38
|
+
|
39
|
+
validates :beyond_api_url,
|
40
|
+
presence: true
|
41
|
+
validates :beyond_access_token,
|
42
|
+
presence: true,
|
43
|
+
unless: -> { encrypted_beyond_access_token_was.blank? }
|
44
|
+
validates :beyond_refresh_token,
|
45
|
+
presence: true,
|
46
|
+
unless: -> { encrypted_beyond_refresh_token_was.blank? }
|
47
|
+
|
48
|
+
##############################################################################
|
49
|
+
# Instance methods
|
50
|
+
##############################################################################
|
51
|
+
|
52
|
+
#
|
53
|
+
# Get and save access_token and refresh_token using the authentication code
|
54
|
+
# NOTE: This method is used during the shop creation, as it is the only point
|
55
|
+
# we know about the authentication code
|
56
|
+
#
|
57
|
+
def authenticate
|
58
|
+
session = BeyondApi::Session.new(api_url: beyond_api_url)
|
59
|
+
session.token.create(code)
|
60
|
+
update(beyond_access_token: session.access_token,
|
61
|
+
beyond_refresh_token: session.refresh_token)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|