From 33795139ea8e72756bee3675b4e16387425e6ab1 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Wed, 19 Feb 2020 18:09:10 +0000 Subject: Add latest changes from gitlab-org/gitlab@master --- .../resource_events/change_milestone_service.rb | 50 ++++++++++++++++++++++ .../resource_events/merge_into_notes_service.rb | 9 +++- .../synthetic_milestone_notes_builder_service.rb | 31 ++++++++++++++ 3 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 app/services/resource_events/change_milestone_service.rb create mode 100644 app/services/resource_events/synthetic_milestone_notes_builder_service.rb (limited to 'app/services/resource_events') diff --git a/app/services/resource_events/change_milestone_service.rb b/app/services/resource_events/change_milestone_service.rb new file mode 100644 index 00000000000..bad7d002c65 --- /dev/null +++ b/app/services/resource_events/change_milestone_service.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +module ResourceEvents + class ChangeMilestoneService + attr_reader :resource, :user, :event_created_at, :resource_args + + def initialize(resource:, user:, created_at: Time.now) + @resource = resource + @user = user + @event_created_at = created_at + + @resource_args = { + user_id: user.id, + created_at: event_created_at + } + end + + def execute + args = build_resource_args + + action = if milestone.nil? + :remove + else + :add + end + + record = args.merge(milestone_id: milestone&.id, action: ResourceMilestoneEvent.actions[action]) + + create_event(record) + end + + private + + def milestone + resource&.milestone + end + + def create_event(record) + ResourceMilestoneEvent.create(record) + + resource.expire_note_etag_cache + end + + def build_resource_args + key = resource.class.name.underscore.foreign_key + + resource_args.merge(key => resource.id, state: ResourceMilestoneEvent.states[resource.state]) + end + end +end diff --git a/app/services/resource_events/merge_into_notes_service.rb b/app/services/resource_events/merge_into_notes_service.rb index 47948fcff6e..4aa9bb80229 100644 --- a/app/services/resource_events/merge_into_notes_service.rb +++ b/app/services/resource_events/merge_into_notes_service.rb @@ -9,6 +9,11 @@ module ResourceEvents class MergeIntoNotesService include Gitlab::Utils::StrongMemoize + SYNTHETIC_NOTE_BUILDER_SERVICES = [ + SyntheticLabelNotesBuilderService, + SyntheticMilestoneNotesBuilderService + ].freeze + attr_reader :resource, :current_user, :params def initialize(resource, current_user, params = {}) @@ -24,7 +29,9 @@ module ResourceEvents private def synthetic_notes - SyntheticLabelNotesBuilderService.new(resource, current_user, params).execute + SYNTHETIC_NOTE_BUILDER_SERVICES.flat_map do |service| + service.new(resource, current_user, params).execute + end end end end diff --git a/app/services/resource_events/synthetic_milestone_notes_builder_service.rb b/app/services/resource_events/synthetic_milestone_notes_builder_service.rb new file mode 100644 index 00000000000..ad58417834e --- /dev/null +++ b/app/services/resource_events/synthetic_milestone_notes_builder_service.rb @@ -0,0 +1,31 @@ +# frozen_string_literal: true + +# We store events about resource milestone changes in a separate table, +# but we still want to display notes about milestone changes +# as classic system notes in UI. This service generates "synthetic" notes for +# milestone event changes. + +module ResourceEvents + class SyntheticMilestoneNotesBuilderService < BaseSyntheticNotesBuilderService + private + + def synthetic_notes + return [] unless tracking_enabled? + + milestone_change_events.map do |event| + MilestoneNote.from_event(event, resource: resource, resource_parent: resource_parent) + end + end + + def milestone_change_events + return [] unless resource.respond_to?(:resource_milestone_events) + + events = resource.resource_milestone_events.includes(user: :status) # rubocop: disable CodeReuse/ActiveRecord + since_fetch_at(events) + end + + def tracking_enabled? + ::Feature.enabled?(:track_resource_milestone_change_events, resource.project) + end + end +end -- cgit v1.2.1