Skip to content

Commit 6cf03b0

Browse files
Dragomir-Ivanovsmyrman
authored andcommitted
Recalculate E-Tag right before before storing items
E-tags used to be set after parsing an item only, before potential hooks alter the item content. This change adds a final step to resource Update and Create operations to recalculate E-tags right before passing items to the Storer back-end. Fixes #255
1 parent 369f453 commit 6cf03b0

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

resource/resource.go

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -354,12 +354,32 @@ func (r *Resource) Insert(ctx context.Context, items []*Item) (err error) {
354354
}(time.Now())
355355
}
356356
if err = r.hooks.onInsert(ctx, items); err == nil {
357-
err = r.storage.Insert(ctx, items)
357+
if err = recalcEtag(items); err == nil {
358+
err = r.storage.Insert(ctx, items)
359+
}
358360
}
359361
r.hooks.onInserted(ctx, items, &err)
360362
return
361363
}
362364

365+
func recalcEtag(items []*Item) error {
366+
if items == nil {
367+
return nil
368+
}
369+
370+
for _, v := range items {
371+
if v == nil {
372+
continue
373+
}
374+
etag, err := genEtag(v.Payload)
375+
if err != nil {
376+
return err
377+
}
378+
v.ETag = etag
379+
}
380+
return nil
381+
}
382+
363383
// Update implements Storer interface.
364384
func (r *Resource) Update(ctx context.Context, item *Item, original *Item) (err error) {
365385
if LoggerLevel <= LogLevelDebug && Logger != nil {
@@ -371,7 +391,9 @@ func (r *Resource) Update(ctx context.Context, item *Item, original *Item) (err
371391
}(time.Now())
372392
}
373393
if err = r.hooks.onUpdate(ctx, item, original); err == nil {
374-
err = r.storage.Update(ctx, item, original)
394+
if err = recalcEtag([]*Item{item}); err == nil {
395+
err = r.storage.Update(ctx, item, original)
396+
}
375397
}
376398
r.hooks.onUpdated(ctx, item, original, &err)
377399
return

resource/resource_crud_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ func TestResourceInsert(t *testing.T) {
491491
}))
492492
r.Use(InsertedEventHandlerFunc(func(ctx context.Context, items []*Item, err *error) {
493493
postHook = true
494-
assert.Equal(t, []*Item{{ID: 1}}, items)
494+
assert.Equal(t, []*Item{{ID: 1, ETag: "37a6259cc0c1dae299a7866489dff0bd"}}, items)
495495
assert.NoError(t, *err)
496496
}))
497497
ctx := context.Background()
@@ -518,7 +518,7 @@ func TestResourceInsertError(t *testing.T) {
518518
}))
519519
r.Use(InsertedEventHandlerFunc(func(ctx context.Context, items []*Item, err *error) {
520520
postHook = true
521-
assert.Equal(t, []*Item{{ID: 1}}, items)
521+
assert.Equal(t, []*Item{{ID: 1, ETag: "37a6259cc0c1dae299a7866489dff0bd"}}, items)
522522
assert.EqualError(t, *err, "storer error")
523523
}))
524524
ctx := context.Background()
@@ -571,7 +571,7 @@ func TestResourceInsertPostHookError(t *testing.T) {
571571
}))
572572
r.Use(InsertedEventHandlerFunc(func(ctx context.Context, items []*Item, err *error) {
573573
postHook = true
574-
assert.Equal(t, []*Item{{ID: 1}}, items)
574+
assert.Equal(t, []*Item{{ID: 1, ETag: "37a6259cc0c1dae299a7866489dff0bd"}}, items)
575575
assert.NoError(t, *err)
576576
*err = errors.New("post hook error")
577577
}))
@@ -604,7 +604,7 @@ func TestResourceUpdate(t *testing.T) {
604604
}))
605605
r.Use(UpdatedEventHandlerFunc(func(ctx context.Context, item *Item, origin *Item, err *error) {
606606
postHook = true
607-
assert.Equal(t, &Item{ID: 1}, item)
607+
assert.Equal(t, &Item{ID: 1, ETag: "37a6259cc0c1dae299a7866489dff0bd"}, item)
608608
assert.Equal(t, &Item{ID: 1}, origin)
609609
assert.NoError(t, *err)
610610
}))
@@ -633,7 +633,7 @@ func TestResourceUpdateError(t *testing.T) {
633633
}))
634634
r.Use(UpdatedEventHandlerFunc(func(ctx context.Context, item *Item, origin *Item, err *error) {
635635
postHook = true
636-
assert.Equal(t, &Item{ID: 1}, item)
636+
assert.Equal(t, &Item{ID: 1, ETag: "37a6259cc0c1dae299a7866489dff0bd"}, item)
637637
assert.Equal(t, &Item{ID: 1}, origin)
638638
assert.EqualError(t, *err, "storer error")
639639
}))
@@ -691,7 +691,7 @@ func TestResourceUpdatePostHookError(t *testing.T) {
691691
}))
692692
r.Use(UpdatedEventHandlerFunc(func(ctx context.Context, item *Item, origin *Item, err *error) {
693693
postHook = true
694-
assert.Equal(t, &Item{ID: 1}, item)
694+
assert.Equal(t, &Item{ID: 1, ETag: "37a6259cc0c1dae299a7866489dff0bd"}, item)
695695
assert.Equal(t, &Item{ID: 1}, origin)
696696
assert.NoError(t, *err)
697697
*err = errors.New("post hook error")

0 commit comments

Comments
 (0)