diff options
Diffstat (limited to 'app/serializers/import/github_failure_entity.rb')
-rw-r--r-- | app/serializers/import/github_failure_entity.rb | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/app/serializers/import/github_failure_entity.rb b/app/serializers/import/github_failure_entity.rb new file mode 100644 index 00000000000..8d8b16c2a6d --- /dev/null +++ b/app/serializers/import/github_failure_entity.rb @@ -0,0 +1,178 @@ +# frozen_string_literal: true + +module Import + class GithubFailureEntity < Grape::Entity + expose :type do |failure| + failure.external_identifiers['object_type'] + end + + expose :title do |failure| + title(failure) + end + + expose :provider_url do |failure| + build_url(failure) + end + + expose :details do + expose :exception_class + expose :exception_message + expose :correlation_id_value + expose :source + expose :created_at + expose :github_identifiers do + with_options(expose_nil: false) do + expose(:object_type) { |failure| failure.external_identifiers['object_type'] } + expose(:id) { |failure| failure.external_identifiers['id'] } + expose(:db_id) { |failure| failure.external_identifiers['db_id'] } + expose(:iid) { |failure| failure.external_identifiers['iid'] } + expose(:title) { |failure| failure.external_identifiers['title'] } + expose(:login) { |failure| failure.external_identifiers['login'] } + expose(:event) { |failure| failure.external_identifiers['event'] } + expose(:merge_request_id) { |failure| failure.external_identifiers['merge_request_id'] } + expose(:merge_request_iid) { |failure| failure.external_identifiers['merge_request_iid'] } + expose(:requested_reviewers) { |failure| failure.external_identifiers['requested_reviewers'] } + expose(:note_id) { |failure| failure.external_identifiers['note_id'] } + expose(:noteable_type) { |failure| failure.external_identifiers['noteable_type'] } + expose(:noteable_iid) { |failure| failure.external_identifiers['noteable_iid'] } + expose(:issuable_type) { |failure| failure.external_identifiers['issuable_type'] } + expose(:issuable_iid) { |failure| failure.external_identifiers['issuable_iid'] } + expose(:review_id) { |failure| failure.external_identifiers['review_id'] } + expose(:tag) { |failure| failure.external_identifiers['tag'] } + expose(:oid) { |failure| failure.external_identifiers['oid'] } + expose(:size) { |failure| failure.external_identifiers['size'] } + end + end + end + + private + + # rubocop:disable Metrics/CyclomaticComplexity + def title(failure) + gh_identifiers = failure.external_identifiers + + case gh_identifiers['object_type'] + when 'pull_request', 'issue', 'label', 'milestone' + gh_identifiers['title'] + when 'pull_request_merged_by' + format(s_("GithubImporter|Pull request %{pull_request_iid} merger"), pull_request_iid: gh_identifiers['iid']) + when 'pull_request_review_request' + format( + s_("GithubImporter|Pull request %{pull_request_iid} review request"), + pull_request_iid: gh_identifiers['merge_request_iid'] + ) + when 'pull_request_review' + format(s_("GithubImporter|Pull request review %{review_id}"), review_id: gh_identifiers['review_id']) + when 'collaborator' + gh_identifiers['login'] + when 'protected_branch' + gh_identifiers['id'] + when 'issue_event' + gh_identifiers['event'] + when 'release' + gh_identifiers['tag'] + when 'note' + format( + s_("GithubImporter|%{noteable_type} comment %{note_id}"), + noteable_type: gh_identifiers['noteable_type'], + note_id: gh_identifiers['note_id'] + ) + when 'diff_note' + format(s_("GithubImporter|Pull request review comment %{note_id}"), note_id: gh_identifiers['note_id']) + when 'issue_attachment' + format(s_("GithubImporter|Issue %{issue_iid} attachment"), issue_iid: gh_identifiers['noteable_iid']) + when 'merge_request_attachment' + format( + s_("GithubImporter|Merge request %{merge_request_iid} attachment"), + merge_request_iid: gh_identifiers['noteable_iid'] + ) + when 'release_attachment' + format(s_("GithubImporter|Release %{tag} attachment"), tag: gh_identifiers['tag']) + when 'note_attachment' + s_('GithubImporter|Note attachment') + when 'lfs_object' + gh_identifiers['oid'].to_s + else + '' + end + end + + def build_url(failure) + project = failure.project + gh_identifiers = failure.external_identifiers + github_repo = project.import_source + + host = host(project.import_url) + return '' unless host + + case gh_identifiers['object_type'] + when 'pull_request', 'pull_request_merged_by' + # https://github.com/OWNER/REPO/pull/1 + "#{host}/#{github_repo}/pull/#{gh_identifiers['iid']}" + when 'pull_request_review_request' + # https://github.com/OWNER/REPO/pull/1 + "#{host}/#{github_repo}/pull/#{gh_identifiers['merge_request_iid']}" + when 'pull_request_review' + # https://github.com/OWNER/REPO/pull/1#pullrequestreview-1219894643 + "#{host}/#{github_repo}/pull/#{gh_identifiers['merge_request_iid']}" \ + "#pullrequestreview-#{gh_identifiers['review_id']}" + when 'issue' + # https://github.com/OWNER/REPO/issues/1 + "#{host}/#{github_repo}/issues/#{gh_identifiers['iid']}" + when 'collaborator' + # https://github.com/USER_NAME + "#{host}/#{gh_identifiers['login']}" + when 'protected_branch' + branch = escape(gh_identifiers['id']) + + # https://github.com/OWNER/REPO/tree/BRANCH_NAME + "#{host}/#{github_repo}/tree/#{branch}" + when 'issue_event' + # https://github.com/OWNER/REPO/issues/1#event-8356623615 + "#{host}/#{github_repo}/issues/#{gh_identifiers['issuable_iid']}#event-#{gh_identifiers['id']}" + when 'label' + label = escape(gh_identifiers['title']) + + # https://github.com/OWNER/REPO/labels/bug + "#{host}/#{github_repo}/labels/#{label}" + when 'milestone' + # https://github.com/OWNER/REPO/milestone/1 + "#{host}/#{github_repo}/milestone/#{gh_identifiers['iid']}" + when 'release', 'release_attachment' + tag = escape(gh_identifiers['tag']) + + # https://github.com/OWNER/REPO/releases/tag/v1.0 + "#{host}/#{github_repo}/releases/tag/#{tag}" + when 'note' + # https://github.com/OWNER/REPO/issues/2#issuecomment-1480755368 + "#{host}/#{github_repo}/issues/#{gh_identifiers['noteable_iid']}#issuecomment-#{gh_identifiers['note_id']}" + when 'diff_note' + # https://github.com/OWNER/REPO/pull/1#discussion_r1050098241 + "#{host}/#{github_repo}/pull/#{gh_identifiers['noteable_iid']}#discussion_r#{gh_identifiers['note_id']}" + when 'issue_attachment' + # https://github.com/OWNER/REPO/issues/1 + "#{host}/#{github_repo}/issues/#{gh_identifiers['noteable_iid']}" + when 'merge_request_attachment' + # https://github.com/OWNER/REPO/pull/1 + "#{host}/#{github_repo}/pull/#{gh_identifiers['noteable_iid']}" + when 'lfs_object', 'note_attachment' + # we can't build url to lfs objects and note attachments + '' + else + '' + end + end + # rubocop:enable Metrics/CyclomaticComplexity + + def host(uri) + parsed_uri = URI.parse(uri) + "#{parsed_uri.scheme}://#{parsed_uri.hostname}" + rescue URI::InvalidURIError + nil + end + + def escape(str) + CGI.escape(str) + end + end +end |