MCPcopy Create free account
hub / github.com/devaccuracy/ledgerforge / UpdateMetadata

Method UpdateMetadata

metadata.go:50–174  ·  view source on GitHub ↗

UpdateMetadata updates the metadata for a given entity ID. It first determines the entity type, retrieves current metadata, merges it with new metadata, updates the entity with the merged metadata, and queues the updated entity for re-indexing in Typesense. Parameters: - ctx: The context for the op

(ctx context.Context, entityID string, newMetadata map[string]interface{})

Source from the content-addressed store, hash-verified

48// - map[string]interface{}: The merged metadata after the update.
49// - error: An error if the update operation fails.
50func (l *LedgerForge) UpdateMetadata(ctx context.Context, entityID string, newMetadata map[string]interface{}) (map[string]interface{}, error) {
51 entityType, err := getEntityTypeFromID(entityID)
52 if err != nil {
53 return nil, err
54 }
55
56 // Check if entity exists first
57 switch entityType {
58 case "ledgers":
59 ledger, err := l.GetLedgerByID(entityID)
60 if err != nil {
61 return nil, errors.New("entity not found")
62 }
63 currentMetadata := ledger.MetaData
64 mergedMetadata := mergeMetadata(currentMetadata, newMetadata)
65 err = l.updateEntityMetadata(ctx, entityType, entityID, mergedMetadata)
66 if err != nil {
67 return nil, fmt.Errorf("failed to update metadata: %w", err)
68 }
69
70 // Queue the updated ledger for re-indexing in Typesense
71 if l.queue != nil {
72 go func() {
73 updatedLedger, err := l.GetLedgerByID(entityID)
74 if err == nil {
75 err = l.queue.queueIndexData(entityID, "ledgers", updatedLedger)
76 if err != nil {
77 notification.NotifyError(err)
78 }
79 }
80 }()
81 }
82
83 return mergedMetadata, nil
84
85 case "transactions":
86 // Check if transaction exists either by direct ID or as parent ID
87 exists, err := l.datasource.TransactionExistsByIDOrParentID(ctx, entityID)
88 if err != nil {
89 return nil, err
90 }
91 if !exists {
92 return nil, errors.New("entity not found")
93 }
94
95 // Apply metadata updates directly without trying to get current metadata
96 // This preserves existing metadata in child transactions
97 err = l.updateEntityMetadata(ctx, entityType, entityID, newMetadata)
98 if err != nil {
99 return nil, fmt.Errorf("failed to update metadata: %w", err)
100 }
101
102 // Queue the updated transaction for re-indexing in Typesense
103 if l.queue != nil {
104 go func() {
105 updatedTransaction, err := l.GetTransaction(context.Background(), entityID)
106 if err == nil {
107 err = l.queue.queueIndexData(entityID, "transactions", updatedTransaction)

Callers 1

TestUpdateMetadataFunction · 0.95

Calls 10

GetLedgerByIDMethod · 0.95
updateEntityMetadataMethod · 0.95
GetTransactionMethod · 0.95
GetBalanceByIDMethod · 0.95
GetIdentityMethod · 0.95
NotifyErrorFunction · 0.92
getEntityTypeFromIDFunction · 0.85
mergeMetadataFunction · 0.85
queueIndexDataMethod · 0.80

Tested by 1

TestUpdateMetadataFunction · 0.76