lib/much-rails/save_service.rb in much-rails-0.1.3 vs lib/much-rails/save_service.rb in much-rails-0.2.0
- old
+ new
@@ -2,10 +2,11 @@
require "active_record"
require "much-rails/mixin"
require "much-rails/result"
require "much-rails/service"
+require "much-rails/service_validation_errors"
module MuchRails; end
# MuchRails::SaveService is a common mix-in for all service objects that
# save (e.g. create/update) records.
@@ -15,17 +16,53 @@
mixin_included do
include MuchRails::Service
around_call do |receiver|
receiver.call
- rescue ActiveRecord::RecordInvalid => ex
+ rescue *MuchRails::SaveService::ValidationErrors.exception_classes => ex
set_the_return_value_for_the_call_method(
- MuchRails::Result.failure(
- record: ex.record,
- exception: ex,
- validation_errors: ex.record&.errors.to_h,
- validation_error_messages: ex.record&.errors&.full_messages.to_a,
- ),
+ MuchRails::SaveService::ValidationErrors.result_for(ex),
+ )
+ end
+ end
+
+ module ValidationErrors
+ def self.add(exception_class, &block)
+ service_validation_errors.add(exception_class, &block)
+ end
+
+ def self.exception_classes
+ service_validation_errors.exception_classes
+ end
+
+ def self.result_for(ex)
+ service_validation_errors.result_for(ex)
+ end
+
+ def self.service_validation_errors
+ @service_validation_errors ||=
+ MuchRails::ServiceValidationErrors
+ .new
+ .tap do |e|
+ e.add(ActiveRecord::RecordInvalid) do |ex|
+ MuchRails::SaveService::FailureResult.new(
+ record: ex.record,
+ exception: ex,
+ validation_errors: ex.record&.errors.to_h,
+ validation_error_messages:
+ ex.record&.errors&.full_messages.to_a,
+ )
+ end
+ end
+ end
+ end
+
+ module FailureResult
+ def self.new(exception:, validation_errors:, **kargs)
+ MuchResult.failure(
+ exception: exception,
+ validation_errors: validation_errors,
+ **kargs,
)
end
end
end