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 }