From 526287b617289ae4642a66a73d23fc29ee2f39c6 Mon Sep 17 00:00:00 2001 From: Erik Rozendaal Date: Fri, 6 Mar 2026 13:26:32 +0100 Subject: [PATCH] Fail if non-type based event handler is defined in projector Since it is not possible to efficiently query the database for non-typed based event handlers (like `has_attrs(...)`) these are now prohibited for projectors as these event handlers were ignored by the replayer, potentially resulting in bad data in the view schema after a replay. Rewrite the event handler to list all types that must be matched instead. --- lib/sequent/core/projector.rb | 6 ++++++ spec/lib/sequent/core/projector_spec.rb | 12 ++++++++++++ 2 files changed, 18 insertions(+) diff --git a/lib/sequent/core/projector.rb b/lib/sequent/core/projector.rb index b68461aa..53ff7c41 100644 --- a/lib/sequent/core/projector.rb +++ b/lib/sequent/core/projector.rb @@ -107,6 +107,12 @@ def initialize(persistor = Sequent::Core::Persistors::ActiveRecordPersistor.new) @persistor = persistor end + def self.on(*args, **opts, &block) + fail ArgumentError, 'only type based event handlers are allowed for projectors' unless args.all?(Class) + + super + end + def self.replay_persistor nil end diff --git a/spec/lib/sequent/core/projector_spec.rb b/spec/lib/sequent/core/projector_spec.rb index 0591a659..a1f5f8d5 100644 --- a/spec/lib/sequent/core/projector_spec.rb +++ b/spec/lib/sequent/core/projector_spec.rb @@ -8,6 +8,18 @@ class MyProjectorTable class MyProjectorEvent < Sequent::Core::Event end + it 'fails when non-type based event handler is present' do + expect do + Class.new(Sequent::Core::Projector) do + manages_no_tables + self.skip_autoregister = true + + on is_a(String) do + end + end + end.to raise_error(ArgumentError, 'only type based event handlers are allowed for projectors') + end + it 'fails when missing managed_tables' do class TestProjector1 < Sequent::Core::Projector self.skip_autoregister = true