Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 75 additions & 16 deletions lib/sequent/core/projector.rb
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,16 @@ class Projector
include Helpers::MessageHandler
include Migratable
extend ActiveSupport::DescendantsTracker
class NotManagedByThisProjector < RuntimeError
def initialize(record_class)
super
@record_class = record_class
end

def message
"#{@record_class} is not managed by this projector #{self.class.name}. Please check your configuration."
end
end

class << self
attr_accessor :abstract_class, :skip_autoregister
Expand All @@ -101,25 +111,74 @@ def self.replay_persistor
nil
end

def_delegators :@persistor,
:update_record,
:create_record,
:create_records,
:create_or_update_record,
:get_record!,
:get_record,
:delete_all_records,
:update_all_records,
:do_with_records,
:do_with_record,
:delete_record,
:find_records,
:last_record,
:execute_sql,
:commit
def_delegators :@persistor, :execute_sql, :commit

def update_record(record_class, *rest)
ensure_record_class_supported!(record_class)
@persistor.update_record(record_class, *rest)
end

def create_record(record_class, *rest)
ensure_record_class_supported!(record_class)
@persistor.create_record(record_class, *rest)
end

def create_records(record_class, *rest)
ensure_record_class_supported!(record_class)
@persistor.create_records(record_class, *rest)
end

def get_record!(record_class, *rest)
ensure_record_class_supported!(record_class)
@persistor.get_record!(record_class, *rest)
end

def get_record(record_class, *rest)
ensure_record_class_supported!(record_class)
@persistor.get_record(record_class, *rest)
end

def delete_all_records(record_class, *rest)
ensure_record_class_supported!(record_class)
@persistor.delete_all_records(record_class, *rest)
end

def update_all_records(record_class, *rest)
ensure_record_class_supported!(record_class)
@persistor.update_all_records(record_class, *rest)
end

def do_with_records(record_class, *rest, &block)
ensure_record_class_supported!(record_class)
@persistor.do_with_records(record_class, *rest, &block)
end

def do_with_record(record_class, *rest, &block)
ensure_record_class_supported!(record_class)
@persistor.do_with_record(record_class, *rest, &block)
end

def delete_record(record_class, *rest)
ensure_record_class_supported!(record_class)
@persistor.delete_record(record_class, *rest)
end

def find_records(record_class, *rest)
ensure_record_class_supported!(record_class)
@persistor.find_records(record_class, *rest)
end

def last_record(record_class, *rest)
ensure_record_class_supported!(record_class)
@persistor.last_record(record_class, *rest)
end

private

def ensure_record_class_supported!(record_class)
fail NotManagedByThisProjector, record_class unless managed_tables.include?(record_class)
end

def ensure_valid!
return if self.class.manages_no_tables?

Expand Down
21 changes: 21 additions & 0 deletions spec/lib/sequent/core/projector_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,25 @@ class TestProjector1 < Sequent::Core::Projector
Sequent.configuration.event_handlers << TestProjector1.new
end.to raise_error(/A Projector must manage at least one table/)
end

it "'fails when passing in a record_class to the persistor that isn't managed by this projector" do
MyOtherProjectorTable = Class.new

MyProjectorTable = Class.new
MyProjectorEvent = Class.new(Sequent::Core::Event)
expect do
Class
.new(Sequent::Core::Projector) do
self.skip_autoregister = true

manages_tables MyProjectorTable

on MyProjectorEvent do
update_all_records(MyOtherProjectorTable, {}, {})
end
end
.new
.handle_message(MyProjectorEvent.new(aggregate_id: '1', sequence_number: 1))
end.to raise_error(Sequent::Core::Projector::NotManagedByThisProjector)
end
end