# frozen_string_literal: true module Gitlab module GithubImport module Importer class PullRequestReviewImporter def initialize(review, project, client) @review = review @project = project @client = client @merge_request = project.merge_requests.find_by_id(review.merge_request_id) end def execute user_finder = GithubImport::UserFinder.new(project, client) gitlab_user_id = user_finder.user_id_for(review.author) if gitlab_user_id add_review_note!(gitlab_user_id) add_approval!(gitlab_user_id) else add_complementary_review_note!(project.creator_id) end end private attr_reader :review, :merge_request, :project, :client def add_review_note!(author_id) return if review.note.empty? add_note!(author_id, review_note_content) end def add_complementary_review_note!(author_id) return if review.note.empty? && !review.approval? note = "*Created by %{login}*\n\n%{note}" % { note: review_note_content, login: review.author.login } add_note!(author_id, note) end def review_note_content header = "**Review:** #{review.review_type.humanize}" if review.note.present? "#{header}\n\n#{review.note}" else header end end def add_note!(author_id, note) note = Note.new(note_attributes(author_id, note)) note.save! end def note_attributes(author_id, note, extra = {}) { importing: true, noteable_id: merge_request.id, noteable_type: 'MergeRequest', project_id: project.id, author_id: author_id, note: note, system: false, created_at: review.submitted_at, updated_at: review.submitted_at }.merge(extra) end def add_approval!(user_id) return unless review.review_type == 'APPROVED' add_approval_system_note!(user_id) merge_request.approvals.create!( user_id: user_id, created_at: review.submitted_at ) end def add_approval_system_note!(user_id) attributes = note_attributes( user_id, 'approved this merge request', system: true, system_note_metadata: SystemNoteMetadata.new(action: 'approved') ) Note.create!(attributes) end end end end end