11package sched_service
22
33import (
4+ "fmt"
45 "strconv"
56 "time"
67
@@ -34,19 +35,67 @@ func (s *BatchActionService) BatchAction(ctx common.ExtendedContext, event event
3435}
3536func (s * BatchActionService ) batchAction (ctx common.ExtendedContext , event events.Event ) (events.EventStatus , * events.EventResult ) {
3637 ctx = ctx .WithArgs (ctx .LoggerArgs ().WithComponent (BATCH_COMP ))
37- if event .EventData .BatchActionData != nil {
38- switch event .EventData .BatchActionData .ActionName {
39- case string (schedoapi .EmailPullslips ):
40- return s .emailSenderService .EmailPullslip (ctx , event )
41- case string (schedoapi .RequestAging ):
42- return s .RequestAging (ctx , event )
43- default :
44- ctx .Logger ().Error ("unknown batch action" , "actionName" , event .EventData .BatchActionData .ActionName , "event" , event )
45- return events .NewErrorResult ("cannot process event" , "unknown batch action" )
46- }
38+ if event .EventData .BatchActionData == nil {
39+ ctx .Logger ().Error ("batch action data is empty" , "eventId" , event .ID )
40+ return events .NewErrorResult ("cannot process event" , "batch action data is empty" )
41+ }
42+
43+ var action func (common.ExtendedContext , events.Event ) (events.EventStatus , * events.EventResult )
44+ switch event .EventData .BatchActionData .ActionName {
45+ case string (schedoapi .EmailPullslips ):
46+ action = s .emailSenderService .EmailPullslip
47+ case string (schedoapi .RequestAging ):
48+ action = s .RequestAging
49+ default :
50+ ctx .Logger ().Error ("unknown batch action" ,
51+ "actionName" , event .EventData .BatchActionData .ActionName ,
52+ "eventId" , event .ID ,
53+ "taskId" , event .EventData .BatchActionData .TaskId )
54+ return events .NewErrorResult ("cannot process event" , "unknown batch action" )
55+ }
56+
57+ restrictedSelector , err := addBatchActionOwnerRestriction (
58+ event .EventData .BatchActionData .Selector ,
59+ event .EventData .BatchActionData .Owner ,
60+ )
61+ if err != nil {
62+ return events .NewErrorResult ("invalid batch action data" , err .Error ())
63+ }
64+
65+ // Keep the event stored by the event bus unchanged while ensuring every
66+ // action handler receives the owner-restricted selector.
67+ batchActionData := * event .EventData .BatchActionData
68+ batchActionData .Selector = restrictedSelector
69+ event .EventData .BatchActionData = & batchActionData
70+ return action (ctx , event )
71+ }
72+
73+ func addBatchActionOwnerRestriction (selector string , owner string ) (string , error ) {
74+ if selector == "" {
75+ return "" , fmt .Errorf ("selector is empty" )
76+ }
77+ if owner == "" {
78+ return selector , nil
79+ }
80+
81+ qb , err := cqlbuilder .NewQueryFromString (selector )
82+ if err != nil {
83+ return "" , err
84+ }
85+ restrictedSelector , err := qb .And ().
86+ BeginClause ().
87+ Search ("side" ).Term (string (prservice .SideLending )).
88+ And ().Search ("supplier_symbol_exact" ).Term (owner ).
89+ Or ().
90+ BeginClause ().Search ("side" ).Term (string (prservice .SideBorrowing )).
91+ And ().Search ("requester_symbol_exact" ).Term (owner ).
92+ EndClause ().
93+ EndClause ().
94+ Build ()
95+ if err != nil {
96+ return "" , err
4797 }
48- ctx .Logger ().Error ("batch action data is empty" , "event" , event .ID )
49- return events .NewErrorResult ("cannot process event" , "batch action data is empty" )
98+ return restrictedSelector .String (), nil
5099}
51100
52101func (s * BatchActionService ) RequestAging (ctx common.ExtendedContext , event events.Event ) (events.EventStatus , * events.EventResult ) {
@@ -58,10 +107,6 @@ func (s *BatchActionService) RequestAging(ctx common.ExtendedContext, event even
58107 if batchActionData .Selector == "" {
59108 return events .NewErrorResult ("cannot process event" , "selector is empty" )
60109 }
61- if batchActionData .Owner == "" {
62- return events .NewErrorResult ("cannot process event" , "owner is empty" )
63- }
64-
65110 intervalString , ok := event .EventData .CustomData ["interval" ].(string )
66111 if ! ok || intervalString == "" {
67112 return events .NewErrorResult ("cannot process event" , "interval is missing or not a string" )
0 commit comments