summaryrefslogtreecommitdiff
path: root/lib/gitlab/event_store/event.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/gitlab/event_store/event.rb')
-rw-r--r--lib/gitlab/event_store/event.rb54
1 files changed, 54 insertions, 0 deletions
diff --git a/lib/gitlab/event_store/event.rb b/lib/gitlab/event_store/event.rb
new file mode 100644
index 00000000000..ee0c329b8e8
--- /dev/null
+++ b/lib/gitlab/event_store/event.rb
@@ -0,0 +1,54 @@
+# frozen_string_literal: true
+
+# An Event object represents a domain event that occurred in a bounded context.
+# By publishing events we notify other bounded contexts about something
+# that happened, so that they can react to it.
+#
+# Define new event classes under `app/events/<namespace>/` with a name
+# representing something that happened in the past:
+#
+# class Projects::ProjectCreatedEvent < Gitlab::EventStore::Event
+# def schema
+# {
+# 'type' => 'object',
+# 'properties' => {
+# 'project_id' => { 'type' => 'integer' }
+# }
+# }
+# end
+# end
+#
+# To publish it:
+#
+# Gitlab::EventStore.publish(
+# Projects::ProjectCreatedEvent.new(data: { project_id: project.id })
+# )
+#
+module Gitlab
+ module EventStore
+ class Event
+ attr_reader :data
+
+ def initialize(data:)
+ validate_schema!(data)
+ @data = data
+ end
+
+ def schema
+ raise NotImplementedError, 'must specify schema to validate the event'
+ end
+
+ private
+
+ def validate_schema!(data)
+ unless data.is_a?(Hash)
+ raise Gitlab::EventStore::InvalidEvent, "Event data must be a Hash"
+ end
+
+ unless JSONSchemer.schema(schema).valid?(data.deep_stringify_keys)
+ raise Gitlab::EventStore::InvalidEvent, "Data for event #{self.class} does not match the defined schema: #{schema}"
+ end
+ end
+ end
+ end
+end