84 lines
1.9 KiB
Go
84 lines
1.9 KiB
Go
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
|
|
}
|