You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
1.9 KiB
83 lines
1.9 KiB
package neo4j |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
|
|
"git.mleku.dev/mleku/nostr/encoders/hex" |
|
) |
|
|
|
// Markers provide metadata key-value storage using Neo4j Marker nodes |
|
// We store markers as special nodes with label "Marker" |
|
|
|
// SetMarker sets a metadata marker |
|
func (n *N) SetMarker(key string, value []byte) error { |
|
valueHex := hex.Enc(value) |
|
|
|
cypher := ` |
|
MERGE (m:Marker {key: $key}) |
|
SET m.value = $value` |
|
|
|
params := map[string]any{ |
|
"key": key, |
|
"value": valueHex, |
|
} |
|
|
|
_, err := n.ExecuteWrite(context.Background(), cypher, params) |
|
if err != nil { |
|
return fmt.Errorf("failed to set marker: %w", err) |
|
} |
|
|
|
return nil |
|
} |
|
|
|
// GetMarker retrieves a metadata marker |
|
func (n *N) GetMarker(key string) (value []byte, err error) { |
|
cypher := "MATCH (m:Marker {key: $key}) RETURN m.value AS value" |
|
params := map[string]any{"key": key} |
|
|
|
result, err := n.ExecuteRead(context.Background(), cypher, params) |
|
if err != nil { |
|
return nil, fmt.Errorf("failed to get marker: %w", err) |
|
} |
|
|
|
ctx := context.Background() |
|
|
|
if result.Next(ctx) { |
|
record := result.Record() |
|
if record != nil { |
|
valueRaw, found := record.Get("value") |
|
if found { |
|
if valueStr, ok := valueRaw.(string); ok { |
|
// Decode hex value |
|
value, err = hex.Dec(valueStr) |
|
if err != nil { |
|
return nil, fmt.Errorf("failed to decode marker value: %w", err) |
|
} |
|
return value, nil |
|
} |
|
} |
|
} |
|
} |
|
|
|
return nil, fmt.Errorf("marker not found: %s", key) |
|
} |
|
|
|
// HasMarker checks if a marker exists |
|
func (n *N) HasMarker(key string) bool { |
|
_, err := n.GetMarker(key) |
|
return err == nil |
|
} |
|
|
|
// DeleteMarker removes a metadata marker |
|
func (n *N) DeleteMarker(key string) error { |
|
cypher := "MATCH (m:Marker {key: $key}) DELETE m" |
|
params := map[string]any{"key": key} |
|
|
|
_, err := n.ExecuteWrite(context.Background(), cypher, params) |
|
if err != nil { |
|
return fmt.Errorf("failed to delete marker: %w", err) |
|
} |
|
|
|
return nil |
|
}
|
|
|