diff --git a/go/vehicle-gateway/internal/realtime/model.go b/go/vehicle-gateway/internal/realtime/model.go index a60a4b9d..747bd5ce 100644 --- a/go/vehicle-gateway/internal/realtime/model.go +++ b/go/vehicle-gateway/internal/realtime/model.go @@ -7,16 +7,17 @@ import ( ) type Snapshot struct { - VehicleKey string `json:"vehicle_key"` - VIN string `json:"vin"` - Protocol envelope.Protocol `json:"protocol,omitempty"` - EventID string `json:"event_id,omitempty"` - EventTimeMS int64 `json:"event_time_ms"` - ReceivedAtMS int64 `json:"received_at_ms"` - SourceEndpoint string `json:"source_endpoint,omitempty"` - Fields map[string]any `json:"fields,omitempty"` - FieldTimesMS map[string]int64 `json:"field_times_ms,omitempty"` - UpdatedAtMS int64 `json:"updated_at_ms"` + VehicleKey string `json:"vehicle_key"` + VIN string `json:"vin"` + Protocol envelope.Protocol `json:"protocol,omitempty"` + Protocols []envelope.Protocol `json:"protocols,omitempty"` + EventID string `json:"event_id,omitempty"` + EventTimeMS int64 `json:"event_time_ms"` + ReceivedAtMS int64 `json:"received_at_ms"` + SourceEndpoint string `json:"source_endpoint,omitempty"` + Fields map[string]any `json:"fields,omitempty"` + FieldTimesMS map[string]int64 `json:"field_times_ms,omitempty"` + UpdatedAtMS int64 `json:"updated_at_ms"` } type OnlineStatus struct { diff --git a/go/vehicle-gateway/internal/realtime/repository.go b/go/vehicle-gateway/internal/realtime/repository.go index 1c2ea5d2..d4adab3b 100644 --- a/go/vehicle-gateway/internal/realtime/repository.go +++ b/go/vehicle-gateway/internal/realtime/repository.go @@ -53,6 +53,11 @@ func (r *Repository) Update(ctx context.Context, env envelope.FrameEnvelope) err return err } + protocols, err := r.addProtocol(ctx, vehicleKey, env.Protocol) + if err != nil { + return err + } + merged, err := r.GetMerged(ctx, vehicleKey) if err != nil && !errors.Is(err, redis.Nil) { return err @@ -69,15 +74,12 @@ func (r *Repository) Update(ctx context.Context, env envelope.FrameEnvelope) err merged.ReceivedAtMS = env.ReceivedAtMS merged.SourceEndpoint = env.SourceEndpoint } + merged.Protocols = protocols merged.UpdatedAtMS = nowMS if err := r.setJSON(ctx, mergedKey(vehicleKey), merged, r.cfg.ttl()); err != nil { return err } - protocols, err := r.addProtocol(ctx, vehicleKey, env.Protocol) - if err != nil { - return err - } online := OnlineStatus{ VehicleKey: vehicleKey, VIN: vin, diff --git a/go/vehicle-gateway/internal/realtime/repository_test.go b/go/vehicle-gateway/internal/realtime/repository_test.go index 5497fc21..169ce4f1 100644 --- a/go/vehicle-gateway/internal/realtime/repository_test.go +++ b/go/vehicle-gateway/internal/realtime/repository_test.go @@ -54,6 +54,9 @@ func TestRepositoryUpdatesMergedAndProtocolSnapshots(t *testing.T) { if merged.Fields[envelope.FieldLatitude] != 30.5 { t.Fatalf("new latitude missing: %#v", merged.Fields) } + if got := protocolNames(merged.Protocols); strings.Join(got, ",") != "GB32960,JT808" { + t.Fatalf("merged protocols = %#v", got) + } protocol, err := repo.GetProtocol(ctx, "VIN001", envelope.ProtocolJT808) if err != nil { t.Fatalf("GetProtocol() error = %v", err) @@ -237,3 +240,11 @@ func newTestRepository(t *testing.T) (*Repository, func()) { func stringsContains(value string, pattern string) bool { return strings.Contains(value, pattern) } + +func protocolNames(protocols []envelope.Protocol) []string { + names := make([]string, 0, len(protocols)) + for _, protocol := range protocols { + names = append(names, string(protocol)) + } + return names +}