@@ -2,17 +2,18 @@ package convert
22
33import (
44 "encoding/json"
5+ "fmt"
56 "github.com/DIMO-Network/cloudevent"
67 "github.com/DIMO-Network/model-garage/pkg/defaultmodule"
78 "github.com/DIMO-Network/oracle-example/internal/config"
89 dbmodels "github.com/DIMO-Network/oracle-example/internal/db/models"
910 "github.com/DIMO-Network/oracle-example/internal/models"
10- "github.com/segmentio/ksuid "
11+ "github.com/rs/zerolog "
1112 "time"
1213)
1314
14- // ToCloudEvent Convert the external vendor msg payload to a CloudEvent
15- func ToCloudEvent (veh dbmodels.Vin , msg models. UnbufferedMessageValue , settings config. Settings ) ( * cloudevent.CloudEvent [json.RawMessage ], error ) {
15+ // SetProducerAndSubject sets the producer and consumer fields in the CloudEvent
16+ func SetProducerAndSubject (veh dbmodels.Vin , ce * cloudevent.CloudEvent [json.RawMessage ], settings config. Settings ) error {
1617 // Construct the producer DID
1718 producer := cloudevent.NFTDID {
1819 ChainID : uint64 (settings .ChainID ),
@@ -31,44 +32,52 @@ func ToCloudEvent(veh dbmodels.Vin, msg models.UnbufferedMessageValue, settings
3132 }.String ()
3233 }
3334
34- ch , err := createCloudEventHeader (msg .Timestamp , producer , subject , cloudevent .TypeStatus )
35- if err != nil {
36- return nil , err
37- }
35+ ce .Subject = subject
36+ ce .Producer = producer
3837
39- // transform the data to default DIS format
40- signals , err := mapDataToSignals ( msg . Data , msg . Timestamp )
38+ return nil
39+ }
4140
42- if err != nil {
43- return nil , err
41+ // ValidateSignals validates the signals from the message
42+ func ValidateSignals (signals interface {}, logger zerolog.Logger ) error {
43+
44+ signalsArr , ok := signals .([]interface {})
45+ if ! ok {
46+ err := fmt .Errorf ("signals is not of type []interface{}" )
47+ logger .Error ().Err (err ).Msg ("Invalid type for signals" )
48+ return err
4449 }
4550
46- // Wrap the signals into a struct
47- wrappedData := struct {
48- Signals []* defaultmodule.Signal `json:"signals"`
49- Vin string `json:"vin"`
50- }{
51- Signals : signals ,
52- Vin : veh .Vin ,
51+ signalArray , err := CastToSliceOfMaps (signalsArr )
52+ if err != nil {
53+ logger .Error ().Err (err ).Msg ("Failed to cast signals to slice of maps" )
54+ return err
5355 }
5456
55- // Marshal the wrapped data to json.RawMessage
56- data , err := json . Marshal ( wrappedData )
57+ // Load the signal map
58+ sigMap , err := defaultmodule . LoadSignalMap ( )
5759 if err != nil {
58- return nil , err
60+ return err
5961 }
6062
61- // Create the CloudEvent
62- ce := & cloudevent.CloudEvent [json.RawMessage ]{
63- CloudEventHeader : ch ,
64- Data : data ,
63+ for _ , signal := range signalArray {
64+ name , ok := signal ["name" ].(string )
65+ if ! ok {
66+ logger .Warn ().Msgf ("Signal name is missing or not a string: %v\n " , signal )
67+ continue
68+ }
69+
70+ if _ , exists := sigMap [name ]; ! exists {
71+ logger .Warn ().Msgf ("Signal %s is not in the signal map\n " , name )
72+ continue
73+ }
6574 }
6675
67- return ce , nil
76+ return nil
6877}
6978
70- // mapDataToSignals maps the data from the message to the default DIS signals
71- func mapDataToSignals (data models.Data , ts time.Time ) ([]* defaultmodule.Signal , error ) {
79+ // MapDataToSignals maps the data from the message to the default DIS signals
80+ func MapDataToSignals (data models.Data , ts time.Time ) ([]* defaultmodule.Signal , error ) {
7281 var signals []* defaultmodule.Signal
7382
7483 sigMap , err := defaultmodule .LoadSignalMap ()
@@ -124,16 +133,16 @@ func mapDataToSignals(data models.Data, ts time.Time) ([]*defaultmodule.Signal,
124133 return signals , nil
125134}
126135
127- // createCloudEvent creates a cloud event from autopi event.
128- func createCloudEventHeader ( ts time. Time , producer , subject , eventType string ) (cloudevent. CloudEventHeader , error ) {
129- return cloudevent. CloudEventHeader {
130- DataContentType : "application/json" ,
131- ID : ksuid . New (). String (),
132- Subject : subject ,
133- SpecVersion : "1.0" ,
134- Time : ts ,
135- Type : eventType ,
136- DataVersion : "default/v1.0" ,
137- Producer : producer ,
138- } , nil
136+ func CastToSliceOfMaps ( signals [] interface {}) ([] map [ string ] interface {}, error ) {
137+ var result [] map [ string ] interface {}
138+
139+ for _ , item := range signals {
140+ castItem , ok := item .( map [ string ] interface {})
141+ if ! ok {
142+ return nil , fmt . Errorf ( "failed to cast item to map[string]interface{}: %v" , item )
143+ }
144+ result = append ( result , castItem )
145+ }
146+
147+ return result , nil
139148}
0 commit comments