Skip to content

Commit 9451397

Browse files
authored
Handle extra events for campaign targets (#2674)
* task regenerate * task db:create * support click and open events
1 parent 82e45e1 commit 9451397

1 file changed

Lines changed: 24 additions & 11 deletions

File tree

internal/integrations/definitions/email/webhook.go

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package email
33
import (
44
"context"
55
"encoding/json"
6+
"strings"
67
"time"
78

89
"github.com/resend/resend-go/v3"
@@ -224,29 +225,41 @@ func updateCampaignTarget(ctx context.Context, db *ent.Client, targetID, campaig
224225
eventTime := parseResendEventTime(event.Data.CreatedAt)
225226

226227
switch event.Type {
227-
case resend.EventEmailSent, resend.EventEmailDelivered, resend.EventEmailOpened, resend.EventEmailClicked:
228+
case resend.EventEmailSent:
228229
update.SetStatus(enums.AssessmentResponseStatusSent)
229230

230231
if eventTime != nil {
231232
update.SetSentAt(models.DateTime(*eventTime))
232233
}
233-
case resend.EventEmailBounced, resend.EventEmailFailed:
234-
metadata := target.Metadata
235-
if metadata == nil {
236-
metadata = map[string]any{}
237-
}
238-
239-
metadata["resend_event"] = event.Type
240-
metadata["resend_email_id"] = event.Data.EmailID
241-
metadata["resend_timestamp"] = event.Data.CreatedAt
242-
update.SetMetadata(metadata)
234+
case resend.EventEmailDelivered, resend.EventEmailOpened, resend.EventEmailClicked:
235+
update.SetStatus(enums.AssessmentResponseStatusSent)
243236
}
244237

238+
update.SetMetadata(getTargetMetadata(target.Metadata, event))
239+
245240
_, err = update.Save(ctx)
246241

247242
return err
248243
}
249244

245+
func getTargetMetadata(metadata map[string]any, event resendWebhookEvent) map[string]any {
246+
if metadata == nil {
247+
metadata = map[string]any{}
248+
}
249+
250+
eventName := event.Type
251+
if _, after, found := strings.Cut(event.Type, "."); found {
252+
eventName = after
253+
}
254+
255+
metadata[eventName] = map[string]string{
256+
"email_id": event.Data.EmailID,
257+
"timestamp": event.Data.CreatedAt,
258+
}
259+
260+
return metadata
261+
}
262+
250263
// parseResendEventTime parses a Resend timestamp string and returns a time.Time pointer
251264
func parseResendEventTime(value string) *time.Time {
252265
if value == "" {

0 commit comments

Comments
 (0)