package storage import ( "context" "fmt" pb "northwest.io/nostr-grpc/api/nostr/v1" ) const KindDeletion = 5 func (s *Storage) ProcessDeletion(ctx context.Context, deletionEvent *pb.Event) error { if deletionEvent.Kind != KindDeletion { return fmt.Errorf("not a deletion event") } var eventIDsToDelete []string for _, tag := range deletionEvent.Tags { if len(tag.Values) >= 2 && tag.Values[0] == "e" { eventIDsToDelete = append(eventIDsToDelete, tag.Values[1]) } } if len(eventIDsToDelete) == 0 { return nil } tx, err := s.db.BeginTx(ctx, nil) if err != nil { return fmt.Errorf("failed to begin transaction: %w", err) } defer tx.Rollback() for _, eventID := range eventIDsToDelete { var eventPubkey string err := tx.QueryRowContext(ctx, "SELECT pubkey FROM events WHERE id = ? AND deleted = 0", eventID, ).Scan(&eventPubkey) if err != nil { continue } if eventPubkey != deletionEvent.Pubkey { continue } _, err = tx.ExecContext(ctx, "UPDATE events SET deleted = 1 WHERE id = ?", eventID, ) if err != nil { return fmt.Errorf("failed to mark event as deleted: %w", err) } _, err = tx.ExecContext(ctx, "INSERT OR IGNORE INTO deletions (deleted_event_id, deletion_event_id, pubkey, created_at) VALUES (?, ?, ?, ?)", eventID, deletionEvent.Id, deletionEvent.Pubkey, deletionEvent.CreatedAt, ) if err != nil { return fmt.Errorf("failed to record deletion: %w", err) } } return tx.Commit() }