beyond_canvas 0.15.3.pre → 0.16.0.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/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/resource_management.rb +33 -0
- data/app/views/beyond_canvas/authentications/new.html.erb +18 -0
- data/config/locales/en.yml +4 -0
- data/config/routes.rb +6 -0
- data/lib/beyond_canvas.rb +22 -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/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 +49 -5
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 0100f13f9ddfdf8b74b3edae25471d479d5a3351ecc5191f9cfa069a3d4c6b3f
         | 
| 4 | 
            +
              data.tar.gz: e73fdde1ebee7d45422f052c66791a0b86938b52df74930042b4fc67aa6008af
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: b622d131dfe607dbfee52c65b3b0294d609afa3deeb339c9597a46c9dc847cedf578ff8ac2ce3d3dca106fc240b97b3da44be3de75c62a326f5c54739618ec5f
         | 
| 7 | 
            +
              data.tar.gz: 86eb83c6da624ca5706737f48270bfa85819a57be85795188426a1a263c1f10480c16b83579c349d06e4c33da9bfa61543e9076286ae570ab033b7202104c0ec
         | 
    
        data/README.md
    CHANGED
    
    
| @@ -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
         | 
| @@ -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
         | 
| @@ -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>
         | 
    
        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,30 @@ 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
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              def self.use_rails_app_controller=(value)
         | 
| 37 | 
            +
                @use_rails_app_controller = value
         | 
| 38 | 
            +
              end
         | 
| 19 39 |  | 
| 20 40 | 
             
              class << self
         | 
| 21 41 | 
             
                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
         | 
| @@ -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
         | 
| @@ -6,19 +6,17 @@ module BeyondCanvas | |
| 6 6 | 
             
                  desc 'Installs Beyond Canvas and generates the necessary files'
         | 
| 7 7 |  | 
| 8 8 | 
             
                  class_option :skip_webpacker, type: :boolean, default: false, desc: 'Use Sprockets assets instead of Webpacker'
         | 
| 9 | 
            +
                  class_option :auth_model, type: :string, default: 'shop', desc: 'Authentication model'
         | 
| 9 10 |  | 
| 10 11 | 
             
                  source_root File.expand_path('templates', __dir__)
         | 
| 11 12 |  | 
| 12 13 | 
             
                  def copy_initializer
         | 
| 13 14 | 
             
                    @skip_webpacker = options[:skip_webpacker]
         | 
| 15 | 
            +
                    @auth_model = options[:auth_model]
         | 
| 14 16 |  | 
| 15 17 | 
             
                    template 'beyond_canvas.rb.erb', 'config/initializers/beyond_canvas.rb'
         | 
| 16 18 | 
             
                  end
         | 
| 17 19 |  | 
| 18 | 
            -
                  def setup_routes
         | 
| 19 | 
            -
                    route "mount BeyondCanvas::Engine => '/'"
         | 
| 20 | 
            -
                  end
         | 
| 21 | 
            -
             | 
| 22 20 | 
             
                  def create_assets
         | 
| 23 21 | 
             
                    if options[:skip_webpacker]
         | 
| 24 22 | 
             
                      generate 'beyond_canvas:assets'
         | 
| @@ -28,7 +26,19 @@ module BeyondCanvas | |
| 28 26 | 
             
                  end
         | 
| 29 27 |  | 
| 30 28 | 
             
                  def install_beyond_api
         | 
| 31 | 
            -
                    generate 'beyond_api | 
| 29 | 
            +
                    generate 'beyond_canvas:beyond_api'
         | 
| 30 | 
            +
                  end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  def generate_auth_model
         | 
| 33 | 
            +
                    generate "beyond_canvas:auth_model #{@auth_model}"
         | 
| 34 | 
            +
                  end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                  def setup_routes
         | 
| 37 | 
            +
                    route "beyond_canvas_for :#{@auth_model.pluralize}"
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  def copy_locale
         | 
| 41 | 
            +
                    copy_file '../../../../../config/locales/en.yml', 'config/locales/beyond_canvas.en.yml'
         | 
| 32 42 | 
             
                  end
         | 
| 33 43 | 
             
                end
         | 
| 34 44 | 
             
              end
         | 
| @@ -37,4 +37,15 @@ BeyondCanvas.setup do |config| | |
| 37 37 | 
             
              # You can switch to using Sprocket's asset pipeline here.
         | 
| 38 38 | 
             
              #
         | 
| 39 39 | 
             
              <% unless @skip_webpacker %># <% end %>config.skip_webpacker = <%= @skip_webpacker %>
         | 
| 40 | 
            +
             | 
| 41 | 
            +
              # ==> Authentication with ePages Beyond API
         | 
| 42 | 
            +
             | 
| 43 | 
            +
              # Default model is shop
         | 
| 44 | 
            +
              #
         | 
| 45 | 
            +
              config.encryption_key = '<%= SecureRandom.hex(32) %>'
         | 
| 46 | 
            +
              config.blind_index_key = '<%= SecureRandom.hex(32) %>'
         | 
| 47 | 
            +
             | 
| 48 | 
            +
              # ==> Mountable engine configuration
         | 
| 49 | 
            +
              #
         | 
| 50 | 
            +
              #   config.namespace = '/'
         | 
| 40 51 | 
             
            end
         | 
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'rails/generators/active_record'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module BeyondCanvas
         | 
| 6 | 
            +
              module Generators
         | 
| 7 | 
            +
                class ViewsGenerator < Rails::Generators::Base # :nodoc:
         | 
| 8 | 
            +
                  desc 'Creates a view in the app/view folder'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
                  argument :scope, required: true, desc: 'The scope to copy views to'
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                  source_root File.expand_path('../../../../app/views/beyond_canvas/authentications', __dir__)
         | 
| 13 | 
            +
             | 
| 14 | 
            +
                  def create_view
         | 
| 15 | 
            +
                    copy_file 'new.html.erb', "app/views/#{scope}/new.html.erb"
         | 
| 16 | 
            +
                  end
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,29 +1,57 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: beyond_canvas
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 0.16.0.pre
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Unai Abrisketa
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2020-06- | 
| 11 | 
            +
            date: 2020-06-26 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              name: attr_encrypted
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - "~>"
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: '3.1'
         | 
| 20 | 
            +
              type: :runtime
         | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - "~>"
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: '3.1'
         | 
| 13 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 28 | 
             
              name: beyond_api
         | 
| 15 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 30 | 
             
                requirements:
         | 
| 17 31 | 
             
                - - "~>"
         | 
| 18 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            -
                    version: '0. | 
| 33 | 
            +
                    version: '0.11'
         | 
| 20 34 | 
             
              type: :runtime
         | 
| 21 35 | 
             
              prerelease: false
         | 
| 22 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 37 | 
             
                requirements:
         | 
| 24 38 | 
             
                - - "~>"
         | 
| 25 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            -
                    version: '0. | 
| 40 | 
            +
                    version: '0.11'
         | 
| 41 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 42 | 
            +
              name: blind_index
         | 
| 43 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 44 | 
            +
                requirements:
         | 
| 45 | 
            +
                - - "~>"
         | 
| 46 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 47 | 
            +
                    version: '1.0'
         | 
| 48 | 
            +
              type: :runtime
         | 
| 49 | 
            +
              prerelease: false
         | 
| 50 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 51 | 
            +
                requirements:
         | 
| 52 | 
            +
                - - "~>"
         | 
| 53 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 54 | 
            +
                    version: '1.0'
         | 
| 27 55 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 28 56 | 
             
              name: bourbon
         | 
| 29 57 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -207,9 +235,12 @@ files: | |
| 207 235 | 
             
            - app/assets/stylesheets/beyond_canvas/utilities/_functions.scss
         | 
| 208 236 | 
             
            - app/assets/stylesheets/beyond_canvas/utilities/_mixins.scss
         | 
| 209 237 | 
             
            - app/controllers/beyond_canvas/application_controller.rb
         | 
| 238 | 
            +
            - app/controllers/beyond_canvas/authentications_controller.rb
         | 
| 210 239 | 
             
            - app/controllers/beyond_canvas/system_controller.rb
         | 
| 240 | 
            +
            - app/controllers/concerns/beyond_canvas/authentication.rb
         | 
| 211 241 | 
             
            - app/controllers/concerns/beyond_canvas/locale_management.rb
         | 
| 212 242 | 
             
            - app/controllers/concerns/beyond_canvas/request_validation.rb
         | 
| 243 | 
            +
            - app/controllers/concerns/beyond_canvas/resource_management.rb
         | 
| 213 244 | 
             
            - app/controllers/concerns/beyond_canvas/status_codes.rb
         | 
| 214 245 | 
             
            - app/form_builders/beyond_canvas/form_builder.rb
         | 
| 215 246 | 
             
            - app/helpers/beyond_canvas/application_helper.rb
         | 
| @@ -219,6 +250,7 @@ files: | |
| 219 250 | 
             
            - app/javascript/beyond_canvas/initializers/flash.js
         | 
| 220 251 | 
             
            - app/javascript/beyond_canvas/initializers/functions.js
         | 
| 221 252 | 
             
            - app/javascript/beyond_canvas/initializers/inputs.js
         | 
| 253 | 
            +
            - app/views/beyond_canvas/authentications/new.html.erb
         | 
| 222 254 | 
             
            - app/views/beyond_canvas/custom/_public_head.html.erb
         | 
| 223 255 | 
             
            - app/views/beyond_canvas/locales/_edit.html.erb
         | 
| 224 256 | 
             
            - app/views/beyond_canvas/mailer/_button.html.erb
         | 
| @@ -232,20 +264,32 @@ files: | |
| 232 264 | 
             
            - app/views/layouts/beyond_canvas/public.html.erb
         | 
| 233 265 | 
             
            - config/initializers/beyond_canvas/filter_parameter_logging.rb
         | 
| 234 266 | 
             
            - config/initializers/beyond_canvas/form_utils.rb
         | 
| 267 | 
            +
            - config/locales/en.yml
         | 
| 235 268 | 
             
            - config/routes.rb
         | 
| 236 269 | 
             
            - lib/beyond_canvas.rb
         | 
| 237 270 | 
             
            - lib/beyond_canvas/asset_registration.rb
         | 
| 238 271 | 
             
            - lib/beyond_canvas/configuration.rb
         | 
| 239 272 | 
             
            - lib/beyond_canvas/engine.rb
         | 
| 273 | 
            +
            - lib/beyond_canvas/models/authentication.rb
         | 
| 274 | 
            +
            - lib/beyond_canvas/models/shop.rb
         | 
| 275 | 
            +
            - lib/beyond_canvas/models/utils.rb
         | 
| 276 | 
            +
            - lib/beyond_canvas/parameter_sanitizer.rb
         | 
| 277 | 
            +
            - lib/beyond_canvas/rails/routes.rb
         | 
| 240 278 | 
             
            - lib/beyond_canvas/version.rb
         | 
| 241 279 | 
             
            - lib/generators/beyond_canvas/assets/assets_generator.rb
         | 
| 242 280 | 
             
            - lib/generators/beyond_canvas/assets/templates/beyond_canvas.js
         | 
| 243 281 | 
             
            - lib/generators/beyond_canvas/assets/templates/beyond_canvas.scss
         | 
| 282 | 
            +
            - lib/generators/beyond_canvas/auth_model/auth_model_generator.rb
         | 
| 283 | 
            +
            - lib/generators/beyond_canvas/auth_model/templates/migration.erb
         | 
| 284 | 
            +
            - lib/generators/beyond_canvas/auth_model/templates/model.erb
         | 
| 244 285 | 
             
            - lib/generators/beyond_canvas/beyond_api/beyond_api_generator.rb
         | 
| 286 | 
            +
            - lib/generators/beyond_canvas/controller/controller_generator.rb
         | 
| 287 | 
            +
            - lib/generators/beyond_canvas/controller/templates/controller.erb
         | 
| 245 288 | 
             
            - lib/generators/beyond_canvas/custom_styles/custom_styles_generator.rb
         | 
| 246 289 | 
             
            - lib/generators/beyond_canvas/custom_styles/templates/beyond_canvas_custom_styles.sass
         | 
| 247 290 | 
             
            - lib/generators/beyond_canvas/install/install_generator.rb
         | 
| 248 291 | 
             
            - lib/generators/beyond_canvas/install/templates/beyond_canvas.rb.erb
         | 
| 292 | 
            +
            - lib/generators/beyond_canvas/views/views_generator.rb
         | 
| 249 293 | 
             
            - lib/generators/beyond_canvas/webpacker/plugins/jquery.js
         | 
| 250 294 | 
             
            - lib/generators/beyond_canvas/webpacker/templates/beyond_canvas.js
         | 
| 251 295 | 
             
            - lib/generators/beyond_canvas/webpacker/templates/beyond_canvas.scss
         | 
| @@ -269,7 +313,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 269 313 | 
             
                - !ruby/object:Gem::Version
         | 
| 270 314 | 
             
                  version: 1.3.1
         | 
| 271 315 | 
             
            requirements: []
         | 
| 272 | 
            -
            rubygems_version: 3.0. | 
| 316 | 
            +
            rubygems_version: 3.0.3
         | 
| 273 317 | 
             
            signing_key: 
         | 
| 274 318 | 
             
            specification_version: 4
         | 
| 275 319 | 
             
            summary: Open-source framework that provides CSS styles
         |