lib/generators/devise_token_auth/install_generator.rb
# frozen_string_literal: true
require_relative 'install_generator_helpers'
module DeviseTokenAuth
class InstallGenerator < Rails::Generators::Base
include Rails::Generators::Migration
include DeviseTokenAuth::InstallGeneratorHelpers
class_option :primary_key_type, type: :string, desc: 'The type for primary key'
def copy_migrations
if self.class.migration_exists?('db/migrate', "devise_token_auth_create_#{user_class.pluralize.gsub('::','').underscore}")
say_status('skipped', "Migration 'devise_token_auth_create_#{user_class.pluralize.gsub('::','').underscore}' already exists")
else
migration_template(
'devise_token_auth_create_users.rb.erb',
"db/migrate/devise_token_auth_create_#{user_class.pluralize.gsub('::','').underscore}.rb"
)
end
end
def create_user_model
fname = "app/models/#{user_class.underscore}.rb"
if File.exist?(File.join(destination_root, fname))
inclusion = 'include DeviseTokenAuth::Concerns::User'
unless parse_file_for_line(fname, inclusion)
active_record_needle = (Rails::VERSION::MAJOR >= 5) ? 'ApplicationRecord' : 'ActiveRecord::Base'
inject_into_file fname, after: "class #{user_class} < #{active_record_needle}\n" do <<-'RUBY'
# Include default devise modules.
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable, :omniauthable
include DeviseTokenAuth::Concerns::User
RUBY
end
end
else
template('user.rb.erb', fname)
end
end
private
def self.next_migration_number(path)
Time.zone.now.utc.strftime('%Y%m%d%H%M%S')
end
def json_supported_database?
(postgres? && postgres_correct_version?) || (mysql? && mysql_correct_version?)
end
def postgres?
database_name == 'ActiveRecord::ConnectionAdapters::PostgreSQLAdapter'
end
def postgres_correct_version?
database_version > '9.3'
end
def mysql?
database_name == 'ActiveRecord::ConnectionAdapters::MysqlAdapter'
end
def mysql_correct_version?
database_version > '5.7.7'
end
def database_name
ActiveRecord::Base.connection.class.name
end
def database_version
ActiveRecord::Base.connection.select_value('SELECT VERSION()')
end
def rails_5_or_newer?
Rails::VERSION::MAJOR >= 5
end
def primary_key_type
primary_key_string if rails_5_or_newer?
end
def primary_key_string
key_string = options[:primary_key_type]
", id: :#{key_string}" if key_string
end
end
end