wormhole-explorer/fly/migration/migration.go

134 lines
3.9 KiB
Go

package migration
import (
"context"
"errors"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
// TODO: move this to migration tool that support mongodb.
func Run(db *mongo.Database) error {
// Created governorConfig collection.
err := db.CreateCollection(context.TODO(), "governorConfig")
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// Created governorStatus collection.
err = db.CreateCollection(context.TODO(), "governorStatus")
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// Created heartbeats collection.
err = db.CreateCollection(context.TODO(), "heartbeats")
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// Created observations collection.
err = db.CreateCollection(context.TODO(), "observations")
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// Created vaaCounts collection.
err = db.CreateCollection(context.TODO(), "vaaCounts")
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// Create vaas collection.
err = db.CreateCollection(context.TODO(), "vaas")
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// Create vassPythnet capped collection.
isCapped := true
var sizeCollection, maxDocuments int64 = 50 * 1024 * 1024, 10000
collectionOptions := options.CreateCollectionOptions{
Capped: &isCapped,
SizeInBytes: &sizeCollection,
MaxDocuments: &maxDocuments}
err = db.CreateCollection(context.TODO(), "vaasPythnet", &collectionOptions)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// Create vaaIdTxHash collection.
err = db.CreateCollection(context.TODO(), "vaaIdTxHash")
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// Create vaaIdTxHash collection.
err = db.CreateCollection(context.TODO(), "portalAnalytic")
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// create index in vaas collection by vaa key (emitterchain, emitterAddr, sequence)
indexVaaByKey := mongo.IndexModel{
Keys: bson.D{
{Key: "timestamp", Value: -1},
{Key: "emitterAddr", Value: 1},
{Key: "emitterChain", Value: 1},
}}
_, err = db.Collection("vaas").Indexes().CreateOne(context.TODO(), indexVaaByKey)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
indexVaaByTimestamp := mongo.IndexModel{
Keys: bson.D{
{Key: "emitterChain", Value: 1},
{Key: "emitterAddr", Value: 1},
{Key: "sequence", Value: 1},
}}
_, err = db.Collection("vaas").Indexes().CreateOne(context.TODO(), indexVaaByTimestamp)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// create index in observations collection by indexedAt.
indexObservationsByIndexedAt := mongo.IndexModel{Keys: bson.D{{Key: "indexedAt", Value: 1}}}
_, err = db.Collection("observations").Indexes().CreateOne(context.TODO(), indexObservationsByIndexedAt)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// create index in observations collect.
indexObservationsByEmitterChainAndAddressAndSequence := mongo.IndexModel{
Keys: bson.D{
{Key: "emitterChain", Value: 1},
{Key: "emitterAddr", Value: 1},
{Key: "sequence", Value: 1}}}
_, err = db.Collection("observations").Indexes().CreateOne(context.TODO(), indexObservationsByEmitterChainAndAddressAndSequence)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
// create index in vaaIdTxHash collect.
indexVaaIdTxHashByTxHash := mongo.IndexModel{
Keys: bson.D{{Key: "txHash", Value: 1}}}
_, err = db.Collection("vaaIdTxHash").Indexes().CreateOne(context.TODO(), indexVaaIdTxHashByTxHash)
if err != nil && isNotAlreadyExistsError(err) {
return err
}
return nil
}
func isNotAlreadyExistsError(err error) bool {
target := &mongo.CommandError{}
isCommandError := errors.As(err, target)
if !isCommandError || err.(mongo.CommandError).Code != 48 {
return true
}
return false
}