diff options
author | Douwe Maan <douwe@gitlab.com> | 2015-03-06 16:21:23 +0000 |
---|---|---|
committer | Douwe Maan <douwe@gitlab.com> | 2015-03-06 16:21:23 +0000 |
commit | 76802012e62a70bd040ec5cb8efa7e357dda0eee (patch) | |
tree | a0d85dcfb27c34aaede8c7183c9482248d6bee7f /lib | |
parent | 8b53d9efe648f10e0572c2d8017489d0d3bb4755 (diff) | |
parent | 7e204cf389346d23e71bc4c2fa9e14cf82a7ed2e (diff) | |
download | gitlab-ce-76802012e62a70bd040ec5cb8efa7e357dda0eee.tar.gz |
Merge branch 'add-notes-notifications-to-services' into 'master'
Add notes notifications to services
This merge request builds on top of a few other merge requests:
* https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/237
* https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/350
The purpose of this merge request is to add service notification support when a user comments on one of the following:
* commits
* issues
* merge requests
* code snippets
Currently HipChat and Slack are only supported. The admin can select which events to toggle on or off.
## Questions
All note events are bundled under the `note` event type. Is this okay, or does it make more sense to have individual events and/or change the `object_type` attribute in the hook data?
Also, does it look better to link the entire `merge request #X` as opposed to just `#X`? I like the former.
## Before

## After

### Slack

### HipChat

See merge request !358
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab/note_data_builder.rb | 77 | ||||
-rw-r--r-- | lib/gitlab/url_builder.rb | 29 |
2 files changed, 106 insertions, 0 deletions
diff --git a/lib/gitlab/note_data_builder.rb b/lib/gitlab/note_data_builder.rb new file mode 100644 index 00000000000..644dec45dca --- /dev/null +++ b/lib/gitlab/note_data_builder.rb @@ -0,0 +1,77 @@ +module Gitlab + class NoteDataBuilder + class << self + # Produce a hash of post-receive data + # + # For all notes: + # + # data = { + # object_kind: "note", + # user: { + # name: String, + # username: String, + # avatar_url: String + # } + # project_id: Integer, + # repository: { + # name: String, + # url: String, + # description: String, + # homepage: String, + # } + # object_attributes: { + # <hook data for note> + # } + # <note-specific data>: { + # } + # note-specific data is a hash with one of the following keys and contains + # the hook data for that type. + # - commit + # - issue + # - merge_request + # - snippet + # + def build(note, user) + project = note.project + data = build_base_data(project, user, note) + + if note.for_commit? + data[:commit] = build_data_for_commit(project, user, note) + elsif note.for_issue? + data[:issue] = note.noteable.hook_attrs + elsif note.for_merge_request? + data[:merge_request] = note.noteable.hook_attrs + elsif note.for_project_snippet? + data[:snippet] = note.noteable.hook_attrs + end + + data + end + + def build_base_data(project, user, note) + base_data = { + object_kind: "note", + user: user.hook_attrs, + project_id: project.id, + repository: { + name: project.name, + url: project.url_to_repo, + description: project.description, + homepage: project.web_url, + }, + object_attributes: note.hook_attrs + } + + base_data[:object_attributes][:url] = + Gitlab::UrlBuilder.new(:note).build(note.id) + base_data + end + + def build_data_for_commit(project, user, note) + # commit_id is the SHA hash + commit = project.repository.commit(note.commit_id) + commit.hook_attrs(project) + end + end + end +end diff --git a/lib/gitlab/url_builder.rb b/lib/gitlab/url_builder.rb index ab7c8ad89f3..6830d15875a 100644 --- a/lib/gitlab/url_builder.rb +++ b/lib/gitlab/url_builder.rb @@ -13,6 +13,9 @@ module Gitlab build_issue_url(id) when :merge_request build_merge_request_url(id) + when :note + build_note_url(id) + end end @@ -27,5 +30,31 @@ module Gitlab merge_request = MergeRequest.find(id) merge_request_url(merge_request, host: Gitlab.config.gitlab['url']) end + + def build_note_url(id) + note = Note.find(id) + if note.for_commit? + namespace_project_commit_url(namespace_id: note.project.namespace, + id: note.commit_id, + project_id: note.project, + host: Gitlab.config.gitlab['url'], + anchor: "note_#{note.id}") + elsif note.for_issue? + issue = Issue.find(note.noteable_id) + issue_url(issue, + host: Gitlab.config.gitlab['url'], + anchor: "note_#{note.id}") + elsif note.for_merge_request? + merge_request = MergeRequest.find(note.noteable_id) + merge_request_url(merge_request, + host: Gitlab.config.gitlab['url'], + anchor: "note_#{note.id}") + elsif note.for_project_snippet? + snippet = Snippet.find(note.noteable_id) + snippet_url(snippet, + host: Gitlab.config.gitlab['url'], + anchor: "note_#{note.id}") + end + end end end |