summaryrefslogtreecommitdiff
path: root/lib/gitlab/hook_data/issuable_builder.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/hook_data/issuable_builder.rb')
-rw-r--r--lib/gitlab/hook_data/issuable_builder.rb36
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/gitlab/hook_data/issuable_builder.rb b/lib/gitlab/hook_data/issuable_builder.rb
new file mode 100644
index 00000000000..e817c6af94a
--- /dev/null
+++ b/lib/gitlab/hook_data/issuable_builder.rb
@@ -0,0 +1,36 @@
+module Gitlab
+ module HookData
+ class IssuableBuilder
+ attr_accessor :issuable
+
+ def initialize(issuable)
+ @issuable = issuable
+ end
+
+ def build(user: nil, changes: {})
+ hook_data = {
+ object_kind: issuable.class.name.underscore,
+ user: user.hook_attrs,
+ project: issuable.project.hook_attrs,
+ object_attributes: issuable.hook_attrs,
+ labels: issuable.labels.map(&:hook_attrs),
+ changes: changes.slice(*safe_keys),
+ # DEPRECATED
+ repository: issuable.project.hook_attrs.slice(:name, :url, :description, :homepage)
+ }
+
+ if issuable.is_a?(Issue)
+ hook_data[:assignees] = issuable.assignees.map(&:hook_attrs) if issuable.assignees.any?
+ else
+ hook_data[:assignee] = issuable.assignee.hook_attrs if issuable.assignee
+ end
+
+ hook_data
+ end
+
+ def safe_keys
+ issuable.class.safe_hook_attributes + issuable.class.safe_hook_relations
+ end
+ end
+ end
+end