khatru: add policies to validate event tags by kind and replace reactions.

This commit is contained in:
fiatjaf
2025-11-11 11:26:10 -03:00
parent 637de481e5
commit db835ef3c4
3 changed files with 55 additions and 0 deletions

View File

@@ -0,0 +1,33 @@
package policies
import (
"fiatjaf.com/nostr"
"fiatjaf.com/nostr/eventstore"
)
// UniqueReactionsWrapper ensures that only the latest reaction or poll response from an author to an event is kept.
// When a new reaction (kind 7) or poll response (kind 1018) is received, it deletes any previous ones from the same author to the same event.
type UniqueReactionsWrapper struct {
eventstore.Store
}
func (w *UniqueReactionsWrapper) SaveEvent(event nostr.Event) error {
// check if it's a reaction or poll response
if event.Kind == 7 || event.Kind == 1018 {
// find the referenced event ID
ref := event.Tags.Find("e")
if ref != nil {
// query for existing events of same kind from same author referencing the same event and delete them
for old := range w.Store.QueryEvents(nostr.Filter{
Authors: []nostr.PubKey{event.PubKey},
Kinds: []nostr.Kind{event.Kind},
Tags: nostr.TagMap{"e": []string{ref[1]}},
}, 1_000) {
w.Store.DeleteEvent(old.ID)
}
}
}
// Save the new event
return w.Store.SaveEvent(event)
}

View File

@@ -0,0 +1,18 @@
package policies
import (
"context"
"fiatjaf.com/nostr"
"fiatjaf.com/nostr/schema"
)
func ValidateAgainstSchema(ctx context.Context, evt nostr.Event) (bool, string) {
v := schema.NewDefaultValidator()
v.FailOnUnknown = true
err := v.ValidateEvent(evt)
if err != nil {
return true, err.Error()
}
return false, ""
}

View File

@@ -53,6 +53,10 @@ func NewValidator(schemaData string) Validator {
return Validator{Schema: schema}
}
func NewDefaultValidator() Validator {
return NewValidator(string(schemaFile))
}
var (
ErrUnknownContent = fmt.Errorf("unknown content")
ErrUnknownKind = fmt.Errorf("unknown kind")