diff --git a/app/events/pages/page_deployed_event.rb b/app/events/pages/page_deployed_event.rb new file mode 100644 index 0000000000000000000000000000000000000000..52e53772a517c912aedd91829894671aa34e8ba4 --- /dev/null +++ b/app/events/pages/page_deployed_event.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module Pages + class PageDeployedEvent < ::Gitlab::EventStore::Event + def schema + { + 'type' => 'object', + 'properties' => { + 'project_id' => { 'type' => 'integer' }, + 'namespace_id' => { 'type' => 'integer' }, + 'root_namespace_id' => { 'type' => 'integer' } + }, + 'required' => %w[project_id namespace_id root_namespace_id] + } + end + end +end diff --git a/app/services/projects/update_pages_service.rb b/app/services/projects/update_pages_service.rb index 8ded2516b97a1713a17809279acaff622dd2dd19..217c492bd72daeaed41451fc6a9d86b34bf7c220 100644 --- a/app/services/projects/update_pages_service.rb +++ b/app/services/projects/update_pages_service.rb @@ -53,6 +53,7 @@ def execute def success @commit_status.success @project.mark_pages_as_deployed + publish_deployed_event super end @@ -203,6 +204,16 @@ def entries_count def pages_file_entries_limit project.actual_limits.pages_file_entries end + + def publish_deployed_event + event = ::Pages::PageDeployedEvent.new(data: { + project_id: project.id, + namespace_id: project.namespace_id, + root_namespace_id: project.root_namespace.id + }) + + Gitlab::EventStore.publish(event) + end end end diff --git a/spec/events/pages/page_deployed_event_spec.rb b/spec/events/pages/page_deployed_event_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..0c33a95b281a8e6d14344815e4fa557ea7411ddf --- /dev/null +++ b/spec/events/pages/page_deployed_event_spec.rb @@ -0,0 +1,34 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Pages::PageDeployedEvent do + where(:data, :valid) do + [ + [{ project_id: 1, namespace_id: 2, root_namespace_id: 3 }, true], + [{ project_id: 1 }, false], + [{ namespace_id: 1 }, false], + [{ project_id: 'foo', namespace_id: 2 }, false], + [{ project_id: 1, namespace_id: 'foo' }, false], + [{ project_id: [], namespace_id: 2 }, false], + [{ project_id: 1, namespace_id: [] }, false], + [{ project_id: {}, namespace_id: 2 }, false], + [{ project_id: 1, namespace_id: {} }, false], + ['foo', false], + [123, false], + [[], false] + ] + end + + with_them do + it 'validates data' do + constructor = -> { described_class.new(data: data) } + + if valid + expect { constructor.call }.not_to raise_error + else + expect { constructor.call }.to raise_error(Gitlab::EventStore::InvalidEvent) + end + end + end +end diff --git a/spec/services/projects/update_pages_service_spec.rb b/spec/services/projects/update_pages_service_spec.rb index cbbed82aa0bf9878d1c855f8f600d2876e9af9ac..06e39ccc8c73d8e4274fdf02dd4e121f4e111ff6 100644 --- a/spec/services/projects/update_pages_service_spec.rb +++ b/spec/services/projects/update_pages_service_spec.rb @@ -43,6 +43,16 @@ expect(project.pages_deployed?).to be_truthy end + it 'publishes a PageDeployedEvent event with project id and namespace id' do + expected_data = { + project_id: project.id, + namespace_id: project.namespace_id, + root_namespace_id: project.root_namespace.id + } + + expect { subject.execute }.to publish_event(Pages::PageDeployedEvent).with(expected_data) + end + it 'creates pages_deployment and saves it in the metadata' do expect do expect(execute).to eq(:success)