45 lines
1,022 B
Go
45 lines
1,022 B
Go
|
package postgresql
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/fiatjaf/eventstore"
|
||
|
"github.com/fiatjaf/eventstore/internal"
|
||
|
"github.com/nbd-wtf/go-nostr"
|
||
|
)
|
||
|
|
||
|
func (b *PostgresBackend) ReplaceEvent(ctx context.Context, evt *nostr.Event) error {
|
||
|
b.Lock()
|
||
|
defer b.Unlock()
|
||
|
|
||
|
filter := nostr.Filter{Limit: 1, Kinds: []int{evt.Kind}, Authors: []string{evt.PubKey}}
|
||
|
if nostr.IsAddressableKind(evt.Kind) {
|
||
|
filter.Tags = nostr.TagMap{"d": []string{evt.Tags.GetD()}}
|
||
|
}
|
||
|
|
||
|
ch, err := b.QueryEvents(ctx, filter)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("failed to query before replacing: %w", err)
|
||
|
}
|
||
|
|
||
|
shouldStore := true
|
||
|
for previous := range ch {
|
||
|
if internal.IsOlder(previous, evt) {
|
||
|
if err := b.DeleteEvent(ctx, previous); 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
|
||
|
}
|