diff --git a/relay_interface.go b/relay_interface.go index ca168ad..c79515a 100644 --- a/relay_interface.go +++ b/relay_interface.go @@ -29,7 +29,7 @@ func (w RelayWrapper) Publish(ctx context.Context, evt nostr.Event) (nostr.Statu if err != nil { return nostr.PublishStatusFailed, fmt.Errorf("failed to query before replacing: %w", err) } - if previous := <-ch; previous != nil { + if previous := <-ch; previous != nil && isOlder(previous, &evt) { if err := w.Store.DeleteEvent(ctx, previous); err != nil { return nostr.PublishStatusFailed, fmt.Errorf("failed to delete event for replacing: %w", err) } @@ -42,7 +42,7 @@ func (w RelayWrapper) Publish(ctx context.Context, evt nostr.Event) (nostr.Statu if err != nil { return nostr.PublishStatusFailed, fmt.Errorf("failed to query before parameterized replacing: %w", err) } - if previous := <-ch; previous != nil { + if previous := <-ch; previous != nil && isOlder(previous, &evt) { if err := w.Store.DeleteEvent(ctx, previous); err != nil { return nostr.PublishStatusFailed, fmt.Errorf("failed to delete event for parameterized replacing: %w", err) @@ -51,7 +51,7 @@ func (w RelayWrapper) Publish(ctx context.Context, evt nostr.Event) (nostr.Statu } } - if err := w.SaveEvent(ctx, &evt); err != nil { + if err := w.SaveEvent(ctx, &evt); err != nil && err != ErrDupEvent { return nostr.PublishStatusFailed, fmt.Errorf("failed to save: %w", err) } diff --git a/utils.go b/utils.go new file mode 100644 index 0000000..665ae10 --- /dev/null +++ b/utils.go @@ -0,0 +1,8 @@ +package eventstore + +import "github.com/nbd-wtf/go-nostr" + +func isOlder(previous, next *nostr.Event) bool { + return previous.CreatedAt < next.CreatedAt || + (previous.CreatedAt == next.CreatedAt && previous.ID > next.ID) +}