summaryrefslogtreecommitdiff
path: root/app/models/concerns/stepable.rb
diff options
context:
space:
mode:
authorReuben Pereira <rpereira@gitlab.com>2019-07-16 19:20:43 +0000
committerStan Hu <stanhu@gmail.com>2019-07-16 19:20:43 +0000
commit0d84010d1c374fe3cfdbc3b067e4502e56b6a8b3 (patch)
tree9e7a5e3c403383d206c77ecc4167983b2ad05ba0 /app/models/concerns/stepable.rb
parent58d220bd66fc60cc05b4197328015a7be5593147 (diff)
downloadgitlab-ce-0d84010d1c374fe3cfdbc3b067e4502e56b6a8b3.tar.gz
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.rb35
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