diff options
author | Reuben Pereira <rpereira@gitlab.com> | 2019-07-16 22:20:43 +0300 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2019-07-16 22:20:43 +0300 |
commit | 0d84010d1c374fe3cfdbc3b067e4502e56b6a8b3 (patch) | |
tree | 9e7a5e3c403383d206c77ecc4167983b2ad05ba0 /app/models/concerns/stepable.rb | |
parent | 58d220bd66fc60cc05b4197328015a7be5593147 (diff) |
Don't use transactions and exceptions
Instead return error objects.
Diffstat (limited to 'app/models/concerns/stepable.rb')
-rw-r--r-- | app/models/concerns/stepable.rb | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/app/models/concerns/stepable.rb b/app/models/concerns/stepable.rb new file mode 100644 index 00000000000..d00a049a004 --- /dev/null +++ b/app/models/concerns/stepable.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +module Stepable + extend ActiveSupport::Concern + + def steps + self.class._all_steps + end + + def execute_steps + initial_result = {} + + steps.inject(initial_result) do |previous_result, callback| + result = method(callback).call + + if result[:status] == :error + result[:failed_step] = callback + + break result + end + + previous_result.merge(result) + end + end + + class_methods do + def _all_steps + @_all_steps ||= [] + end + + def steps(*methods) + _all_steps.concat methods + end + end +end |