128 lines
3.0 KiB
Go
128 lines
3.0 KiB
Go
package storage
|
|
|
|
import (
|
|
"context"
|
|
|
|
commonRepo "github.com/wormhole-foundation/wormhole-explorer/common/repository"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
"go.uber.org/zap"
|
|
"gopkg.in/mgo.v2/bson"
|
|
)
|
|
|
|
// Repository exposes operations over the `globalTransactions` collection.
|
|
type Repository struct {
|
|
logger *zap.Logger
|
|
vaas *mongo.Collection
|
|
duplicateVaas *mongo.Collection
|
|
}
|
|
|
|
// New creates a new repository.
|
|
func NewRepository(logger *zap.Logger, db *mongo.Database) *Repository {
|
|
r := Repository{
|
|
logger: logger,
|
|
vaas: db.Collection(commonRepo.Vaas),
|
|
duplicateVaas: db.Collection(commonRepo.DuplicateVaas),
|
|
}
|
|
return &r
|
|
}
|
|
|
|
// FindVAAById find a vaa by id.
|
|
func (r *Repository) FindVAAById(ctx context.Context, vaaID string) (*VaaDoc, error) {
|
|
var vaaDoc VaaDoc
|
|
err := r.vaas.FindOne(ctx, bson.M{"_id": vaaID}).Decode(&vaaDoc)
|
|
return &vaaDoc, err
|
|
}
|
|
|
|
// FindDuplicateVAAById find a duplicate vaa by id.
|
|
func (r *Repository) FindDuplicateVAAById(ctx context.Context, id string) (*DuplicateVaaDoc, error) {
|
|
var duplicateVaaDoc DuplicateVaaDoc
|
|
err := r.duplicateVaas.FindOne(ctx, bson.M{"_id": id}).Decode(&duplicateVaaDoc)
|
|
return &duplicateVaaDoc, err
|
|
}
|
|
|
|
// FindDuplicateVAAs find duplicate vaas by vaa id.
|
|
func (r *Repository) FindDuplicateVAAs(ctx context.Context, vaaID string) ([]DuplicateVaaDoc, error) {
|
|
var duplicateVaaDocs []DuplicateVaaDoc
|
|
cursor, err := r.duplicateVaas.Find(ctx, bson.M{"vaaId": vaaID})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err = cursor.All(ctx, &duplicateVaaDocs); err != nil {
|
|
return nil, err
|
|
}
|
|
return duplicateVaaDocs, nil
|
|
}
|
|
|
|
// FixVAA fix a vaa by id.
|
|
func (r *Repository) FixVAA(ctx context.Context, vaaID, duplicateID string) error {
|
|
// start mongo transaction
|
|
session, err := r.vaas.Database().Client().StartSession()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = session.StartTransaction()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// get VAA by id
|
|
vaaDoc, err := r.FindVAAById(ctx, vaaID)
|
|
if err != nil {
|
|
session.AbortTransaction(ctx)
|
|
return err
|
|
}
|
|
|
|
// get duplicate vaa by id
|
|
duplicateVaaDoc, err := r.FindDuplicateVAAById(ctx, duplicateID)
|
|
if err != nil {
|
|
session.AbortTransaction(ctx)
|
|
return err
|
|
}
|
|
|
|
// create new vaa and new duplicate vaa
|
|
newVaa := duplicateVaaDoc.ToVaaDoc(true)
|
|
newDuplicateVaa, err := vaaDoc.ToDuplicateVaaDoc()
|
|
if err != nil {
|
|
session.AbortTransaction(ctx)
|
|
return err
|
|
}
|
|
|
|
// remove vaa
|
|
_, err = r.vaas.DeleteOne(ctx, bson.M{"_id": vaaID})
|
|
if err != nil {
|
|
session.AbortTransaction(ctx)
|
|
return err
|
|
}
|
|
|
|
// remove duplicate vaa
|
|
_, err = r.duplicateVaas.DeleteOne(ctx, bson.M{"_id": duplicateID})
|
|
if err != nil {
|
|
session.AbortTransaction(ctx)
|
|
return err
|
|
}
|
|
|
|
// insert new vaa
|
|
_, err = r.vaas.InsertOne(ctx, newVaa)
|
|
if err != nil {
|
|
session.AbortTransaction(ctx)
|
|
return err
|
|
}
|
|
|
|
// insert new duplicate vaa
|
|
_, err = r.duplicateVaas.InsertOne(ctx, newDuplicateVaa)
|
|
if err != nil {
|
|
session.AbortTransaction(ctx)
|
|
return err
|
|
}
|
|
|
|
// commit transaction
|
|
err = session.CommitTransaction(ctx)
|
|
if err != nil {
|
|
session.AbortTransaction(ctx)
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|