houdini/lib/nonprofit_creation.rb

63 lines
1.9 KiB
Ruby

# frozen_string_literal: true
#
# License: AGPL-3.0-or-later WITH WTO-AP-3.0-or-later
# Full license explanation at https://github.com/houdiniproject/houdini/blob/master/LICENSE
#
# NOTE: this should be moved to bess when Nonprofit and wiki is
class NonprofitCreation
def initialize(result, options = nil)
result = sanitize_optional_fields(result)
@nonprofit = ::Nonprofit.new(result[:nonprofit].merge({ register_np_only: true }))
@user = User.new(result[:user])
@options = options
end
def call
@user.skip_confirmation! if @options&.dig(:no_confirm_admin)
result = {}
ActiveRecord::Base.transaction do
result = if @user.save && @nonprofit.save && roles.each(&:save)
{ success: true, messages: ["Nonprofit #{@nonprofit.id} successfully created."] }
else
retrieve_error_messages
end
end
result
end
private
def retrieve_error_messages
result = { success: false, messages: [] }
result = retrieve_user_error_messages(result)
result = retrieve_nonprofit_error_messages(result)
retrieve_roles_error_messages(result)
end
def retrieve_user_error_messages(result)
@user.errors.full_messages.each { |i| result[:messages] << "Error creating user: #{i}" }
result
end
def retrieve_nonprofit_error_messages(result)
@nonprofit.errors.full_messages.each { |i| result[:messages] << "Error creating nonprofit: #{i}" }
result
end
def retrieve_roles_error_messages(result)
roles.each { |role| role.errors.full_messages.each { |i| result[:messages] << "Error creating role: #{i}" } }
result
end
def roles
roles = [Role.new(host: @nonprofit, name: 'nonprofit_admin', user: @user)]
roles << Role.new(host: @nonprofit, name: 'super_admin', user: @user) if @options&.dig(:super_admin)
roles
end
def sanitize_optional_fields(result)
result.transform_values! { |keys| keys.transform_values! { |value| value&.empty? ? nil : value } }
end
end