42 lines
1,001 B
Ruby
42 lines
1,001 B
Ruby
|
module Discussions
|
||
|
class UpdateDiffPositionService < BaseService
|
||
|
def execute(discussion)
|
||
|
result = tracer.trace(discussion.position)
|
||
|
return unless result
|
||
|
|
||
|
position = result[:position]
|
||
|
outdated = result[:outdated]
|
||
|
|
||
|
discussion.notes.each do |note|
|
||
|
if outdated
|
||
|
note.change_position = position
|
||
|
else
|
||
|
note.position = position
|
||
|
note.change_position = nil
|
||
|
end
|
||
|
end
|
||
|
|
||
|
Note.transaction do
|
||
|
discussion.notes.each do |note|
|
||
|
Gitlab::Timeless.timeless(note, &:save)
|
||
|
end
|
||
|
|
||
|
if outdated && current_user
|
||
|
SystemNoteService.diff_discussion_outdated(discussion, project, current_user, position)
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def tracer
|
||
|
@tracer ||= Gitlab::Diff::PositionTracer.new(
|
||
|
project: project,
|
||
|
old_diff_refs: params[:old_diff_refs],
|
||
|
new_diff_refs: params[:new_diff_refs],
|
||
|
paths: params[:paths]
|
||
|
)
|
||
|
end
|
||
|
end
|
||
|
end
|