@@ -109,6 +109,14 @@ def __exit__(self, exc_type, exc_val, exc_tb):
109109 """Should be used to commit/end a transaction"""
110110 self .app ._on_exit_transaction_context (self , exc_type , exc_val , exc_tb )
111111
112+ def _wrap_with_middlewares (
113+ self , handler_func , command = None , query = None , event = None
114+ ):
115+ p = handler_func
116+ for middleware in self .app ._transaction_middlewares :
117+ p = partial (middleware , self , p , command , query , event )
118+ return p
119+
112120 def execute_query (self , query ):
113121 assert (
114122 self .task is None
@@ -119,13 +127,9 @@ def execute_query(self, query):
119127 handler_kwargs = self .dependency_provider .get_handler_kwargs (
120128 handler_func , ** self .overrides
121129 )
122-
123- # prepare query handler
124- p = partial (handler_func , query , ** handler_kwargs )
125-
126- for middleware in self .app ._transaction_middlewares :
127- p = partial (middleware , self , p )
128- result = p ()
130+ handler_func = partial (handler_func , query , ** handler_kwargs )
131+ wrapped_handler = self ._wrap_with_middlewares (handler_func , query = query )
132+ result = wrapped_handler ()
129133 return result
130134
131135 def execute_command (self , command ):
@@ -138,39 +142,24 @@ def execute_command(self, command):
138142 handler_kwargs = self .dependency_provider .get_handler_kwargs (
139143 handler_func , ** self .overrides
140144 )
141-
142- # prepare command handler
143- p = partial (handler_func , command , ** handler_kwargs )
144-
145- # wrap command handler in middlewares
146- handler_kwargs = self .dependency_provider .get_handler_kwargs (
147- handler_func , ** self .overrides
148- )
149- p = partial (handler_func , command , ** handler_kwargs )
150- for middleware in self .app ._transaction_middlewares :
151- p = partial (middleware , self , p )
145+ handler_func = partial (handler_func , command , ** handler_kwargs )
146+ wrapped_handler = self ._wrap_with_middlewares (handler_func , command = command )
152147
153148 # execute wrapped command handler
154- command_result = p ()
149+ command_result = wrapped_handler ()
155150
156151 self .next_commands = []
157152 self .integration_events = []
158153 event_queue = command_result .events .copy ()
159154 while len (event_queue ) > 0 :
160155 event = event_queue .pop (0 )
161156 if isinstance (event , IntegrationEvent ):
162- self .integration_events .append (result )
157+ self ._process_integration_event (event )
158+
163159 elif isinstance (event , DomainEvent ):
164- for event_handler in self .app .get_event_handlers (event ):
165- handler_kwargs = self .dependency_provider .get_handler_kwargs (
166- event_handler , ** self .overrides
167- )
168- logger .info (f"handling event { event } with { event_handler } " )
169- result = event_handler (event , ** handler_kwargs )
170- if isinstance (result , Command ):
171- self .next_commands .append (result )
172- elif isinstance (result , EventResult ):
173- event_queue .extend (result .events )
160+ new_command , new_events = self ._process_domain_event (event )
161+ self .next_commands .extend (new_command )
162+ event_queue .extend (new_events )
174163
175164 return CommandResult .success (payload = command_result .payload )
176165
@@ -181,6 +170,25 @@ def get_service(self, service_cls):
181170 def current_user (self ):
182171 return self .dependency_provider .get_dependency ("current_user" )
183172
173+ def _process_integration_event (self , event ):
174+ self .integration_events .append (event )
175+
176+ def _process_domain_event (self , event ):
177+ new_commands = []
178+ new_events = []
179+ for handler_func in self .app .get_event_handlers (event ):
180+ handler_kwargs = self .dependency_provider .get_handler_kwargs (
181+ handler_func , ** self .overrides
182+ )
183+ event_handler = partial (handler_func , event , ** handler_kwargs )
184+ wrapped_handler = self ._wrap_with_middlewares (event_handler , event = event )
185+ result = wrapped_handler ()
186+ if isinstance (result , Command ):
187+ new_commands .append (result )
188+ elif isinstance (result , EventResult ):
189+ new_events .extend (result .events )
190+ return new_commands , new_events
191+
184192
185193class ApplicationModule :
186194 def __init__ (self , name , version = 1.0 ):
0 commit comments