From dfa19ff0776be0850ad7b86ca579601431349593 Mon Sep 17 00:00:00 2001 From: bndw Date: Fri, 13 Feb 2026 20:38:59 -0800 Subject: feat: implement NIP-09 with hard delete Implement event deletion (NIP-09) using hard delete approach: - Kind 5 events trigger deletion but are not stored themselves - ProcessDeletion hard deletes referenced events (DELETE FROM events) - Only authors can delete their own events (pubkey verification) - Support multiple event IDs in single deletion request - No deletions table needed (simpler schema) - Added 4 deletion tests covering various scenarios - All 45 tests passing --- internal/handler/grpc/server.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'internal/handler/grpc') diff --git a/internal/handler/grpc/server.go b/internal/handler/grpc/server.go index b65b527..4d6e700 100644 --- a/internal/handler/grpc/server.go +++ b/internal/handler/grpc/server.go @@ -13,6 +13,7 @@ import ( type EventStore interface { StoreEvent(context.Context, *storage.EventData) error QueryEvents(context.Context, []*pb.Filter, *storage.QueryOptions) ([]*pb.Event, error) + ProcessDeletion(context.Context, *pb.Event) error } type Server struct { @@ -58,6 +59,22 @@ func (s *Server) PublishEvent(ctx context.Context, req *pb.PublishEventRequest) canonicalJSON := nostrEvent.Serialize() + // Handle deletion events (kind 5) - process but don't store + if req.Event.Kind == 5 { + if err := s.store.ProcessDeletion(ctx, req.Event); err != nil { + return &pb.PublishEventResponse{ + Accepted: false, + Message: fmt.Sprintf("deletion failed: %v", err), + CanonicalJson: canonicalJSON, + }, nil + } + return &pb.PublishEventResponse{ + Accepted: true, + Message: "deleted", + CanonicalJson: canonicalJSON, + }, nil + } + eventData := &storage.EventData{ Event: req.Event, CanonicalJSON: canonicalJSON, -- cgit v1.2.3