summaryrefslogtreecommitdiffstats
path: root/internal/storage/deletions.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/storage/deletions.go')
-rw-r--r--internal/storage/deletions.go67
1 files changed, 67 insertions, 0 deletions
diff --git a/internal/storage/deletions.go b/internal/storage/deletions.go
new file mode 100644
index 0000000..c16b96b
--- /dev/null
+++ b/internal/storage/deletions.go
@@ -0,0 +1,67 @@
1package storage
2
3import (
4 "context"
5 "fmt"
6
7 pb "northwest.io/nostr-grpc/api/nostr/v1"
8)
9
10const KindDeletion = 5
11
12// ProcessDeletion handles kind 5 deletion events by hard deleting the referenced events.
13// Only events authored by the same pubkey as the deletion event can be deleted.
14func (s *Storage) ProcessDeletion(ctx context.Context, deletionEvent *pb.Event) error {
15 if deletionEvent.Kind != KindDeletion {
16 return fmt.Errorf("not a deletion event")
17 }
18
19 // Extract event IDs to delete from "e" tags
20 var eventIDsToDelete []string
21 for _, tag := range deletionEvent.Tags {
22 if len(tag.Values) >= 2 && tag.Values[0] == "e" {
23 eventIDsToDelete = append(eventIDsToDelete, tag.Values[1])
24 }
25 }
26
27 if len(eventIDsToDelete) == 0 {
28 return nil
29 }
30
31 tx, err := s.db.BeginTx(ctx, nil)
32 if err != nil {
33 return fmt.Errorf("failed to begin transaction: %w", err)
34 }
35 defer tx.Rollback()
36
37 // Hard delete each referenced event (only if authored by same pubkey)
38 for _, eventID := range eventIDsToDelete {
39 // Verify the event exists and was authored by the same pubkey
40 var eventPubkey string
41 err := tx.QueryRowContext(ctx,
42 "SELECT pubkey FROM events WHERE id = ?",
43 eventID,
44 ).Scan(&eventPubkey)
45
46 if err != nil {
47 // Event doesn't exist, skip
48 continue
49 }
50
51 // Only delete if pubkeys match
52 if eventPubkey != deletionEvent.Pubkey {
53 continue
54 }
55
56 // Hard delete the event
57 _, err = tx.ExecContext(ctx,
58 "DELETE FROM events WHERE id = ?",
59 eventID,
60 )
61 if err != nil {
62 return fmt.Errorf("failed to delete event: %w", err)
63 }
64 }
65
66 return tx.Commit()
67}