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  }