delete.go raw

   1  package routing
   2  
   3  import (
   4  	"context"
   5  
   6  	"next.orly.dev/pkg/nostr/encoders/event"
   7  )
   8  
   9  // DeleteProcessor handles event deletion operations.
  10  type DeleteProcessor interface {
  11  	// SaveDeleteEvent saves the delete event itself.
  12  	SaveDeleteEvent(ctx context.Context, ev *event.E) error
  13  	// ProcessDeletion removes the target events.
  14  	ProcessDeletion(ctx context.Context, ev *event.E) error
  15  	// DeliverEvent sends the delete event to subscribers.
  16  	DeliverEvent(ev *event.E)
  17  }
  18  
  19  // MakeDeleteHandler creates a handler for delete events (kind 5).
  20  // Delete events:
  21  // - Save the delete event itself first
  22  // - Process target event deletions
  23  // - Deliver the delete event to subscribers
  24  func MakeDeleteHandler(processor DeleteProcessor) Handler {
  25  	return func(ev *event.E, authedPubkey []byte) Result {
  26  		ctx := context.Background()
  27  
  28  		// Save delete event first
  29  		if err := processor.SaveDeleteEvent(ctx, ev); err != nil {
  30  			return ErrorResult(err)
  31  		}
  32  
  33  		// Process the deletion (remove target events)
  34  		if err := processor.ProcessDeletion(ctx, ev); err != nil {
  35  			// Log but don't fail - delete event was saved
  36  			// Some targets may not exist or may be owned by others
  37  		}
  38  
  39  		// Deliver the delete event to subscribers
  40  		cloned := ev.Clone()
  41  		go processor.DeliverEvent(cloned)
  42  
  43  		return HandledResult("")
  44  	}
  45  }
  46  
  47  // IsDeleteKind returns true if the kind is a delete event (kind 5).
  48  func IsDeleteKind(k uint16) bool {
  49  	return k == 5
  50  }
  51