package bluge import ( "context" "fmt" "fiatjaf.com/nostr" "fiatjaf.com/nostr/eventstore" "fiatjaf.com/nostr/eventstore/internal" ) func (b *BlugeBackend) ReplaceEvent(ctx context.Context, evt nostr.Event) error { b.Lock() defer b.Unlock() filter := nostr.Filter{Limit: 1, Kinds: []uint16{evt.Kind}, Authors: []nostr.PubKey{evt.PubKey}} if nostr.IsAddressableKind(evt.Kind) { filter.Tags = nostr.TagMap{"d": []string{evt.Tags.GetD()}} } shouldStore := true for previous := range b.QueryEvents(filter) { if internal.IsOlder(previous, evt) { if err := b.DeleteEvent(previous.ID); err != nil { return fmt.Errorf("failed to delete event for replacing: %w", err) } } else { shouldStore = false } } if shouldStore { if err := b.SaveEvent(ctx, evt); err != nil && err != eventstore.ErrDupEvent { return fmt.Errorf("failed to save: %w", err) } } return nil }