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