github.com/wormhole-foundation/wormhole-explorer/common@v0.0.0-20240604151348-09585b5b97c5/repository/guardianset.go (about)

     1  package repository
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"go.mongodb.org/mongo-driver/bson"
     8  	"go.mongodb.org/mongo-driver/mongo"
     9  	"go.mongodb.org/mongo-driver/mongo/options"
    10  	"go.uber.org/zap"
    11  )
    12  
    13  type GuardianSetRepository struct {
    14  	db          *mongo.Database
    15  	logger      *zap.Logger
    16  	guardianSet *mongo.Collection
    17  }
    18  
    19  // GuardianSetKeyDoc is a key document for GuardianSet.
    20  type GuardianSetKeyDoc struct {
    21  	Index   uint32 `bson:"index" json:"index"`
    22  	Address []byte `bson:"address" json:"address"`
    23  }
    24  
    25  // GuardianSetDoc is a document for GuardianSet.
    26  type GuardianSetDoc struct {
    27  	GuardianSetIndex uint32              `bson:"_id" json:"guardianSetIndex"`
    28  	Keys             []GuardianSetKeyDoc `bson:"keys" json:"keys"`
    29  	ExpirationTime   *time.Time          `bson:"expirationTime" json:"expirationTime"`
    30  	UpdatedAt        time.Time           `bson:"updatedAt"`
    31  }
    32  
    33  // NewGuardianSetRepository create a new guardian set repository.
    34  func NewGuardianSetRepository(db *mongo.Database, logger *zap.Logger) *GuardianSetRepository {
    35  	return &GuardianSetRepository{db: db,
    36  		logger:      logger.With(zap.String("module", "GuardianSetRepository")),
    37  		guardianSet: db.Collection(GuardianSets),
    38  	}
    39  }
    40  
    41  // Upsert upserts a guardian set document.
    42  func (r *GuardianSetRepository) Upsert(ctx context.Context, doc *GuardianSetDoc) error {
    43  	now := time.Now()
    44  	update := bson.M{
    45  		"$set":         doc,
    46  		"$setOnInsert": IndexedAt(now),
    47  		"$inc":         bson.D{{Key: "revision", Value: 1}},
    48  	}
    49  	opts := options.Update().SetUpsert(true)
    50  	_, err := r.guardianSet.UpdateByID(ctx, doc.GuardianSetIndex, update, opts)
    51  	return err
    52  }
    53  
    54  // FindByIndex finds guardian set by index.
    55  func (r *GuardianSetRepository) FindByIndex(ctx context.Context, index uint32) (*GuardianSetDoc, error) {
    56  	var guardianSetDoc GuardianSetDoc
    57  	err := r.guardianSet.FindOne(ctx, bson.M{"_id": index}).Decode(&guardianSetDoc)
    58  	if err != nil {
    59  		if err == mongo.ErrNoDocuments {
    60  			return nil, nil
    61  		}
    62  		return nil, err
    63  	}
    64  	return &guardianSetDoc, err
    65  }
    66  
    67  // FindAll finds all guardian sets.
    68  func (r *GuardianSetRepository) FindAll(ctx context.Context) ([]*GuardianSetDoc, error) {
    69  	cursor, err := r.guardianSet.Find(ctx, bson.M{})
    70  	if err != nil {
    71  		return nil, err
    72  	}
    73  	defer cursor.Close(ctx)
    74  
    75  	var guardianSetDocs []*GuardianSetDoc
    76  	for cursor.Next(ctx) {
    77  		var guardianSetDoc GuardianSetDoc
    78  		if err := cursor.Decode(&guardianSetDoc); err != nil {
    79  			return nil, err
    80  		}
    81  		guardianSetDocs = append(guardianSetDocs, &guardianSetDoc)
    82  	}
    83  	return guardianSetDocs, nil
    84  }