Skip to content
Snippets Groups Projects
fpc_storage.go 1.86 KiB
package dashboard

import (
	"context"
	"sync"
	"time"

	"github.com/iotaledger/goshimmer/plugins/config"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"go.mongodb.org/mongo-driver/mongo/readpref"
)

// FPCRecord defines the FPC record to be stored into a mongoDB
type FPCRecord struct {
	ConflictID string  `json:"conflictid" bson:"conflictid"`
	NodeID     string  `json:"nodeid" bson:"nodeid"`
	Rounds     int     `json:"rounds" bson:"rounds"`
	Opinions   []int32 `json:"opinions" bson:"opinions"`
	Status     int32   `json:"status" bson:"status"`
}

var (
	db              *mongo.Database
	ctxDisconnectDB context.Context
	clientDB        *mongo.Client
	dbOnce          sync.Once
)

func shutdownMongoDB() {
	clientDB.Disconnect(ctxDisconnectDB)
}

func mongoDB() *mongo.Database {
	dbOnce.Do(func() {
		username := config.Node.GetString(CfgMongoDBUsername)
		password := config.Node.GetString(CfgMongoDBPassword)
		bindAddr := config.Node.GetString(CfgMongoDBBindAddress)
		client, err := mongo.NewClient(options.Client().ApplyURI("mongodb://" + username + ":" + password + "@" + bindAddr))
		if err != nil {
			log.Fatal(err)
		}
		ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
		err = client.Connect(ctx)
		ctxDisconnectDB = ctx
		defer cancel()
		if err != nil {
			log.Fatal(err)
		}

		ctx, cancel = context.WithTimeout(context.Background(), 5*time.Second)
		defer cancel()
		err = client.Ping(ctx, readpref.Primary())
		if err != nil {
			log.Fatal(err)
		}
		db = client.Database("analysis")
	})
	return db
}

func storeFPCRecords(records []FPCRecord, db *mongo.Database) error {
	data := make([]interface{}, len(records))
	for i := range records {
		data[i] = records[i]
	}
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	_, err := db.Collection("FPC").InsertMany(ctx, data)
	return err
}