loadEventData loads event data for every event in evts (by UniqueID) and set additional fields in the events.
(ctx context.Context, cl redis.Cmdable, evts ...*ttnpb.Event)
| 92 | // loadEventData loads event data for every event in evts (by UniqueID) |
| 93 | // and set additional fields in the events. |
| 94 | func (ps *PubSubStore) loadEventData(ctx context.Context, cl redis.Cmdable, evts ...*ttnpb.Event) error { |
| 95 | if len(evts) == 0 { |
| 96 | return nil |
| 97 | } |
| 98 | keys := make([]string, 0, len(evts)) |
| 99 | for _, evt := range evts { |
| 100 | keys = append(keys, ps.eventDataKey(ctx, evt.UniqueId)) |
| 101 | } |
| 102 | bs, err := cl.MGet(ctx, keys...).Result() |
| 103 | if err != nil { |
| 104 | return ttnredis.ConvertError(err) |
| 105 | } |
| 106 | for i, b := range bs { |
| 107 | switch b := b.(type) { |
| 108 | case nil: |
| 109 | continue // Event data deleted/expired. |
| 110 | case string: |
| 111 | if err = decodeEventData(b, evts[i]); err != nil { |
| 112 | log.FromContext(ctx).WithError(err).Warn("Failed to decode event payload") |
| 113 | continue |
| 114 | } |
| 115 | default: |
| 116 | log.FromContext(ctx).WithField("element", b).Warn("Invalid element in event payloads") |
| 117 | continue |
| 118 | } |
| 119 | } |
| 120 | return nil |
| 121 | } |
| 122 | |
| 123 | // LoadEvent loads an event by its UID. |
| 124 | func (ps *PubSubStore) LoadEvent(ctx context.Context, uid string) (*ttnpb.Event, error) { |
no test coverage detected