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