feat(go): add realtime kv projection
This commit is contained in:
@@ -81,6 +81,9 @@ func (r *Repository) Update(ctx context.Context, env envelope.FrameEnvelope) err
|
||||
if err := r.setJSON(ctx, realtimeRawKey(vehicleKey, env.Protocol), protocolSnapshot.Parsed, r.cfg.ttl()); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := r.setKV(ctx, vin, env, protocolSnapshot.Parsed); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
protocols, err := r.addProtocol(ctx, vehicleKey, env.Protocol)
|
||||
if err != nil {
|
||||
@@ -180,6 +183,30 @@ func (r *Repository) setJSON(ctx context.Context, key string, value any, ttl tim
|
||||
return r.client.Set(ctx, key, payload, ttl).Err()
|
||||
}
|
||||
|
||||
func (r *Repository) setKV(ctx context.Context, vin string, env envelope.FrameEnvelope, parsed map[string]any) error {
|
||||
rows := realtimeKVFields(env, parsed)
|
||||
for _, row := range rows {
|
||||
key := realtimeKVKey(row.Protocol, vin, row.Domain)
|
||||
values := map[string]any{
|
||||
row.Field: row.Value,
|
||||
"_event_time_ms": strconv.FormatInt(row.EventTimeMS, 10),
|
||||
"_received_at_ms": strconv.FormatInt(row.ReceivedAtMS, 10),
|
||||
"_event_id": row.EventID,
|
||||
"_protocol": string(row.Protocol),
|
||||
"_vin": vin,
|
||||
"_domain": row.Domain,
|
||||
"_value_type:" + row.Field: row.ValueType,
|
||||
}
|
||||
if err := r.client.HSet(ctx, key, values).Err(); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := r.client.Expire(ctx, key, r.cfg.ttl()).Err(); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *Repository) addProtocol(ctx context.Context, vehicleKey string, protocol envelope.Protocol) ([]envelope.Protocol, error) {
|
||||
key := protocolsKey(vehicleKey)
|
||||
if err := r.client.SAdd(ctx, key, string(protocol)).Err(); err != nil {
|
||||
@@ -480,6 +507,10 @@ func realtimeRawKey(vehicleKey string, protocol envelope.Protocol) string {
|
||||
return "vehicle:realtime-raw:" + string(protocol) + ":" + strings.TrimSpace(vehicleKey)
|
||||
}
|
||||
|
||||
func realtimeKVKey(protocol envelope.Protocol, vin string, domain string) string {
|
||||
return "vehicle:rt-kv:" + string(protocol) + ":" + strings.TrimSpace(vin) + ":" + strings.TrimSpace(domain)
|
||||
}
|
||||
|
||||
func onlineKey(vehicleKey string) string {
|
||||
return "vehicle:online:" + strings.TrimSpace(vehicleKey)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user