class Nor::BackendGenerator

Attributes

mount_path[R]
user_class[R]

Public Class Methods

new(args, *options) click to toggle source
Calls superclass method
# File lib/generators/nor/backend/backend_generator.rb, line 9
def initialize(args, *options)
  raise 'Next On Rails can be installed only on a Rails API app! Please create a new app with `rails new APPNAME --api`' unless rails_api?

  super
  @user_class = args[0] || 'User'
  @mount_path = args[1] || 'auth'
end
next_migration_number(_path) click to toggle source
# File lib/generators/nor/backend/backend_generator.rb, line 117
def self.next_migration_number(_path)
  Time.zone.now.utc.strftime('%Y%m%d%H%M%S')
end

Public Instance Methods

install_application_controller() click to toggle source
# File lib/generators/nor/backend/backend_generator.rb, line 59
def install_application_controller
  remove_file 'app/controllers/application_controller.rb'
  template 'application_controller.rb', 'app/controllers/application_controller.rb'
end
install_cors_config() click to toggle source
# File lib/generators/nor/backend/backend_generator.rb, line 69
    def install_cors_config
      config = <<~CONFIG
        Rails.application.config.middleware.insert_before 0, Rack::Cors do
          allow do
            origins 'localhost:3001'

            resource '*',
              headers: :any,
              methods: [:get, :post, :put, :patch, :delete, :options, :head],
              expose: [
                DeviseTokenAuth.headers_names[:'access-token'],
                DeviseTokenAuth.headers_names[:client],
                DeviseTokenAuth.headers_names[:expiry],
                DeviseTokenAuth.headers_names[:uid],
                DeviseTokenAuth.headers_names[:'token-type']
              ]
          end
        end
      CONFIG
      append_to_file 'config/initializers/cors.rb', config
    end
install_devise_config() click to toggle source
# File lib/generators/nor/backend/backend_generator.rb, line 64
def install_devise_config
  template File.join(Gem.loaded_specs['devise'].full_gem_path, 'lib/generators/templates/devise.rb'), 'config/initializers/devise.rb'
  gsub_file 'config/initializers/devise.rb', "require 'devise/orm/'", "# require 'devise/orm/'" if File.exist?('config/initializers/devise.rb')
end
install_devise_token_auth() click to toggle source
# File lib/generators/nor/backend/backend_generator.rb, line 25
    def install_devise_token_auth
      generate 'devise_token_auth:install', @user_class, @mount_path
      config = <<~CONFIG

        \s\s# Configure default URLs and redirects
        \s\sconfig.default_confirm_success_url = 'http://localhost:3001/'
        \s\sconfig.default_password_reset_url = 'http://localhost:3001/change-password'
        \s\sconfig.redirect_whitelist = ['http://localhost:3001/*']

        \s\s# If config.check_current_password_before_update is set to :attributes the
        \s\s# current_password param is checked before any update, if it is set to
        \s\s# :password the current_password param is checked only if the request
        \s\s# updates user password. Default current_password is never checked.
        \s\sconfig.check_current_password_before_update = :password
      CONFIG
      insert_into_file 'config/initializers/devise_token_auth.rb', config, before: /end$/
    end
install_routes() click to toggle source
# File lib/generators/nor/backend/backend_generator.rb, line 43
    def install_routes
      custom_routes = <<~ROUTES
        , controllers: {
            confirmations:      'next_on_rails/devise_token_auth_override/confirmations',
            omniauth_callbacks: 'next_on_rails/devise_token_auth_override/omniauth_callbacks',
            passwords:          'next_on_rails/devise_token_auth_override/passwords',
            registrations:      'next_on_rails/devise_token_auth_override/registrations',
            sessions:           'next_on_rails/devise_token_auth_override/sessions',
            token_validations:  'next_on_rails/devise_token_auth_override/token_validations',
            unlocks:            'next_on_rails/devise_token_auth_override/unlocks'
          }
        mount NextOnRails::Engine => '/'
      ROUTES
      insert_into_file 'config/routes.rb', custom_routes, after: "mount_devise_token_auth_for '#{@user_class}', at: '#{@mount_path}'"
    end
install_user() click to toggle source
# File lib/generators/nor/backend/backend_generator.rb, line 17
def install_user
  model_file = "app/models/#{user_class.singularize.gsub('::', '').underscore}.rb"
  template 'user.rb', model_file unless File.exist?(model_file)

  migration_file = "devise_token_auth_create_#{user_class.pluralize.gsub('::', '').underscore}"
  migration_template 'user_migration.rb', File.join('db', 'migrate', "#{migration_file}.rb") unless self.class.migration_exists?('db/migrate', migration_file)
end
install_user_serializer() click to toggle source
# File lib/generators/nor/backend/backend_generator.rb, line 91
def install_user_serializer
  template 'user_serializer.rb', "app/serializers/#{@user_class.underscore}_serializer.rb"
  template 'current_user_serializer.rb', "app/serializers/current_#{@user_class.underscore}_serializer.rb"
end
remove_wrap_parameters() click to toggle source
# File lib/generators/nor/backend/backend_generator.rb, line 96
def remove_wrap_parameters
  gsub_file 'config/initializers/wrap_parameters.rb', 'wrap_parameters format: [:json]', 'wrap_parameters format: []'
end
setup_gems() click to toggle source
# File lib/generators/nor/backend/backend_generator.rb, line 100
    def setup_gems
      gem_group :development do
        gem 'foreman'
        gem 'letter_opener'
      end
      template 'Procfile'
      config = <<~CONFIG

        \s\s# Mailer setup
        \s\sconfig.action_mailer.preview_path = Rails.root.join('test', 'mailers', 'previews')
        \s\sconfig.action_mailer.delivery_method = :letter_opener
        \s\sconfig.action_mailer.raise_delivery_errors = true
        \s\sconfig.action_mailer.default_url_options = { host: 'http://localhost:3000' }
      CONFIG
      insert_into_file 'config/environments/development.rb', config, before: /end$/
    end

Protected Instance Methods

rails_api?() click to toggle source
# File lib/generators/nor/backend/backend_generator.rb, line 123
def rails_api?
  filename = 'config/application.rb'
  str = 'config.api_only = true'
  str.in?(File.read(filename))
end