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{})
| 48 | // - map[string]interface{}: The merged metadata after the update. |
| 49 | // - error: An error if the update operation fails. |
| 50 | func (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) |