Skip to content

Commit 3dbbe20

Browse files
committed
refactor: api response
1 parent b05f4ba commit 3dbbe20

File tree

2 files changed

+26
-53
lines changed

2 files changed

+26
-53
lines changed

internal/publishmq/eventhandler.go

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,15 @@ type EventHandler interface {
2525
}
2626

2727
type HandleResult struct {
28-
EventID string `json:"id"`
29-
MatchedCount int `json:"matched_count"`
30-
QueuedCount int `json:"queued_count"`
31-
Destinations []DestinationStatus `json:"destinations,omitempty"`
32-
}
33-
34-
type DestinationStatus struct {
35-
ID string `json:"id"`
36-
Status DestinationMatchStatus `json:"status"`
28+
EventID string `json:"id"`
29+
MatchedCount int `json:"matched_count"`
30+
QueuedCount int `json:"queued_count"`
31+
DestinationStatus *DestinationMatchStatus `json:"destination_status,omitempty"`
3732
}
3833

3934
type DestinationMatchStatus string
4035

4136
const (
42-
DestinationStatusQueued DestinationMatchStatus = "queued"
4337
DestinationStatusDisabled DestinationMatchStatus = "disabled"
4438
DestinationStatusNotFound DestinationMatchStatus = "not_found"
4539
DestinationStatusTopicMismatch DestinationMatchStatus = "topic_mismatch"
@@ -95,7 +89,7 @@ func (h *eventHandler) Handle(ctx context.Context, event *models.Event) (*Handle
9589
zap.String("destination_id", event.DestinationID))
9690

9791
var matchedDestinations []models.DestinationSummary
98-
var destStatus *DestinationStatus
92+
var destStatus *DestinationMatchStatus
9993
var err error
10094

10195
// Branch: specific destination vs topic-based matching
@@ -123,12 +117,12 @@ func (h *eventHandler) Handle(ctx context.Context, event *models.Event) (*Handle
123117
QueuedCount: 0,
124118
}
125119

126-
if destStatus != nil {
127-
result.Destinations = []DestinationStatus{*destStatus}
128-
}
129-
130120
// Early return if no destinations matched
131121
if len(matchedDestinations) == 0 {
122+
// Only set destination_status if destination_id was specified and nothing matched
123+
if event.DestinationID != "" && destStatus != nil {
124+
result.DestinationStatus = destStatus
125+
}
132126
logger.Info("no matching destinations",
133127
zap.String("event_id", event.ID),
134128
zap.String("tenant_id", event.TenantID))
@@ -176,51 +170,35 @@ func (h *eventHandler) doPublish(ctx context.Context, event *models.Event, match
176170

177171
// matchSpecificDestination handles the case where a specific destination_id is provided.
178172
// It retrieves the destination and validates it, returning both the matched destinations
179-
// and the status for the API response.
180-
func (h *eventHandler) matchSpecificDestination(ctx context.Context, event *models.Event) ([]models.DestinationSummary, *DestinationStatus, error) {
173+
// and the status (only set when nothing matched - disabled/not_found/topic_mismatch).
174+
func (h *eventHandler) matchSpecificDestination(ctx context.Context, event *models.Event) ([]models.DestinationSummary, *DestinationMatchStatus, error) {
181175
destination, err := h.entityStore.RetrieveDestination(ctx, event.TenantID, event.DestinationID)
182176
if err != nil {
183177
h.logger.Ctx(ctx).Warn("failed to retrieve destination",
184178
zap.Error(err),
185179
zap.String("destination_id", event.DestinationID))
186-
status := DestinationStatus{
187-
ID: event.DestinationID,
188-
Status: DestinationStatusNotFound,
189-
}
180+
status := DestinationStatusNotFound
190181
return []models.DestinationSummary{}, &status, nil
191182
}
192183

193184
if destination == nil {
194-
status := DestinationStatus{
195-
ID: event.DestinationID,
196-
Status: DestinationStatusNotFound,
197-
}
185+
status := DestinationStatusNotFound
198186
return []models.DestinationSummary{}, &status, nil
199187
}
200188

201189
if destination.DisabledAt != nil {
202-
status := DestinationStatus{
203-
ID: event.DestinationID,
204-
Status: DestinationStatusDisabled,
205-
}
190+
status := DestinationStatusDisabled
206191
return []models.DestinationSummary{}, &status, nil
207192
}
208193

209194
// Check topic match
210195
if event.Topic != "" && event.Topic != "*" && destination.Topics[0] != "*" && !slices.Contains(destination.Topics, event.Topic) {
211-
status := DestinationStatus{
212-
ID: event.DestinationID,
213-
Status: DestinationStatusTopicMismatch,
214-
}
196+
status := DestinationStatusTopicMismatch
215197
return []models.DestinationSummary{}, &status, nil
216198
}
217199

218-
// Matched!
219-
status := DestinationStatus{
220-
ID: event.DestinationID,
221-
Status: DestinationStatusQueued,
222-
}
223-
return []models.DestinationSummary{*destination.ToSummary()}, &status, nil
200+
// Matched! Return nil status since it will be queued
201+
return []models.DestinationSummary{*destination.ToSummary()}, nil, nil
224202
}
225203

226204
func (h *eventHandler) enqueueDeliveryEvent(ctx context.Context, deliveryEvent models.DeliveryEvent) error {

internal/publishmq/eventhandler_test.go

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ func TestEventHandler_HandleResult(t *testing.T) {
259259
require.Equal(t, event.ID, result.EventID)
260260
require.Equal(t, 3, result.MatchedCount)
261261
require.Equal(t, 3, result.QueuedCount)
262-
require.Nil(t, result.Destinations)
262+
require.Nil(t, result.DestinationStatus)
263263
})
264264

265265
t.Run("no destinations matched", func(t *testing.T) {
@@ -274,7 +274,7 @@ func TestEventHandler_HandleResult(t *testing.T) {
274274
require.Equal(t, event.ID, result.EventID)
275275
require.Equal(t, 0, result.MatchedCount)
276276
require.Equal(t, 0, result.QueuedCount)
277-
require.Nil(t, result.Destinations)
277+
require.Nil(t, result.DestinationStatus)
278278
})
279279

280280
t.Run("duplicate event - idempotency", func(t *testing.T) {
@@ -320,9 +320,7 @@ func TestEventHandler_HandleResult(t *testing.T) {
320320
require.NoError(t, err)
321321
require.Equal(t, 1, result.MatchedCount)
322322
require.Equal(t, 1, result.QueuedCount)
323-
require.Len(t, result.Destinations, 1)
324-
require.Equal(t, dest.ID, result.Destinations[0].ID)
325-
require.Equal(t, publishmq.DestinationStatusQueued, result.Destinations[0].Status)
323+
require.Nil(t, result.DestinationStatus, "no status when successfully queued")
326324
})
327325

328326
t.Run("with destination_id - disabled", func(t *testing.T) {
@@ -344,9 +342,8 @@ func TestEventHandler_HandleResult(t *testing.T) {
344342
require.NoError(t, err)
345343
require.Equal(t, 0, result.MatchedCount)
346344
require.Equal(t, 0, result.QueuedCount)
347-
require.Len(t, result.Destinations, 1)
348-
require.Equal(t, dest.ID, result.Destinations[0].ID)
349-
require.Equal(t, publishmq.DestinationStatusDisabled, result.Destinations[0].Status)
345+
require.NotNil(t, result.DestinationStatus, "status provided when not queued")
346+
require.Equal(t, publishmq.DestinationStatusDisabled, *result.DestinationStatus)
350347
})
351348

352349
t.Run("with destination_id - not found", func(t *testing.T) {
@@ -360,9 +357,8 @@ func TestEventHandler_HandleResult(t *testing.T) {
360357
require.NoError(t, err)
361358
require.Equal(t, 0, result.MatchedCount)
362359
require.Equal(t, 0, result.QueuedCount)
363-
require.Len(t, result.Destinations, 1)
364-
require.Equal(t, "dest_not_found", result.Destinations[0].ID)
365-
require.Equal(t, publishmq.DestinationStatusNotFound, result.Destinations[0].Status)
360+
require.NotNil(t, result.DestinationStatus, "status provided when not queued")
361+
require.Equal(t, publishmq.DestinationStatusNotFound, *result.DestinationStatus)
366362
})
367363

368364
t.Run("with destination_id - topic mismatch", func(t *testing.T) {
@@ -382,8 +378,7 @@ func TestEventHandler_HandleResult(t *testing.T) {
382378
require.NoError(t, err)
383379
require.Equal(t, 0, result.MatchedCount)
384380
require.Equal(t, 0, result.QueuedCount)
385-
require.Len(t, result.Destinations, 1)
386-
require.Equal(t, dest.ID, result.Destinations[0].ID)
387-
require.Equal(t, publishmq.DestinationStatusTopicMismatch, result.Destinations[0].Status)
381+
require.NotNil(t, result.DestinationStatus, "status provided when not queued")
382+
require.Equal(t, publishmq.DestinationStatusTopicMismatch, *result.DestinationStatus)
388383
})
389384
}

0 commit comments

Comments
 (0)