From d3abaa87e7b7cfcdad64af43ff6cda23efd9a70a Mon Sep 17 00:00:00 2001 From: Jay Date: Thu, 21 May 2026 16:35:10 -0400 Subject: [PATCH] add replaceable event expander --- subgraph.go | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/subgraph.go b/subgraph.go index 5c3877d..2b401d3 100644 --- a/subgraph.go +++ b/subgraph.go @@ -44,7 +44,7 @@ func (s *EventSubgraph) NodesByLabel(label string) []*Node { return nodes } -func (s *EventSubgraph) FirstNodesByLabel(label string) *Node { +func (s *EventSubgraph) FirstNodeByLabel(label string) *Node { for _, node := range s.nodes { if node.Labels.Contains(label) { return node @@ -148,6 +148,7 @@ func DefaultExpanders() []Expander { return []Expander{ ExpandTaggedEvents, ExpandTaggedUsers, + ExpandReplaceableEvents, } } @@ -186,3 +187,30 @@ func ExpandTaggedUsers(e roots.Event, s *EventSubgraph) { s.AddRel(NewReferencesUserRel(tag, user, nil)) } } + +func ExpandReplaceableEvents(e roots.Event, s *EventSubgraph) { + if e.Kind != 0 && e.Kind != 3 && !(e.Kind >= 10000 && e.Kind < 20000) { + return + } + + eventNode := s.FirstNodeByLabel("Event") + if eventNode == nil { + return + } + + var authorNode *Node + for _, n := range s.NodesByLabel("User") { + if n.Props["pubkey"] == e.PubKey { + authorNode = n + break + } + } + if authorNode == nil { + return + } + + rk := NewReplacementKeyNode(e.PubKey, e.Kind) + s.AddNode(rk) + s.AddRel(NewIsReplaceableRel(eventNode, rk, nil)) + s.AddRel(NewForUserRel(rk, authorNode, nil)) +}