github.com/infraboard/keyauth@v0.8.1/apps/counter/impl/impl.go (about) 1 package impl 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/bson" 8 "go.mongodb.org/mongo-driver/mongo" 9 "go.mongodb.org/mongo-driver/mongo/options" 10 11 "github.com/infraboard/keyauth/apps/counter" 12 "github.com/infraboard/keyauth/conf" 13 "github.com/infraboard/mcube/app" 14 ) 15 16 var ( 17 // Service 服务实例 18 svr = &service{} 19 ) 20 21 type service struct { 22 col *mongo.Collection 23 } 24 25 func (s *service) Config() error { 26 db := conf.C().Mongo.GetDB() 27 dc := db.Collection("counter") 28 29 s.col = dc 30 return nil 31 } 32 33 func (s *service) GetNextSequenceValue(sequenceName string) (*counter.Count, error) { 34 result := s.col.FindOneAndUpdate( 35 context.TODO(), 36 bson.M{"_id": sequenceName}, 37 bson.M{"$inc": bson.M{"value": 1}}, 38 options.FindOneAndUpdate().SetUpsert(true), 39 ) 40 41 count := counter.NewCount() 42 err := result.Decode(count) 43 if err != nil && err != mongo.ErrNoDocuments { 44 return nil, fmt.Errorf("counter decode error, %s", err) 45 } 46 47 count.Value++ 48 return count, nil 49 } 50 51 func (s *service) Name() string { 52 return counter.AppName 53 } 54 55 func init() { 56 app.RegistryInternalApp(svr) 57 }