summaryrefslogtreecommitdiff
path: root/app/models/concerns/web_hooks/has_web_hooks.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/concerns/web_hooks/has_web_hooks.rb')
-rw-r--r--app/models/concerns/web_hooks/has_web_hooks.rb46
1 files changed, 46 insertions, 0 deletions
diff --git a/app/models/concerns/web_hooks/has_web_hooks.rb b/app/models/concerns/web_hooks/has_web_hooks.rb
new file mode 100644
index 00000000000..161ce106b9b
--- /dev/null
+++ b/app/models/concerns/web_hooks/has_web_hooks.rb
@@ -0,0 +1,46 @@
+# frozen_string_literal: true
+
+module WebHooks
+ module HasWebHooks
+ extend ActiveSupport::Concern
+
+ WEB_HOOK_CACHE_EXPIRY = 1.hour
+
+ def any_hook_failed?
+ hooks.disabled.exists?
+ end
+
+ def web_hook_failure_redis_key
+ "any_web_hook_failed:#{id}"
+ end
+
+ def last_failure_redis_key
+ "web_hooks:last_failure:project-#{id}"
+ end
+
+ def get_web_hook_failure
+ Gitlab::Redis::SharedState.with do |redis|
+ current = redis.get(web_hook_failure_redis_key)
+
+ Gitlab::Utils.to_boolean(current) if current
+ end
+ end
+
+ def fetch_web_hook_failure
+ Gitlab::Redis::SharedState.with do |_redis|
+ current = get_web_hook_failure
+ next current unless current.nil?
+
+ cache_web_hook_failure
+ end
+ end
+
+ def cache_web_hook_failure(state = any_hook_failed?)
+ Gitlab::Redis::SharedState.with do |redis|
+ redis.set(web_hook_failure_redis_key, state.to_s, ex: WEB_HOOK_CACHE_EXPIRY)
+
+ state
+ end
+ end
+ end
+end