7 "github.com/jinzhu/gorm"
8 log "github.com/sirupsen/logrus"
10 "github.com/vapor/crypto/ed25519/chainkd"
11 "github.com/vapor/netsync/peers"
12 "github.com/vapor/toolbar/precog/common"
13 "github.com/vapor/toolbar/precog/config"
14 "github.com/vapor/toolbar/precog/database/orm"
18 // TODO: get best_height
19 // TODO: decide check_height("best best_height" - "confirmations")
20 // TODO: get blockhash by check_height, get latency
21 // TODO: update lantency, active_time and status
23 // create or update: https://github.com/jinzhu/gorm/issues/1307
24 func (m *monitor) upSertNode(node *config.Node) error {
26 node.PublicKey = fmt.Sprintf("%v", node.XPub.PublicKey().String())
29 ormNode := &orm.Node{PublicKey: node.PublicKey}
30 if err := m.db.Where(&orm.Node{PublicKey: node.PublicKey}).First(ormNode).Error; err != nil && err != gorm.ErrRecordNotFound {
35 ormNode.Alias = node.Alias
38 ormNode.Xpub = node.XPub.String()
40 ormNode.Host = node.Host
41 ormNode.Port = node.Port
42 return m.db.Where(&orm.Node{PublicKey: ormNode.PublicKey}).
48 }).FirstOrCreate(ormNode).Error
51 func (m *monitor) savePeerInfo(peerInfo *peers.PeerInfo) error {
52 xPub := &chainkd.XPub{}
53 if err := xPub.UnmarshalText([]byte(peerInfo.ID)); err != nil {
57 ormNode := &orm.Node{}
58 if err := m.db.Model(&orm.Node{}).Where(&orm.Node{PublicKey: xPub.PublicKey().String()}).
59 UpdateColumn(&orm.Node{
60 Alias: peerInfo.Moniker,
62 BestHeight: peerInfo.Height,
63 // LatestDailyUptimeMinutes uint64
64 }).First(ormNode).Error; err != nil {
68 log.Debug("peerInfo.Ping:", peerInfo.Ping)
70 ormNodeLiveness := &orm.NodeLiveness{
72 BestHeight: ormNode.BestHeight,
73 AvgLantencyMS: sql.NullInt64{Int64: 1, Valid: true},
77 if err := m.db.Model(&orm.NodeLiveness{}).Where("node_id = ? AND status != ?", ormNode.ID, common.NodeOfflineStatus).
78 UpdateColumn(&orm.NodeLiveness{
79 BestHeight: ormNodeLiveness.BestHeight,
80 AvgLantencyMS: ormNodeLiveness.AvgLantencyMS,
81 }).FirstOrCreate(ormNodeLiveness).Error; err != nil {