github.com/status-im/status-go@v1.1.0/protocol/anonmetrics/adaptors.go (about) 1 package anonmetrics 2 3 import ( 4 "crypto/ecdsa" 5 "fmt" 6 7 "github.com/davecgh/go-spew/spew" 8 "github.com/golang/protobuf/ptypes" 9 10 "github.com/status-im/status-go/appmetrics" 11 "github.com/status-im/status-go/eth-node/crypto" 12 "github.com/status-im/status-go/eth-node/types" 13 "github.com/status-im/status-go/protocol/protobuf" 14 ) 15 16 // adaptProtoToModel is an adaptor helper function to convert a protobuf.AnonymousMetric into a appmetrics.AppMetric 17 func adaptProtoToModel(pbAnonMetric *protobuf.AnonymousMetric) (*appmetrics.AppMetric, error) { 18 t, err := ptypes.Timestamp(pbAnonMetric.CreatedAt) 19 if err != nil { 20 return nil, err 21 } 22 23 return &appmetrics.AppMetric{ 24 MessageID: pbAnonMetric.Id, 25 Event: appmetrics.AppMetricEventType(pbAnonMetric.Event), 26 Value: pbAnonMetric.Value, 27 AppVersion: pbAnonMetric.AppVersion, 28 OS: pbAnonMetric.Os, 29 SessionID: pbAnonMetric.SessionId, 30 CreatedAt: t, 31 }, nil 32 } 33 34 // adaptModelToProto is an adaptor helper function to convert a appmetrics.AppMetric into a protobuf.AnonymousMetric 35 func adaptModelToProto(modelAnonMetric appmetrics.AppMetric, sendID *ecdsa.PublicKey) (*protobuf.AnonymousMetric, error) { 36 id := generateProtoID(modelAnonMetric, sendID) 37 createdAt, err := ptypes.TimestampProto(modelAnonMetric.CreatedAt) 38 if err != nil { 39 return nil, err 40 } 41 42 return &protobuf.AnonymousMetric{ 43 Id: id, 44 Event: string(modelAnonMetric.Event), 45 Value: modelAnonMetric.Value, 46 AppVersion: modelAnonMetric.AppVersion, 47 Os: modelAnonMetric.OS, 48 SessionId: modelAnonMetric.SessionID, 49 CreatedAt: createdAt, 50 }, nil 51 } 52 53 func adaptModelsToProtoBatch(modelAnonMetrics []appmetrics.AppMetric, sendID *ecdsa.PublicKey) (*protobuf.AnonymousMetricBatch, error) { 54 amb := new(protobuf.AnonymousMetricBatch) 55 56 for _, m := range modelAnonMetrics { 57 p, err := adaptModelToProto(m, sendID) 58 if err != nil { 59 return nil, err 60 } 61 62 amb.Metrics = append(amb.Metrics, p) 63 } 64 65 return amb, nil 66 } 67 68 func adaptProtoBatchToModels(protoBatch *protobuf.AnonymousMetricBatch) ([]*appmetrics.AppMetric, error) { 69 if protoBatch == nil { 70 return nil, nil 71 } 72 73 var ams []*appmetrics.AppMetric 74 75 for _, pm := range protoBatch.Metrics { 76 m, err := adaptProtoToModel(pm) 77 if err != nil { 78 return nil, err 79 } 80 81 ams = append(ams, m) 82 } 83 84 return ams, nil 85 } 86 87 // NEEDED because we don't send individual metrics, we send only batches 88 func generateProtoID(modelAnonMetric appmetrics.AppMetric, sendID *ecdsa.PublicKey) string { 89 return types.EncodeHex(crypto.Keccak256([]byte(fmt.Sprintf( 90 "%s%s", 91 types.EncodeHex(crypto.FromECDSAPub(sendID)), 92 spew.Sdump(modelAnonMetric))))) 93 }