@@ -75,25 +75,16 @@ func (d *Dispatcher) retryWithBackoff(ctx context.Context, operation func() erro
7575 return lastErr
7676}
7777
78- // DispatchWebhook sends a webhook request and handles retries
79- func (d * Dispatcher ) DispatchWebhook (ctx context.Context , occurrence * models.Occurrence , event * models.Event ) error {
80- // Verify event exists in database
81- dbEvent , err := d .eventRepo .GetByID (ctx , event .ID )
82- if err != nil {
83- return fmt .Errorf ("error getting event: %w" , err )
84- }
85- if dbEvent == nil {
86- return fmt .Errorf ("event not found" )
87- }
88-
78+ // DispatchWebhook sends a webhook request and handles retries using a Schedule object
79+ func (d * Dispatcher ) DispatchWebhook (ctx context.Context , sched * models.Schedule ) error {
8980 // Prepare webhook payload with rich information
9081 payload := map [string ]interface {}{
91- "event_id" : event . ID ,
92- "occurrence_id" : occurrence . ID ,
93- "name" : event .Name ,
94- "description" : event .Description ,
95- "scheduled_at" : occurrence .ScheduledAt ,
96- "metadata" : event .Metadata ,
82+ "event_id" : sched . EventID ,
83+ "occurrence_id" : sched . OccurrenceID ,
84+ "name" : sched .Name ,
85+ "description" : sched .Description ,
86+ "scheduled_at" : sched .ScheduledAt ,
87+ "metadata" : sched .Metadata ,
9788 }
9889
9990 // Convert payload to JSON
@@ -103,7 +94,7 @@ func (d *Dispatcher) DispatchWebhook(ctx context.Context, occurrence *models.Occ
10394 }
10495
10596 // Create base request (will be cloned for each attempt)
106- baseReq , err := http .NewRequestWithContext (ctx , "POST" , event .WebhookURL , nil )
97+ baseReq , err := http .NewRequestWithContext (ctx , "POST" , sched .WebhookURL , nil )
10798 if err != nil {
10899 return fmt .Errorf ("error creating request: %w" , err )
109100 }
@@ -112,12 +103,10 @@ func (d *Dispatcher) DispatchWebhook(ctx context.Context, occurrence *models.Occ
112103 baseReq .Header .Set ("Content-Type" , "application/json" )
113104 baseReq .Header .Set ("Content-Length" , fmt .Sprintf ("%d" , len (jsonPayload )))
114105
115- // Sign request if HMAC is enabled
106+ // Sign request if HMAC is enabled (not supported if secret is not present)
116107 if d .hmacService != nil {
117- var secret string
118- if event .HMACSecret != nil {
119- secret = * event .HMACSecret
120- }
108+ // No HMACSecret in Schedule, so skip or use default
109+ secret := ""
121110 signature := d .hmacService .SignPayload (jsonPayload , secret )
122111 baseReq .Header .Set ("X-Qhronos-Signature" , signature )
123112 }
@@ -181,9 +170,9 @@ func (d *Dispatcher) DispatchWebhook(ctx context.Context, occurrence *models.Occ
181170
182171 // Log the result to Postgres as a new occurrence record (append-only, for history)
183172 logOccurrence := & models.Occurrence {
184- OccurrenceID : occurrence .OccurrenceID ,
185- EventID : occurrence .EventID ,
186- ScheduledAt : occurrence .ScheduledAt ,
173+ OccurrenceID : sched .OccurrenceID ,
174+ EventID : sched .EventID ,
175+ ScheduledAt : sched .ScheduledAt ,
187176 Status : finalStatus ,
188177 AttemptCount : attemptCount ,
189178 Timestamp : lastAttempt ,
@@ -196,7 +185,7 @@ func (d *Dispatcher) DispatchWebhook(ctx context.Context, occurrence *models.Occ
196185 return err
197186}
198187
199- // Run processes due events and dispatches webhooks
188+ // Run processes due schedules and dispatches webhooks
200189func (d * Dispatcher ) Run (ctx context.Context , scheduler * Scheduler ) error {
201190 d .logger .Info ("Starting dispatcher" )
202191 ticker := time .NewTicker (1 * time .Second )
@@ -208,32 +197,18 @@ func (d *Dispatcher) Run(ctx context.Context, scheduler *Scheduler) error {
208197 d .logger .Info ("Dispatcher shutting down" )
209198 return ctx .Err ()
210199 case <- ticker .C :
211- // Get due occurrences
212- occurrences , err := scheduler .GetDueOccurrence (ctx )
200+ // Get due schedules
201+ schedules , err := scheduler .GetDueSchedules (ctx )
213202 if err != nil {
214- d .logger .Error ("Error getting due occurrences " , zap .Error (err ))
203+ d .logger .Error ("Error getting due schedules " , zap .Error (err ))
215204 continue
216205 }
217206
218- // Process each occurrence
219- for _ , occurrence := range occurrences {
220- event , err := d .eventRepo .GetByID (ctx , occurrence .EventID )
221- if err != nil {
222- d .logger .Error ("Error getting event for occurrence" ,
223- zap .Int ("occurrence_id" , occurrence .ID ),
224- zap .Error (err ))
225- continue
226- }
227- if event == nil {
228- d .logger .Warn ("Event not found for occurrence" ,
229- zap .Int ("occurrence_id" , occurrence .ID ))
230- continue
231- }
232-
233- // Dispatch webhook
234- if err := d .DispatchWebhook (ctx , occurrence , event ); err != nil {
207+ // Process each schedule
208+ for _ , sched := range schedules {
209+ if err := d .DispatchWebhook (ctx , sched ); err != nil {
235210 d .logger .Error ("Error dispatching webhook" ,
236- zap .Int ("occurrence_id" , occurrence . ID ),
211+ zap .String ("occurrence_id" , sched . OccurrenceID . String () ),
237212 zap .Error (err ))
238213 continue
239214 }
0 commit comments