64 lines
1.9 KiB
Ruby
64 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
|